From a1699577b202812255e13a799c4f453aa2efe031 Mon Sep 17 00:00:00 2001 From: Release Pipeline Date: Wed, 26 Jul 2023 20:16:49 +0000 Subject: [PATCH] Release 2306.0.0 --- .gitignore | 336 + .gitmodules | 6 + Build/PlayFab.C.GDK.props | 22 + Build/PlayFab.C.Win32.props | 16 + Build/PlayFab.C.paths.props | 35 + .../PlayFabCore.Common.vcxitems | 99 + .../PlayFabCore.Common.vcxitems.filters | 284 + .../PlayFabCore.GDK.142.vcxproj | 15 + .../PlayFabCore.GDK.143.vcxproj | 15 + .../PlayFabCore.GDK/PlayFabCore.GDK.vcxitems | 23 + .../PlayFabCore.GDK.vcxitems.filters | 33 + .../PlayFabCore.ServiceWrappers.vcxitems | 39 + ...ayFabCore.ServiceWrappers.vcxitems.filters | 74 + .../PlayFabCore.Win32.143.vcxproj | 15 + .../PlayFabCore.Win32.vcxitems | 22 + .../PlayFabCore.Win32.vcxitems.filters | 24 + Build/PlayFabCore.import.props | 43 + .../PlayFabServices.Common.vcxitems | 33 + .../PlayFabServices.Common.vcxitems.filters | 60 + .../PlayFabServices.GDK.142.vcxproj | 15 + .../PlayFabServices.GDK.143.vcxproj | 21 + .../PlayFabServices.GDK.vcxitems | 21 + .../PlayFabServices.GDK.vcxitems.filters | 22 + .../PlayFabServices.ServiceWrappers.vcxitems | 161 + ...bServices.ServiceWrappers.vcxitems.filters | 440 + .../PlayFabServices.Win32.143.vcxproj | 14 + Build/PlayFabServices.import.props | 35 + .../PlayFabSharedInternal.GDK.142.vcxproj | 12 + .../PlayFabSharedInternal.GDK.143.vcxproj | 12 + .../PlayFabSharedInternal.GDK.vcxitems | 22 + ...PlayFabSharedInternal.GDK.vcxitems.filters | 27 + .../PlayFabSharedInternal.Win32.143.vcxproj | 12 + Build/PlayFabSharedInternal.import.props | 47 + .../PlayFabSharedInternal.vcxitems | 58 + .../PlayFabSharedInternal.vcxitems.filters | 123 + .../libHttpClient.142.GDK.C.vcxproj | 18 + .../libHttpClient.143.GDK.C.vcxproj | 18 + .../libHttpClient.143.Win32.C.vcxproj | 14 + Build/libHttpClient.import.props | 50 + External/libHttpClient | 1 + External/rapidjson | 1 + External/rapidjson.natvis | 37 + PlayFab.C.vs2022.sln | 254 + README.md | 49 + Source/PlayFabCore/API-List.csv | 41 + .../Generated/playfab/core/PFAuthentication.h | 2611 +++++ .../playfab/core/PFAuthenticationTypes.h | 1558 +++ .../Include/Generated/playfab/core/PFEntity.h | 290 + .../Include/Generated/playfab/core/PFErrors.h | 758 ++ .../Include/Generated/playfab/core/PFEvents.h | 393 + .../Generated/playfab/core/PFEventsTypes.h | 374 + .../Include/Generated/playfab/core/PFTypes.h | 2189 ++++ .../core/cpp/AuthenticationTypeWrappers.h | 3708 +++++++ .../playfab/core/cpp/EventsTypeWrappers.h | 1032 ++ .../Generated/playfab/core/cpp/TypeWrappers.h | 4015 ++++++++ .../PlayFabCore/Include/playfab/core/PFCore.h | 45 + .../Include/playfab/core/PFEventPipeline.h | 293 + .../Include/playfab/core/PFHttpConfig.h | 54 + .../PlayFabCore/Include/playfab/core/PFPal.h | 45 + .../Include/playfab/core/PFPlatform.h | 205 + .../Include/playfab/core/PFServiceConfig.h | 106 + .../Include/playfab/core/PFTrace.h | 19 + .../Include/playfab/core/cpp/Entity.h | 140 + .../Include/playfab/core/cpp/EventPipeline.h | 148 + .../playfab/core/cpp/PlayFabException.h | 28 + .../Include/playfab/core/cpp/ServiceConfig.h | 106 + .../playfab/core/cpp/TypeWrapperHelpers.h | 671 ++ .../Include/playfab/httpClient/PFHCConfig.h | 127 + .../Include/playfab/httpClient/PFHCPal.h | 480 + .../Include/playfab/httpClient/PFHCTrace.h | 421 + .../Include/playfab/httpClient/PFHttpClient.h | 1099 ++ .../playfab/httpClient/PFHttpProvider.h | 248 + .../Include/playfab/httpClient/PFMock.h | 76 + .../Source/Api/PFAuthentication.cpp | 1926 ++++ Source/PlayFabCore/Source/Api/PFCore.cpp | 32 + Source/PlayFabCore/Source/Api/PFEntity.cpp | 279 + .../Source/Api/PFEventPipeline.cpp | 260 + Source/PlayFabCore/Source/Api/PFEvents.cpp | 105 + .../PlayFabCore/Source/Api/PFHttpConfig.cpp | 29 + Source/PlayFabCore/Source/Api/PFPlatform.cpp | 60 + .../Source/Api/PFServiceConfig.cpp | 128 + Source/PlayFabCore/Source/Api/PFTrace.cpp | 21 + .../Authentication/CombinedLoginResult.cpp | 112 + .../Authentication/CombinedLoginResult.h | 88 + .../Authentication/GDK/Authentication_GDK.cpp | 140 + .../Authentication/GetEntityAsyncProvider.h | 66 + .../Source/Authentication/LoginContext.cpp | 55 + .../Source/Authentication/LoginContext.h | 34 + .../PlayFabCore/Source/Common/ApiHelpers.cpp | 31 + Source/PlayFabCore/Source/Common/ApiHelpers.h | 119 + Source/PlayFabCore/Source/Common/Entity.cpp | 456 + Source/PlayFabCore/Source/Common/Entity.h | 85 + .../PlayFabCore/Source/Common/EntityToken.cpp | 95 + .../PlayFabCore/Source/Common/EntityToken.h | 31 + .../PlayFabCore/Source/Common/GlobalState.cpp | 312 + .../PlayFabCore/Source/Common/GlobalState.h | 54 + .../PlayFabCore/Source/Common/HandleTable.h | 91 + .../PlayFabCore/Source/Common/HttpClient.cpp | 116 + Source/PlayFabCore/Source/Common/HttpClient.h | 72 + .../Source/Common/ServiceConfig.cpp | 28 + .../PlayFabCore/Source/Common/ServiceConfig.h | 24 + .../Source/Common/TokenExpiredHandler.cpp | 156 + .../Source/Common/TokenExpiredHandler.h | 35 + .../Source/Common/TokenRefreshedHandler.cpp | 157 + .../Source/Common/TokenRefreshedHandler.h | 36 + .../Source/EventPipeline/EventPipeline.cpp | 651 ++ .../Source/EventPipeline/EventPipeline.h | 61 + .../EventPipeline/EventPipelineTypes.cpp | 384 + .../Source/EventPipeline/EventPipelineTypes.h | 107 + .../Source/Generated/Authentication.cpp | 1958 ++++ .../Source/Generated/Authentication.h | 82 + .../Source/Generated/AuthenticationTypes.cpp | 1027 ++ .../Source/Generated/AuthenticationTypes.h | 630 ++ Source/PlayFabCore/Source/Generated/CacheId.h | 59 + .../PlayFabCore/Source/Generated/Events.cpp | 264 + Source/PlayFabCore/Source/Generated/Events.h | 31 + .../Source/Generated/EventsTypes.cpp | 415 + .../Source/Generated/EventsTypes.h | 245 + .../Source/Generated/PFAuthentication.cpp | 1926 ++++ .../PlayFabCore/Source/Generated/PFEvents.cpp | 339 + Source/PlayFabCore/Source/Generated/Types.cpp | 3549 +++++++ Source/PlayFabCore/Source/Generated/Types.h | 880 ++ .../Source/HttpClient/LHCExport.def | 140 + .../Source/HttpClient/PFHCTrace.cpp | 77 + .../Source/HttpClient/PFHttpClient.cpp | 637 ++ .../Source/HttpClient/PFHttpProvider.cpp | 405 + .../PlayFabCore/Source/HttpClient/PFMock.cpp | 110 + .../Source/Platform/LocalStorage.cpp | 212 + .../Source/Platform/LocalStorage.h | 30 + .../Source/Platform/LocalStorageHandlers.cpp | 218 + .../Source/Platform/LocalStorageHandlers.h | 29 + .../PlayFabCore/Source/Platform/Platform.cpp | 59 + Source/PlayFabCore/Source/Platform/Platform.h | 15 + .../Source/Trace/DebugTraceOutput.cpp | 18 + .../Source/Trace/DebugTraceOutput.h | 14 + .../Source/Trace/LocalStorageTraceOutput.cpp | 36 + .../Source/Trace/LocalStorageTraceOutput.h | 25 + .../PlayFabCore/Source/Trace/TraceState.cpp | 344 + Source/PlayFabCore/Source/Trace/TraceState.h | 66 + .../Source/Trace/Windows/ETWTraceOutput.cpp | 47 + .../Source/Trace/Windows/ETWTraceOutput.h | 16 + Source/PlayFabCore/Source/stdafx.cpp | 1 + Source/PlayFabCore/Source/stdafx.h | 37 + Source/PlayFabServices/API-List.csv | 587 ++ .../playfab/services/PFAccountManagement.h | 3375 +++++++ .../services/PFAccountManagementTypes.h | 2917 ++++++ .../Generated/playfab/services/PFCatalog.h | 1173 +++ .../playfab/services/PFCatalogTypes.h | 2252 +++++ .../Generated/playfab/services/PFCharacter.h | 758 ++ .../playfab/services/PFCharacterTypes.h | 422 + .../playfab/services/PFCloudScript.h | 83 + .../playfab/services/PFCloudScriptTypes.h | 121 + .../Generated/playfab/services/PFData.h | 437 + .../Generated/playfab/services/PFDataTypes.h | 586 ++ .../playfab/services/PFExperimentation.h | 76 + .../playfab/services/PFExperimentationTypes.h | 59 + .../Generated/playfab/services/PFFriends.h | 296 + .../playfab/services/PFFriendsTypes.h | 365 + .../Generated/playfab/services/PFGroups.h | 1104 ++ .../playfab/services/PFGroupsTypes.h | 1366 +++ .../Generated/playfab/services/PFInventory.h | 1063 ++ .../playfab/services/PFInventoryTypes.h | 1915 ++++ .../playfab/services/PFLocalization.h | 73 + .../playfab/services/PFLocalizationTypes.h | 57 + .../playfab/services/PFMultiplayerServer.h | 277 + .../services/PFMultiplayerServerTypes.h | 784 ++ .../playfab/services/PFPlatformSpecific.h | 144 + .../services/PFPlatformSpecificTypes.h | 153 + .../playfab/services/PFPlayerDataManagement.h | 949 ++ .../services/PFPlayerDataManagementTypes.h | 278 + .../Generated/playfab/services/PFProfiles.h | 313 + .../playfab/services/PFProfilesTypes.h | 535 + .../playfab/services/PFPushNotifications.h | 62 + .../services/PFPushNotificationsTypes.h | 174 + .../Generated/playfab/services/PFSegments.h | 430 + .../playfab/services/PFSegmentsTypes.h | 637 ++ .../Generated/playfab/services/PFServices.h | 62 + .../playfab/services/PFTitleDataManagement.h | 592 ++ .../services/PFTitleDataManagementTypes.h | 223 + .../Generated/playfab/services/PFTypes.h | 37 + .../cpp/AccountManagementTypeWrappers.h | 8914 +++++++++++++++++ .../services/cpp/CatalogTypeWrappers.h | 6047 +++++++++++ .../services/cpp/CharacterTypeWrappers.h | 1030 ++ .../services/cpp/CloudScriptTypeWrappers.h | 295 + .../playfab/services/cpp/DataTypeWrappers.h | 1538 +++ .../cpp/ExperimentationTypeWrappers.h | 150 + .../services/cpp/FriendsTypeWrappers.h | 950 ++ .../playfab/services/cpp/GroupsTypeWrappers.h | 3677 +++++++ .../services/cpp/InventoryTypeWrappers.h | 5113 ++++++++++ .../services/cpp/LocalizationTypeWrappers.h | 141 + .../cpp/MultiplayerServerTypeWrappers.h | 1778 ++++ .../cpp/PlatformSpecificTypeWrappers.h | 456 + .../cpp/PlayerDataManagementTypeWrappers.h | 549 + .../services/cpp/ProfilesTypeWrappers.h | 1288 +++ .../cpp/PushNotificationsTypeWrappers.h | 403 + .../services/cpp/SegmentsTypeWrappers.h | 1560 +++ .../cpp/TitleDataManagementTypeWrappers.h | 637 ++ .../playfab/services/cpp/TypeWrappers.h | 19 + .../PlayFabServices/Source/Api/PFServices.cpp | 22 + .../Source/Common/GlobalState.cpp | 233 + .../Source/Common/GlobalState.h | 34 + .../Source/Common/HttpClient.cpp | 169 + .../Source/Common/HttpClient.h | 45 + .../Source/Common/Platform.cpp | 43 + .../PlayFabServices/Source/Common/Platform.h | 9 + .../GDK/AccountManagementXTokenAPIs.cpp | 53 + .../Source/GDK/FriendsXTokenAPIs.cpp | 75 + .../Source/GDK/InventoryXTokenAPIs.cpp | 55 + .../Source/Generated/AccountManagement.cpp | 3089 ++++++ .../Source/Generated/AccountManagement.h | 117 + .../Generated/AccountManagementTypes.cpp | 3004 ++++++ .../Source/Generated/AccountManagementTypes.h | 1937 ++++ .../Source/Generated/CacheId.h | 265 + .../Source/Generated/Catalog.cpp | 902 ++ .../Source/Generated/Catalog.h | 52 + .../Source/Generated/CatalogTypes.cpp | 3695 +++++++ .../Source/Generated/CatalogTypes.h | 1295 +++ .../Source/Generated/Character.cpp | 500 + .../Source/Generated/Character.h | 40 + .../Source/Generated/CharacterTypes.cpp | 410 + .../Source/Generated/CharacterTypes.h | 227 + .../Source/Generated/CloudScript.cpp | 47 + .../Source/Generated/CloudScript.h | 27 + .../Source/Generated/CloudScriptTypes.cpp | 178 + .../Source/Generated/CloudScriptTypes.h | 67 + .../Source/Generated/CoreTypes.cpp | 3360 +++++++ .../Source/Generated/CoreTypes.h | 842 ++ .../PlayFabServices/Source/Generated/Data.cpp | 257 + .../PlayFabServices/Source/Generated/Data.h | 33 + .../Source/Generated/DataTypes.cpp | 756 ++ .../Source/Generated/DataTypes.h | 338 + .../Source/Generated/Experimentation.cpp | 47 + .../Source/Generated/Experimentation.h | 27 + .../Source/Generated/ExperimentationTypes.cpp | 68 + .../Source/Generated/ExperimentationTypes.h | 48 + .../Source/Generated/Friends.cpp | 284 + .../Source/Generated/Friends.h | 34 + .../Source/Generated/FriendsTypes.cpp | 375 + .../Source/Generated/FriendsTypes.h | 184 + .../Source/Generated/Groups.cpp | 865 ++ .../PlayFabServices/Source/Generated/Groups.h | 51 + .../Source/Generated/GroupsTypes.cpp | 1628 +++ .../Source/Generated/GroupsTypes.h | 764 ++ .../Source/Generated/Inventory.cpp | 642 ++ .../Source/Generated/Inventory.h | 44 + .../Source/Generated/InventoryTypes.cpp | 2312 +++++ .../Source/Generated/InventoryTypes.h | 913 ++ .../Source/Generated/Localization.cpp | 47 + .../Source/Generated/Localization.h | 27 + .../Source/Generated/LocalizationTypes.cpp | 65 + .../Source/Generated/LocalizationTypes.h | 48 + .../Source/Generated/MultiplayerServer.cpp | 152 + .../Source/Generated/MultiplayerServer.h | 30 + .../Generated/MultiplayerServerTypes.cpp | 1193 +++ .../Source/Generated/MultiplayerServerTypes.h | 408 + .../Source/Generated/PFAccountManagement.cpp | 2842 ++++++ .../Source/Generated/PFCatalog.cpp | 926 ++ .../Source/Generated/PFCharacter.cpp | 566 ++ .../Source/Generated/PFCloudScript.cpp | 54 + .../Source/Generated/PFData.cpp | 318 + .../Source/Generated/PFExperimentation.cpp | 54 + .../Source/Generated/PFFriends.cpp | 234 + .../Source/Generated/PFGroups.cpp | 830 ++ .../Source/Generated/PFInventory.cpp | 794 ++ .../Source/Generated/PFLocalization.cpp | 56 + .../Source/Generated/PFMultiplayerServer.cpp | 186 + .../Source/Generated/PFPlatformSpecific.cpp | 122 + .../Generated/PFPlayerDataManagement.cpp | 698 ++ .../Source/Generated/PFProfiles.cpp | 230 + .../Source/Generated/PFPushNotifications.cpp | 54 + .../Source/Generated/PFSegments.cpp | 322 + .../Generated/PFTitleDataManagement.cpp | 446 + .../Source/Generated/PlatformSpecific.cpp | 146 + .../Source/Generated/PlatformSpecific.h | 30 + .../Generated/PlatformSpecificTypes.cpp | 176 + .../Source/Generated/PlatformSpecificTypes.h | 112 + .../Source/Generated/PlayerDataManagement.cpp | 642 ++ .../Source/Generated/PlayerDataManagement.h | 44 + .../Generated/PlayerDataManagementTypes.cpp | 203 + .../Generated/PlayerDataManagementTypes.h | 128 + .../Source/Generated/Profiles.cpp | 187 + .../Source/Generated/Profiles.h | 31 + .../Source/Generated/ProfilesTypes.cpp | 806 ++ .../Source/Generated/ProfilesTypes.h | 281 + .../Source/Generated/PushNotifications.cpp | 78 + .../Source/Generated/PushNotifications.h | 28 + .../Generated/PushNotificationsTypes.cpp | 75 + .../Source/Generated/PushNotificationsTypes.h | 71 + .../Source/Generated/Segments.cpp | 286 + .../Source/Generated/Segments.h | 34 + .../Source/Generated/SegmentsTypes.cpp | 1047 ++ .../Source/Generated/SegmentsTypes.h | 314 + .../Source/Generated/TitleDataManagement.cpp | 424 + .../Source/Generated/TitleDataManagement.h | 38 + .../Generated/TitleDataManagementTypes.cpp | 298 + .../Generated/TitleDataManagementTypes.h | 180 + .../Source/Generated/Types.cpp | 9 + .../PlayFabServices/Source/Generated/Types.h | 15 + Source/PlayFabServices/Source/stdafx.cpp | 1 + Source/PlayFabServices/Source/stdafx.h | 41 + .../Include/ApiXAsyncProvider.h | 107 + .../PlayFabSharedInternal/Include/AsyncOp.h | 407 + .../PlayFabSharedInternal/Include/BaseModel.h | 55 + .../Include/CancellationToken.h | 46 + .../Include/EnumTraits.h | 199 + .../Include/GDK/PlatformUser_GDK.h | 54 + .../Include/Generated/Error.h | 751 ++ .../Include/HttpRequest.h | 117 + .../PlayFabSharedInternal/Include/JsonUtils.h | 487 + Source/PlayFabSharedInternal/Include/Memory.h | 162 + .../Include/ModelBuffer.h | 221 + .../Include/PlatformUser.h | 19 + .../Include/PlatformUtils.h | 136 + .../PlayFabSharedInternal/Include/RapidJson.h | 19 + Source/PlayFabSharedInternal/Include/Result.h | 146 + .../Include/ResultMacros.h | 25 + .../Include/RunContext.h | 141 + .../Include/SdkVersion.h | 8 + Source/PlayFabSharedInternal/Include/Trace.h | 22 + Source/PlayFabSharedInternal/Include/Types.h | 61 + .../Include/XAsyncOperation.h | 166 + .../Include/XAsyncProviderBase.h | 91 + .../Source/CancellationToken.cpp | 194 + .../Source/GDK/PlatformUser_GDK.cpp | 194 + .../Source/Generated/Error.cpp | 893 ++ .../Source/HttpRequest.cpp | 242 + .../Source/JsonUtils.cpp | 488 + .../PlayFabSharedInternal/Source/Memory.cpp | 96 + .../Source/ModelBuffer.cpp | 100 + .../Source/RunContext.cpp | 542 + Source/PlayFabSharedInternal/Source/Trace.cpp | 4 + .../Source/XAsyncOperation.cpp | 64 + .../Source/XAsyncProviderBase.cpp | 149 + Source/PlayFabSharedInternal/Source/pch.cpp | 1 + Source/PlayFabSharedInternal/Source/pch.h | 29 + Test/PlayFabCore.UnitTests/Mocks/HttpMock.cpp | 106 + Test/PlayFabCore.UnitTests/Mocks/HttpMock.h | 54 + .../Mocks/MockResponses.json | 69 + .../Mocks/PlayFabServiceMock.cpp | 108 + .../Mocks/PlayFabServiceMock.h | 69 + .../PlayFabCore.UnitTests.vcxproj | 52 + .../PlayFabCore.UnitTests.vcxproj.filters | 83 + .../Support/AsyncTestContext.cpp | 57 + .../Support/AsyncTestContext.h | 40 + Test/PlayFabCore.UnitTests/Support/Event.cpp | 34 + Test/PlayFabCore.UnitTests/Support/Event.h | 28 + .../Support/TaskQueue.cpp | 54 + .../PlayFabCore.UnitTests/Support/TaskQueue.h | 29 + .../Support/TestIncludes.h | 17 + .../Support/TestMacros.h | 4 + .../Support/TestSession.h | 38 + .../Tests/AsyncOpTests.cpp | 98 + .../Tests/CancellationTokenTests.cpp | 128 + .../Tests/EventPipelineTests.cpp | 143 + .../Tests/GlobalStateTests.cpp | 89 + .../Tests/RunContextTests.cpp | 419 + .../Tests/TokenRefreshTests.cpp | 193 + .../AccountManagementOperations.cpp | 2225 ++++ .../AccountManagementOperations.h | 1704 ++++ .../CatalogOperations.cpp | 661 ++ .../CatalogOperations.h | 472 + .../CharacterOperations.cpp | 410 + .../CharacterOperations.h | 290 + .../CloudScriptOperations.cpp | 39 + .../CloudScriptOperations.h | 30 + .../DataOperations.cpp | 207 + .../DataOperations.h | 138 + .../ExperimentationOperations.cpp | 39 + .../ExperimentationOperations.h | 30 + .../FriendsOperations.cpp | 195 + .../FriendsOperations.h | 154 + .../GroupsOperations.cpp | 609 ++ .../GroupsOperations.h | 440 + .../InventoryOperations.cpp | 522 + .../InventoryOperations.h | 350 + .../LocalizationOperations.cpp | 41 + .../LocalizationOperations.h | 32 + .../MultiplayerServerOperations.cpp | 123 + .../MultiplayerServerOperations.h | 84 + .../PlatformSpecificOperations.cpp | 104 + .../PlatformSpecificOperations.h | 86 + ...yFabServices.GeneratedApiWrappers.vcxitems | 52 + ...ices.GeneratedApiWrappers.vcxitems.filters | 113 + .../PlayerDataManagementOperations.cpp | 515 + .../PlayerDataManagementOperations.h | 360 + .../ProfilesOperations.cpp | 151 + .../ProfilesOperations.h | 102 + .../PushNotificationsOperations.cpp | 53 + .../PushNotificationsOperations.h | 48 + .../SegmentsOperations.cpp | 227 + .../SegmentsOperations.h | 160 + .../TitleDataManagementOperations.cpp | 328 + .../TitleDataManagementOperations.h | 234 + .../AccountManagementTests.cpp | 270 + .../AccountManagementTests.h | 284 + .../AccountManagementTestsImpl.stubs | 641 ++ .../CatalogTests.cpp | 53 + .../CatalogTests.h | 67 + .../CatalogTestsImpl.stubs | 164 + .../CharacterTests.cpp | 57 + .../CharacterTests.h | 71 + .../CharacterTestsImpl.stubs | 120 + .../CloudScriptTests.cpp | 16 + .../CloudScriptTests.h | 30 + .../CloudScriptTestsImpl.stubs | 27 + .../DataTests.cpp | 22 + .../DataTests.h | 36 + .../DataTestsImpl.stubs | 57 + .../ExperimentationTests.cpp | 16 + .../ExperimentationTests.h | 30 + .../ExperimentationTestsImpl.stubs | 27 + .../FriendsTests.cpp | 31 + .../FriendsTests.h | 45 + .../FriendsTestsImpl.stubs | 70 + .../GroupsTests.cpp | 40 + .../GroupsTests.h | 54 + .../GroupsTestsImpl.stubs | 147 + .../InventoryTests.cpp | 49 + .../InventoryTests.h | 63 + .../InventoryTestsImpl.stubs | 128 + .../LocalizationTests.cpp | 18 + .../LocalizationTests.h | 32 + .../LocalizationTestsImpl.stubs | 29 + .../MultiplayerServerTests.cpp | 19 + .../MultiplayerServerTests.h | 33 + .../MultiplayerServerTestsImpl.stubs | 42 + .../PlatformSpecificTests.cpp | 27 + .../PlatformSpecificTests.h | 41 + .../PlatformSpecificTestsImpl.stubs | 50 + .../PlayFabServices.GeneratedTests.vcxitems | 69 + ...abServices.GeneratedTests.vcxitems.filters | 165 + .../PlayerDataManagementTests.cpp | 57 + .../PlayerDataManagementTests.h | 71 + .../PlayerDataManagementTestsImpl.stubs | 136 + .../ProfilesTests.cpp | 20 + .../ProfilesTests.h | 34 + .../ProfilesTestsImpl.stubs | 47 + .../PushNotificationsTests.cpp | 21 + .../PushNotificationsTests.h | 35 + .../PushNotificationsTestsImpl.stubs | 36 + .../SegmentsTests.cpp | 35 + .../SegmentsTests.h | 49 + .../SegmentsTestsImpl.stubs | 74 + .../TitleDataManagementTests.cpp | 43 + .../TitleDataManagementTests.h | 57 + .../TitleDataManagementTestsImpl.stubs | 98 + .../GDK/Assets/ATGConsoleBlack.DDS | Bin 0 -> 8294528 bytes .../GDK/Assets/ATGSampleBackground.DDS | Bin 0 -> 8294528 bytes .../GDK/Assets/Logo.png | Bin 0 -> 54843 bytes .../GDK/Assets/Mounted.png | Bin 0 -> 3551 bytes .../GDK/Assets/Owned.png | Bin 0 -> 1269 bytes .../GDK/Assets/SmallLogo.png | Bin 0 -> 30312 bytes .../GDK/Assets/SplashScreen.png | Bin 0 -> 1226359 bytes .../GDK/Assets/StoreLogo.png | Bin 0 -> 19335 bytes .../GDK/Assets/Unmounted.png | Bin 0 -> 4471 bytes .../GDK/DeviceResourcesPC.cpp | 782 ++ .../GDK/DeviceResourcesPC.h | 140 + .../GDK/DeviceResourcesXbox.cpp | 469 + .../GDK/DeviceResourcesXbox.h | 126 + .../PlayFabServicesManualTestApp/GDK/GDKPch.h | 103 + .../GDK/GamePC.cpp | 247 + .../PlayFabServicesManualTestApp/GDK/GamePC.h | 70 + .../GDK/GameXbox.cpp | 176 + .../GDK/GameXbox.h | 67 + .../GDK/Keyboard.cpp | 664 ++ .../GDK/Keyboard.h | 504 + .../GDK/MainPC.cpp | 310 + .../GDK/MainXbox.cpp | 225 + .../GDK/StepTimer.h | 226 + .../PlayFabServicesManualTestApp/GDK/d3dx12.h | 4925 +++++++++ .../PlayFabServicesManualTestApp.Gdk.vcxproj | 481 + ...bServicesManualTestApp.Gdk.vcxproj.filters | 109 + ...bServicesManualTestAppViaGDKBinary.Gdk.sln | 52 + ...vicesManualTestAppViaGDKBinary.Gdk.vcxproj | 477 + ...ualTestAppViaGDKBinary.Gdk.vcxproj.filters | 121 + .../TestAppPch.cpp | 3 + .../PlayFabServicesManualTestApp/TestAppPch.h | 36 + .../TestFramework/HttpMock.cpp | 101 + .../TestFramework/HttpMock.h | 53 + .../TestFramework/TestRunner.cpp | 1110 ++ .../TestFramework/TestRunner.h | 85 + .../GDK/Assets/ATGConsoleBlack.DDS | Bin 0 -> 8294528 bytes .../GDK/Assets/ATGSampleBackground.DDS | Bin 0 -> 8294528 bytes .../GDK/Assets/Logo.png | Bin 0 -> 54843 bytes .../GDK/Assets/Mounted.png | Bin 0 -> 3551 bytes .../GDK/Assets/Owned.png | Bin 0 -> 1269 bytes .../GDK/Assets/SmallLogo.png | Bin 0 -> 30312 bytes .../GDK/Assets/SplashScreen.png | Bin 0 -> 1226359 bytes .../GDK/Assets/StoreLogo.png | Bin 0 -> 19335 bytes .../GDK/Assets/Unmounted.png | Bin 0 -> 4471 bytes .../GDK/DeviceResourcesPC.cpp | 782 ++ .../GDK/DeviceResourcesPC.h | 140 + .../GDK/DeviceResourcesXbox.cpp | 469 + .../GDK/DeviceResourcesXbox.h | 126 + Test/PlayFabServicesTestApp/GDK/GDKPch.h | 103 + Test/PlayFabServicesTestApp/GDK/GamePC.cpp | 230 + Test/PlayFabServicesTestApp/GDK/GamePC.h | 68 + Test/PlayFabServicesTestApp/GDK/GameXbox.cpp | 160 + Test/PlayFabServicesTestApp/GDK/GameXbox.h | 62 + Test/PlayFabServicesTestApp/GDK/Keyboard.cpp | 664 ++ Test/PlayFabServicesTestApp/GDK/Keyboard.h | 504 + Test/PlayFabServicesTestApp/GDK/MainPC.cpp | 310 + Test/PlayFabServicesTestApp/GDK/MainXbox.cpp | 225 + .../GDK/MicrosoftGame.Config | 34 + .../GDK/PlayFabServicesTestApp.GDK.vcxproj | 54 + ...PlayFabServicesTestApp.GDK.vcxproj.filters | 101 + Test/PlayFabServicesTestApp/GDK/StepTimer.h | 226 + Test/PlayFabServicesTestApp/GDK/d3dx12.h | 4925 +++++++++ .../Generated/GeneratedTestsBootstrapper.h | 58 + .../Core/AuthenticationOperations.cpp | 182 + .../Core/AuthenticationOperations.h | 116 + .../Operations/Core/CoreOperations.cpp | 15 + .../Operations/Core/CoreOperations.h | 18 + .../Services/ServicesOperations.cpp | 15 + .../Operations/Services/ServicesOperations.h | 18 + .../Platform/GDK/PlayFabGDK.cpp | 101 + .../Platform/Generic/MemoryManager.cpp | 70 + .../Platform/Generic/MemoryManager.h | 37 + .../Platform/PlatformUtils.h | 31 + .../Platform/PlayFabPal.h | 35 + .../Platform/Win32/PlayFabWin32.cpp | 61 + .../Platform/Windows/PlatfromUtilsWindows.cpp | 159 + .../PlayFabServicesTestApp.Common.vcxitems | 71 + ...FabServicesTestApp.Common.vcxitems.filters | 186 + Test/PlayFabServicesTestApp/TestAppPch.cpp | 3 + Test/PlayFabServicesTestApp/TestAppPch.h | 52 + .../TestFramework/CoreTestClass.cpp | 53 + .../TestFramework/CoreTestClass.h | 41 + .../TestFramework/ServicesTestClass.cpp | 134 + .../TestFramework/ServicesTestClass.h | 51 + .../TestFramework/TestClass.cpp | 19 + .../TestFramework/TestClass.h | 77 + .../TestFramework/TestContext.cpp | 161 + .../TestFramework/TestContext.h | 150 + .../TestFramework/TestException.h | 24 + .../TestFramework/TestReport.cpp | 70 + .../TestFramework/TestReport.h | 62 + .../TestFramework/TestRunner.cpp | 306 + .../TestFramework/TestRunner.h | 62 + .../TestFramework/TestTypes.h | 37 + .../Tests/Core/AuthenticationTests.cpp | 110 + .../Tests/Core/AuthenticationTests.h | 32 + .../Tests/Core/EventPipelineTests.cpp | 1600 +++ .../Tests/Core/EventPipelineTests.h | 51 + .../Services/AccountManagementTestsImpl.cpp | 866 ++ .../Tests/Services/CatalogTestsImpl.cpp | 638 ++ .../Tests/Services/CharacterTestsImpl.cpp | 120 + .../Tests/Services/CloudScriptTestsImpl.cpp | 41 + .../Tests/Services/DataTestsImpl.cpp | 254 + .../Services/ExperimentationTestsImpl.cpp | 42 + .../Tests/Services/FriendsTestsImpl.cpp | 174 + .../Tests/Services/GroupsTestsImpl.cpp | 577 ++ .../Tests/Services/InventoryTestsImpl.cpp | 677 ++ .../Tests/Services/LocalizationTestsImpl.cpp | 29 + .../Services/MultiplayerServerTestsImpl.cpp | 351 + .../Services/PlatformSpecificTestsImpl.cpp | 50 + .../PlayerDataManagementTestsImpl.cpp | 312 + .../Tests/Services/ProfilesTestsImpl.cpp | 226 + .../Services/PushNotificationsTestsImpl.cpp | 36 + .../Tests/Services/SegmentsTestsImpl.cpp | 114 + .../Services/TitleDataManagementTestsImpl.cpp | 273 + .../Win32/MainWin32.cpp | 21 + .../PlayFabServicesTestApp.Win32.vcxproj | 30 + ...ayFabServicesTestApp.Win32.vcxproj.filters | 32 + 564 files changed, 204109 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Build/PlayFab.C.GDK.props create mode 100644 Build/PlayFab.C.Win32.props create mode 100644 Build/PlayFab.C.paths.props create mode 100644 Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems create mode 100644 Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems.filters create mode 100644 Build/PlayFabCore.GDK.142/PlayFabCore.GDK.142.vcxproj create mode 100644 Build/PlayFabCore.GDK.143/PlayFabCore.GDK.143.vcxproj create mode 100644 Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems create mode 100644 Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems.filters create mode 100644 Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems create mode 100644 Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems.filters create mode 100644 Build/PlayFabCore.Win32.143/PlayFabCore.Win32.143.vcxproj create mode 100644 Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems create mode 100644 Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems.filters create mode 100644 Build/PlayFabCore.import.props create mode 100644 Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems create mode 100644 Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems.filters create mode 100644 Build/PlayFabServices.GDK.142/PlayFabServices.GDK.142.vcxproj create mode 100644 Build/PlayFabServices.GDK.143/PlayFabServices.GDK.143.vcxproj create mode 100644 Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems create mode 100644 Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems.filters create mode 100644 Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems create mode 100644 Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems.filters create mode 100644 Build/PlayFabServices.Win32.143/PlayFabServices.Win32.143.vcxproj create mode 100644 Build/PlayFabServices.import.props create mode 100644 Build/PlayFabSharedInternal.GDK.142/PlayFabSharedInternal.GDK.142.vcxproj create mode 100644 Build/PlayFabSharedInternal.GDK.143/PlayFabSharedInternal.GDK.143.vcxproj create mode 100644 Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems create mode 100644 Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems.filters create mode 100644 Build/PlayFabSharedInternal.Win32.143/PlayFabSharedInternal.Win32.143.vcxproj create mode 100644 Build/PlayFabSharedInternal.import.props create mode 100644 Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems create mode 100644 Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems.filters create mode 100644 Build/libHttpClient.142.GDK.C/libHttpClient.142.GDK.C.vcxproj create mode 100644 Build/libHttpClient.143.GDK.C/libHttpClient.143.GDK.C.vcxproj create mode 100644 Build/libHttpClient.143.Win32.C/libHttpClient.143.Win32.C.vcxproj create mode 100644 Build/libHttpClient.import.props create mode 160000 External/libHttpClient create mode 160000 External/rapidjson create mode 100644 External/rapidjson.natvis create mode 100644 PlayFab.C.vs2022.sln create mode 100644 README.md create mode 100644 Source/PlayFabCore/API-List.csv create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/PFAuthentication.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/PFAuthenticationTypes.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/PFEntity.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/PFErrors.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/PFEvents.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/PFEventsTypes.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/PFTypes.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/cpp/AuthenticationTypeWrappers.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/cpp/EventsTypeWrappers.h create mode 100644 Source/PlayFabCore/Include/Generated/playfab/core/cpp/TypeWrappers.h create mode 100644 Source/PlayFabCore/Include/playfab/core/PFCore.h create mode 100644 Source/PlayFabCore/Include/playfab/core/PFEventPipeline.h create mode 100644 Source/PlayFabCore/Include/playfab/core/PFHttpConfig.h create mode 100644 Source/PlayFabCore/Include/playfab/core/PFPal.h create mode 100644 Source/PlayFabCore/Include/playfab/core/PFPlatform.h create mode 100644 Source/PlayFabCore/Include/playfab/core/PFServiceConfig.h create mode 100644 Source/PlayFabCore/Include/playfab/core/PFTrace.h create mode 100644 Source/PlayFabCore/Include/playfab/core/cpp/Entity.h create mode 100644 Source/PlayFabCore/Include/playfab/core/cpp/EventPipeline.h create mode 100644 Source/PlayFabCore/Include/playfab/core/cpp/PlayFabException.h create mode 100644 Source/PlayFabCore/Include/playfab/core/cpp/ServiceConfig.h create mode 100644 Source/PlayFabCore/Include/playfab/core/cpp/TypeWrapperHelpers.h create mode 100644 Source/PlayFabCore/Include/playfab/httpClient/PFHCConfig.h create mode 100644 Source/PlayFabCore/Include/playfab/httpClient/PFHCPal.h create mode 100644 Source/PlayFabCore/Include/playfab/httpClient/PFHCTrace.h create mode 100644 Source/PlayFabCore/Include/playfab/httpClient/PFHttpClient.h create mode 100644 Source/PlayFabCore/Include/playfab/httpClient/PFHttpProvider.h create mode 100644 Source/PlayFabCore/Include/playfab/httpClient/PFMock.h create mode 100644 Source/PlayFabCore/Source/Api/PFAuthentication.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFCore.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFEntity.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFEventPipeline.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFEvents.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFHttpConfig.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFPlatform.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFServiceConfig.cpp create mode 100644 Source/PlayFabCore/Source/Api/PFTrace.cpp create mode 100644 Source/PlayFabCore/Source/Authentication/CombinedLoginResult.cpp create mode 100644 Source/PlayFabCore/Source/Authentication/CombinedLoginResult.h create mode 100644 Source/PlayFabCore/Source/Authentication/GDK/Authentication_GDK.cpp create mode 100644 Source/PlayFabCore/Source/Authentication/GetEntityAsyncProvider.h create mode 100644 Source/PlayFabCore/Source/Authentication/LoginContext.cpp create mode 100644 Source/PlayFabCore/Source/Authentication/LoginContext.h create mode 100644 Source/PlayFabCore/Source/Common/ApiHelpers.cpp create mode 100644 Source/PlayFabCore/Source/Common/ApiHelpers.h create mode 100644 Source/PlayFabCore/Source/Common/Entity.cpp create mode 100644 Source/PlayFabCore/Source/Common/Entity.h create mode 100644 Source/PlayFabCore/Source/Common/EntityToken.cpp create mode 100644 Source/PlayFabCore/Source/Common/EntityToken.h create mode 100644 Source/PlayFabCore/Source/Common/GlobalState.cpp create mode 100644 Source/PlayFabCore/Source/Common/GlobalState.h create mode 100644 Source/PlayFabCore/Source/Common/HandleTable.h create mode 100644 Source/PlayFabCore/Source/Common/HttpClient.cpp create mode 100644 Source/PlayFabCore/Source/Common/HttpClient.h create mode 100644 Source/PlayFabCore/Source/Common/ServiceConfig.cpp create mode 100644 Source/PlayFabCore/Source/Common/ServiceConfig.h create mode 100644 Source/PlayFabCore/Source/Common/TokenExpiredHandler.cpp create mode 100644 Source/PlayFabCore/Source/Common/TokenExpiredHandler.h create mode 100644 Source/PlayFabCore/Source/Common/TokenRefreshedHandler.cpp create mode 100644 Source/PlayFabCore/Source/Common/TokenRefreshedHandler.h create mode 100644 Source/PlayFabCore/Source/EventPipeline/EventPipeline.cpp create mode 100644 Source/PlayFabCore/Source/EventPipeline/EventPipeline.h create mode 100644 Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.cpp create mode 100644 Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.h create mode 100644 Source/PlayFabCore/Source/Generated/Authentication.cpp create mode 100644 Source/PlayFabCore/Source/Generated/Authentication.h create mode 100644 Source/PlayFabCore/Source/Generated/AuthenticationTypes.cpp create mode 100644 Source/PlayFabCore/Source/Generated/AuthenticationTypes.h create mode 100644 Source/PlayFabCore/Source/Generated/CacheId.h create mode 100644 Source/PlayFabCore/Source/Generated/Events.cpp create mode 100644 Source/PlayFabCore/Source/Generated/Events.h create mode 100644 Source/PlayFabCore/Source/Generated/EventsTypes.cpp create mode 100644 Source/PlayFabCore/Source/Generated/EventsTypes.h create mode 100644 Source/PlayFabCore/Source/Generated/PFAuthentication.cpp create mode 100644 Source/PlayFabCore/Source/Generated/PFEvents.cpp create mode 100644 Source/PlayFabCore/Source/Generated/Types.cpp create mode 100644 Source/PlayFabCore/Source/Generated/Types.h create mode 100644 Source/PlayFabCore/Source/HttpClient/LHCExport.def create mode 100644 Source/PlayFabCore/Source/HttpClient/PFHCTrace.cpp create mode 100644 Source/PlayFabCore/Source/HttpClient/PFHttpClient.cpp create mode 100644 Source/PlayFabCore/Source/HttpClient/PFHttpProvider.cpp create mode 100644 Source/PlayFabCore/Source/HttpClient/PFMock.cpp create mode 100644 Source/PlayFabCore/Source/Platform/LocalStorage.cpp create mode 100644 Source/PlayFabCore/Source/Platform/LocalStorage.h create mode 100644 Source/PlayFabCore/Source/Platform/LocalStorageHandlers.cpp create mode 100644 Source/PlayFabCore/Source/Platform/LocalStorageHandlers.h create mode 100644 Source/PlayFabCore/Source/Platform/Platform.cpp create mode 100644 Source/PlayFabCore/Source/Platform/Platform.h create mode 100644 Source/PlayFabCore/Source/Trace/DebugTraceOutput.cpp create mode 100644 Source/PlayFabCore/Source/Trace/DebugTraceOutput.h create mode 100644 Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.cpp create mode 100644 Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.h create mode 100644 Source/PlayFabCore/Source/Trace/TraceState.cpp create mode 100644 Source/PlayFabCore/Source/Trace/TraceState.h create mode 100644 Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.cpp create mode 100644 Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.h create mode 100644 Source/PlayFabCore/Source/stdafx.cpp create mode 100644 Source/PlayFabCore/Source/stdafx.h create mode 100644 Source/PlayFabServices/API-List.csv create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagement.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagementTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFCatalog.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFCatalogTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFCharacter.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFCharacterTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScript.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScriptTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFData.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFDataTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentation.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentationTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFFriends.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFFriendsTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFGroups.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFGroupsTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFInventory.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFInventoryTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFLocalization.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFLocalizationTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServer.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServerTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecific.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecificTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagement.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagementTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFProfiles.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFProfilesTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotifications.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotificationsTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFSegments.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFSegmentsTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFServices.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagement.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagementTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/PFTypes.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/AccountManagementTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/CatalogTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/CharacterTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/CloudScriptTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/DataTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/ExperimentationTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/FriendsTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/GroupsTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/InventoryTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/LocalizationTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/MultiplayerServerTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlatformSpecificTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlayerDataManagementTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/ProfilesTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/PushNotificationsTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/SegmentsTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/TitleDataManagementTypeWrappers.h create mode 100644 Source/PlayFabServices/Include/Generated/playfab/services/cpp/TypeWrappers.h create mode 100644 Source/PlayFabServices/Source/Api/PFServices.cpp create mode 100644 Source/PlayFabServices/Source/Common/GlobalState.cpp create mode 100644 Source/PlayFabServices/Source/Common/GlobalState.h create mode 100644 Source/PlayFabServices/Source/Common/HttpClient.cpp create mode 100644 Source/PlayFabServices/Source/Common/HttpClient.h create mode 100644 Source/PlayFabServices/Source/Common/Platform.cpp create mode 100644 Source/PlayFabServices/Source/Common/Platform.h create mode 100644 Source/PlayFabServices/Source/GDK/AccountManagementXTokenAPIs.cpp create mode 100644 Source/PlayFabServices/Source/GDK/FriendsXTokenAPIs.cpp create mode 100644 Source/PlayFabServices/Source/GDK/InventoryXTokenAPIs.cpp create mode 100644 Source/PlayFabServices/Source/Generated/AccountManagement.cpp create mode 100644 Source/PlayFabServices/Source/Generated/AccountManagement.h create mode 100644 Source/PlayFabServices/Source/Generated/AccountManagementTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/AccountManagementTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/CacheId.h create mode 100644 Source/PlayFabServices/Source/Generated/Catalog.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Catalog.h create mode 100644 Source/PlayFabServices/Source/Generated/CatalogTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/CatalogTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Character.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Character.h create mode 100644 Source/PlayFabServices/Source/Generated/CharacterTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/CharacterTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/CloudScript.cpp create mode 100644 Source/PlayFabServices/Source/Generated/CloudScript.h create mode 100644 Source/PlayFabServices/Source/Generated/CloudScriptTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/CloudScriptTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/CoreTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/CoreTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Data.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Data.h create mode 100644 Source/PlayFabServices/Source/Generated/DataTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/DataTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Experimentation.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Experimentation.h create mode 100644 Source/PlayFabServices/Source/Generated/ExperimentationTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/ExperimentationTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Friends.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Friends.h create mode 100644 Source/PlayFabServices/Source/Generated/FriendsTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/FriendsTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Groups.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Groups.h create mode 100644 Source/PlayFabServices/Source/Generated/GroupsTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/GroupsTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Inventory.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Inventory.h create mode 100644 Source/PlayFabServices/Source/Generated/InventoryTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/InventoryTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Localization.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Localization.h create mode 100644 Source/PlayFabServices/Source/Generated/LocalizationTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/LocalizationTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/MultiplayerServer.cpp create mode 100644 Source/PlayFabServices/Source/Generated/MultiplayerServer.h create mode 100644 Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/PFAccountManagement.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFCatalog.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFCharacter.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFCloudScript.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFData.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFExperimentation.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFFriends.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFGroups.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFInventory.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFLocalization.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFMultiplayerServer.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFPlatformSpecific.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFPlayerDataManagement.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFProfiles.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFPushNotifications.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFSegments.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PFTitleDataManagement.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PlatformSpecific.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PlatformSpecific.h create mode 100644 Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/PlayerDataManagement.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PlayerDataManagement.h create mode 100644 Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Profiles.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Profiles.h create mode 100644 Source/PlayFabServices/Source/Generated/ProfilesTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/ProfilesTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/PushNotifications.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PushNotifications.h create mode 100644 Source/PlayFabServices/Source/Generated/PushNotificationsTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/PushNotificationsTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Segments.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Segments.h create mode 100644 Source/PlayFabServices/Source/Generated/SegmentsTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/SegmentsTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/TitleDataManagement.cpp create mode 100644 Source/PlayFabServices/Source/Generated/TitleDataManagement.h create mode 100644 Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.cpp create mode 100644 Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.h create mode 100644 Source/PlayFabServices/Source/Generated/Types.cpp create mode 100644 Source/PlayFabServices/Source/Generated/Types.h create mode 100644 Source/PlayFabServices/Source/stdafx.cpp create mode 100644 Source/PlayFabServices/Source/stdafx.h create mode 100644 Source/PlayFabSharedInternal/Include/ApiXAsyncProvider.h create mode 100644 Source/PlayFabSharedInternal/Include/AsyncOp.h create mode 100644 Source/PlayFabSharedInternal/Include/BaseModel.h create mode 100644 Source/PlayFabSharedInternal/Include/CancellationToken.h create mode 100644 Source/PlayFabSharedInternal/Include/EnumTraits.h create mode 100644 Source/PlayFabSharedInternal/Include/GDK/PlatformUser_GDK.h create mode 100644 Source/PlayFabSharedInternal/Include/Generated/Error.h create mode 100644 Source/PlayFabSharedInternal/Include/HttpRequest.h create mode 100644 Source/PlayFabSharedInternal/Include/JsonUtils.h create mode 100644 Source/PlayFabSharedInternal/Include/Memory.h create mode 100644 Source/PlayFabSharedInternal/Include/ModelBuffer.h create mode 100644 Source/PlayFabSharedInternal/Include/PlatformUser.h create mode 100644 Source/PlayFabSharedInternal/Include/PlatformUtils.h create mode 100644 Source/PlayFabSharedInternal/Include/RapidJson.h create mode 100644 Source/PlayFabSharedInternal/Include/Result.h create mode 100644 Source/PlayFabSharedInternal/Include/ResultMacros.h create mode 100644 Source/PlayFabSharedInternal/Include/RunContext.h create mode 100644 Source/PlayFabSharedInternal/Include/SdkVersion.h create mode 100644 Source/PlayFabSharedInternal/Include/Trace.h create mode 100644 Source/PlayFabSharedInternal/Include/Types.h create mode 100644 Source/PlayFabSharedInternal/Include/XAsyncOperation.h create mode 100644 Source/PlayFabSharedInternal/Include/XAsyncProviderBase.h create mode 100644 Source/PlayFabSharedInternal/Source/CancellationToken.cpp create mode 100644 Source/PlayFabSharedInternal/Source/GDK/PlatformUser_GDK.cpp create mode 100644 Source/PlayFabSharedInternal/Source/Generated/Error.cpp create mode 100644 Source/PlayFabSharedInternal/Source/HttpRequest.cpp create mode 100644 Source/PlayFabSharedInternal/Source/JsonUtils.cpp create mode 100644 Source/PlayFabSharedInternal/Source/Memory.cpp create mode 100644 Source/PlayFabSharedInternal/Source/ModelBuffer.cpp create mode 100644 Source/PlayFabSharedInternal/Source/RunContext.cpp create mode 100644 Source/PlayFabSharedInternal/Source/Trace.cpp create mode 100644 Source/PlayFabSharedInternal/Source/XAsyncOperation.cpp create mode 100644 Source/PlayFabSharedInternal/Source/XAsyncProviderBase.cpp create mode 100644 Source/PlayFabSharedInternal/Source/pch.cpp create mode 100644 Source/PlayFabSharedInternal/Source/pch.h create mode 100644 Test/PlayFabCore.UnitTests/Mocks/HttpMock.cpp create mode 100644 Test/PlayFabCore.UnitTests/Mocks/HttpMock.h create mode 100644 Test/PlayFabCore.UnitTests/Mocks/MockResponses.json create mode 100644 Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.cpp create mode 100644 Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.h create mode 100644 Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj create mode 100644 Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj.filters create mode 100644 Test/PlayFabCore.UnitTests/Support/AsyncTestContext.cpp create mode 100644 Test/PlayFabCore.UnitTests/Support/AsyncTestContext.h create mode 100644 Test/PlayFabCore.UnitTests/Support/Event.cpp create mode 100644 Test/PlayFabCore.UnitTests/Support/Event.h create mode 100644 Test/PlayFabCore.UnitTests/Support/TaskQueue.cpp create mode 100644 Test/PlayFabCore.UnitTests/Support/TaskQueue.h create mode 100644 Test/PlayFabCore.UnitTests/Support/TestIncludes.h create mode 100644 Test/PlayFabCore.UnitTests/Support/TestMacros.h create mode 100644 Test/PlayFabCore.UnitTests/Support/TestSession.h create mode 100644 Test/PlayFabCore.UnitTests/Tests/AsyncOpTests.cpp create mode 100644 Test/PlayFabCore.UnitTests/Tests/CancellationTokenTests.cpp create mode 100644 Test/PlayFabCore.UnitTests/Tests/EventPipelineTests.cpp create mode 100644 Test/PlayFabCore.UnitTests/Tests/GlobalStateTests.cpp create mode 100644 Test/PlayFabCore.UnitTests/Tests/RunContextTests.cpp create mode 100644 Test/PlayFabCore.UnitTests/Tests/TokenRefreshTests.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/DataOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/DataOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems.filters create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.h create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.cpp create mode 100644 Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.h create mode 100644 Test/PlayFabServices.GeneratedTests/AccountManagementTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/AccountManagementTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/AccountManagementTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/CatalogTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/CatalogTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/CatalogTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/CharacterTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/CharacterTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/CharacterTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/CloudScriptTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/CloudScriptTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/CloudScriptTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/DataTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/DataTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/DataTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/ExperimentationTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/ExperimentationTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/ExperimentationTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/FriendsTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/FriendsTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/FriendsTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/GroupsTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/GroupsTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/GroupsTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/InventoryTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/InventoryTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/InventoryTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/LocalizationTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/LocalizationTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/LocalizationTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/MultiplayerServerTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/PlatformSpecificTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems create mode 100644 Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems.filters create mode 100644 Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/PlayerDataManagementTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/ProfilesTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/ProfilesTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/ProfilesTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/PushNotificationsTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/PushNotificationsTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/PushNotificationsTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/SegmentsTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/SegmentsTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/SegmentsTestsImpl.stubs create mode 100644 Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.cpp create mode 100644 Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.h create mode 100644 Test/PlayFabServices.GeneratedTests/TitleDataManagementTestsImpl.stubs create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/ATGConsoleBlack.DDS create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/ATGSampleBackground.DDS create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/Logo.png create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/Mounted.png create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/Owned.png create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/SmallLogo.png create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/SplashScreen.png create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/StoreLogo.png create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Assets/Unmounted.png create mode 100644 Test/PlayFabServicesManualTestApp/GDK/DeviceResourcesPC.cpp create mode 100644 Test/PlayFabServicesManualTestApp/GDK/DeviceResourcesPC.h create mode 100644 Test/PlayFabServicesManualTestApp/GDK/DeviceResourcesXbox.cpp create mode 100644 Test/PlayFabServicesManualTestApp/GDK/DeviceResourcesXbox.h create mode 100644 Test/PlayFabServicesManualTestApp/GDK/GDKPch.h create mode 100644 Test/PlayFabServicesManualTestApp/GDK/GamePC.cpp create mode 100644 Test/PlayFabServicesManualTestApp/GDK/GamePC.h create mode 100644 Test/PlayFabServicesManualTestApp/GDK/GameXbox.cpp create mode 100644 Test/PlayFabServicesManualTestApp/GDK/GameXbox.h create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Keyboard.cpp create mode 100644 Test/PlayFabServicesManualTestApp/GDK/Keyboard.h create mode 100644 Test/PlayFabServicesManualTestApp/GDK/MainPC.cpp create mode 100644 Test/PlayFabServicesManualTestApp/GDK/MainXbox.cpp create mode 100644 Test/PlayFabServicesManualTestApp/GDK/StepTimer.h create mode 100644 Test/PlayFabServicesManualTestApp/GDK/d3dx12.h create mode 100644 Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestApp.Gdk.vcxproj create mode 100644 Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestApp.Gdk.vcxproj.filters create mode 100644 Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.sln create mode 100644 Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj create mode 100644 Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj.filters create mode 100644 Test/PlayFabServicesManualTestApp/TestAppPch.cpp create mode 100644 Test/PlayFabServicesManualTestApp/TestAppPch.h create mode 100644 Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.cpp create mode 100644 Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.h create mode 100644 Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.cpp create mode 100644 Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.h create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/ATGConsoleBlack.DDS create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/ATGSampleBackground.DDS create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/Logo.png create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/Mounted.png create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/Owned.png create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/SmallLogo.png create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/SplashScreen.png create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/StoreLogo.png create mode 100644 Test/PlayFabServicesTestApp/GDK/Assets/Unmounted.png create mode 100644 Test/PlayFabServicesTestApp/GDK/DeviceResourcesPC.cpp create mode 100644 Test/PlayFabServicesTestApp/GDK/DeviceResourcesPC.h create mode 100644 Test/PlayFabServicesTestApp/GDK/DeviceResourcesXbox.cpp create mode 100644 Test/PlayFabServicesTestApp/GDK/DeviceResourcesXbox.h create mode 100644 Test/PlayFabServicesTestApp/GDK/GDKPch.h create mode 100644 Test/PlayFabServicesTestApp/GDK/GamePC.cpp create mode 100644 Test/PlayFabServicesTestApp/GDK/GamePC.h create mode 100644 Test/PlayFabServicesTestApp/GDK/GameXbox.cpp create mode 100644 Test/PlayFabServicesTestApp/GDK/GameXbox.h create mode 100644 Test/PlayFabServicesTestApp/GDK/Keyboard.cpp create mode 100644 Test/PlayFabServicesTestApp/GDK/Keyboard.h create mode 100644 Test/PlayFabServicesTestApp/GDK/MainPC.cpp create mode 100644 Test/PlayFabServicesTestApp/GDK/MainXbox.cpp create mode 100644 Test/PlayFabServicesTestApp/GDK/MicrosoftGame.Config create mode 100644 Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj create mode 100644 Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj.filters create mode 100644 Test/PlayFabServicesTestApp/GDK/StepTimer.h create mode 100644 Test/PlayFabServicesTestApp/GDK/d3dx12.h create mode 100644 Test/PlayFabServicesTestApp/Generated/GeneratedTestsBootstrapper.h create mode 100644 Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.cpp create mode 100644 Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.h create mode 100644 Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.cpp create mode 100644 Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.h create mode 100644 Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.cpp create mode 100644 Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.h create mode 100644 Test/PlayFabServicesTestApp/Platform/GDK/PlayFabGDK.cpp create mode 100644 Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.cpp create mode 100644 Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.h create mode 100644 Test/PlayFabServicesTestApp/Platform/PlatformUtils.h create mode 100644 Test/PlayFabServicesTestApp/Platform/PlayFabPal.h create mode 100644 Test/PlayFabServicesTestApp/Platform/Win32/PlayFabWin32.cpp create mode 100644 Test/PlayFabServicesTestApp/Platform/Windows/PlatfromUtilsWindows.cpp create mode 100644 Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems create mode 100644 Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems.filters create mode 100644 Test/PlayFabServicesTestApp/TestAppPch.cpp create mode 100644 Test/PlayFabServicesTestApp/TestAppPch.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.cpp create mode 100644 Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.cpp create mode 100644 Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestClass.cpp create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestClass.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestContext.cpp create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestContext.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestException.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestReport.cpp create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestReport.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestRunner.cpp create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestRunner.h create mode 100644 Test/PlayFabServicesTestApp/TestFramework/TestTypes.h create mode 100644 Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.h create mode 100644 Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.h create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/AccountManagementTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/CatalogTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/CharacterTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/CloudScriptTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/DataTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/ExperimentationTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/FriendsTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/GroupsTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/InventoryTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/LocalizationTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/MultiplayerServerTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/PlatformSpecificTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/PlayerDataManagementTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/ProfilesTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/PushNotificationsTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/SegmentsTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Tests/Services/TitleDataManagementTestsImpl.cpp create mode 100644 Test/PlayFabServicesTestApp/Win32/MainWin32.cpp create mode 100644 Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj create mode 100644 Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj.filters diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c55efd --- /dev/null +++ b/.gitignore @@ -0,0 +1,336 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates +target/ + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Code coverage report data files +coveragetool +reports/ +*.cobertura.xml diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4991cd2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "External/libHttpClient"] + path = External/libHttpClient + url = https://github.com/microsoft/libHttpClient.git +[submodule "External/rapidjson"] + path = External/rapidjson + url = https://github.com/Tencent/rapidjson.git diff --git a/Build/PlayFab.C.GDK.props b/Build/PlayFab.C.GDK.props new file mode 100644 index 0000000..b09ac79 --- /dev/null +++ b/Build/PlayFab.C.GDK.props @@ -0,0 +1,22 @@ + + + + + + + + + + ; + + + + + + + + $(PlayFabOutRoot)\$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(PlayFabIntRoot)\$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + + + \ No newline at end of file diff --git a/Build/PlayFab.C.Win32.props b/Build/PlayFab.C.Win32.props new file mode 100644 index 0000000..ca9192c --- /dev/null +++ b/Build/PlayFab.C.Win32.props @@ -0,0 +1,16 @@ + + + + + + + + + + + + $(PlayFabOutRoot)\$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(PlayFabIntRoot)\$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + + + \ No newline at end of file diff --git a/Build/PlayFab.C.paths.props b/Build/PlayFab.C.paths.props new file mode 100644 index 0000000..1c38e36 --- /dev/null +++ b/Build/PlayFab.C.paths.props @@ -0,0 +1,35 @@ + + + + true + + + + + + $([MSBuild]::GetPathOfFileAbove(PlayFab.C.external.props)) + + + + + $(MSBuildThisFileDirectory).. + $(PlayFabRoot)\Build + $(PlayFabRoot)\External + $(PlayFabRoot)\Source + $(PlayFabRoot)\Out + $(PlayFabRoot)\Int + + + + + $(MSBuildThisFileDirectory)..\External\libHttpClient + $(MSBuildThisFileDirectory)..\..\libHttpClient + + + + + + $(PlayFabExternalDir)\rapidjson + $(RapidJsonRoot)\include + + diff --git a/Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems b/Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems new file mode 100644 index 0000000..0b8cd4f --- /dev/null +++ b/Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems @@ -0,0 +1,99 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {c48a8f56-812f-43de-9512-7e408497fde8} + + + + stdafx.h + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabCore\Include;$(PlayFabSourceDir)\PlayFabCore\Include\Generated;$(PlayFabSourceDir)\PlayFabCore\Source;$(PlayFabSourceDir)\PlayFabCore\Source\Common + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems.filters b/Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems.filters new file mode 100644 index 0000000..bbb0081 --- /dev/null +++ b/Build/PlayFabCore.Common/PlayFabCore.Common.vcxitems.filters @@ -0,0 +1,284 @@ + + + + + {e4b17803-2bcd-4118-85d7-7655c95227db} + + + {e4a0006e-436a-4e33-a7ea-f1546acf734f} + + + {c8504e25-bb68-4e5f-927e-04d81c4e223e} + + + {42572e9f-4d2c-4d16-ac4d-4e37fadbdbf0} + + + {d7e28968-8122-4056-90c0-ff691b3c2f0d} + + + {71d703ab-5fdb-4993-bd3f-8b989d5ed99b} + + + {17f92066-ebe8-4276-a0d9-155dd7b58f69} + + + {94338be3-4964-473c-836f-36d12df22a5f} + + + {c9ae7e2d-19ca-4078-9a09-759af69d6dfa} + + + {a5af1477-a68f-4cb8-bf16-b600bcdc65f8} + + + {0627690e-c3d1-47dc-b822-ac02029ffc6c} + + + {222582ac-1dd1-42cd-bbeb-3d30871660e9} + + + {bff3fd0e-dc7f-4d5e-8b5f-58e3dff5cdc4} + + + {5ee99b90-07df-4ca2-a27b-4a0c7de7cee5} + + + {58bdf30d-1e6c-4b3b-9dd3-c78a6fa40d41} + + + {feb784b4-fc75-4295-b57c-228195c0c4bc} + + + {6d8f523e-476a-4f22-84d4-b8e6fae3be39} + + + + + Include\playfab\core + + + Include\playfab\core + + + Include\playfab\core + + + Include\playfab\core + + + Include\playfab\core + + + Include\playfab\core + + + Include\playfab\core + + + Include\playfab\core\cpp + + + Include\playfab\core\cpp + + + Include\playfab\core\cpp + + + Include\playfab\core\cpp + + + Include\playfab\core\cpp + + + Include\playfab\core\cpp + + + Include\playfab\httpClient + + + Include\playfab\httpClient + + + Include\playfab\httpClient + + + Include\playfab\httpClient + + + Include\playfab\httpClient + + + Include\playfab\httpClient + + + Source\Authentication + + + Source\Authentication + + + Source\Authentication + + + Source\EventPipeline + + + Source\EventPipeline + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Trace + + + Source\Trace + + + Source\Trace + + + Source\Platform + + + Source\Platform + + + Source\Platform + + + Source + + + Include\Generated\playfab\core + + + Include\Generated\playfab\core + + + Source\Generated + + + + + Source\Api + + + Source\Api + + + Source\Api + + + Source\Api + + + Source\Api + + + Source\Api + + + Source\Api + + + Source\Authentication + + + Source\Authentication + + + Source\EventPipeline + + + Source\EventPipeline + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\Common + + + Source\HttpClient + + + Source\HttpClient + + + Source\HttpClient + + + Source\HttpClient + + + Source\Trace + + + Source\Trace + + + Source\Trace + + + Source\Platform + + + Source\Platform + + + Source\Platform + + + Source + + + + + Source\HttpClient + + + \ No newline at end of file diff --git a/Build/PlayFabCore.GDK.142/PlayFabCore.GDK.142.vcxproj b/Build/PlayFabCore.GDK.142/PlayFabCore.GDK.142.vcxproj new file mode 100644 index 0000000..b1e7cb5 --- /dev/null +++ b/Build/PlayFabCore.GDK.142/PlayFabCore.GDK.142.vcxproj @@ -0,0 +1,15 @@ + + + + {073240eb-8e44-4e40-b5a9-3d2dc09b0d0b} + DynamicLibrary + v142 + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabCore.GDK.143/PlayFabCore.GDK.143.vcxproj b/Build/PlayFabCore.GDK.143/PlayFabCore.GDK.143.vcxproj new file mode 100644 index 0000000..1e9ae61 --- /dev/null +++ b/Build/PlayFabCore.GDK.143/PlayFabCore.GDK.143.vcxproj @@ -0,0 +1,15 @@ + + + + {d5c6a9a7-da63-4032-8ab2-3350f89162fc} + DynamicLibrary + v143 + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems b/Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems new file mode 100644 index 0000000..f8a7d62 --- /dev/null +++ b/Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems @@ -0,0 +1,23 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {f6abe37d-e40b-4622-8d9a-3956b87ef4ea} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems.filters b/Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems.filters new file mode 100644 index 0000000..6f44329 --- /dev/null +++ b/Build/PlayFabCore.GDK/PlayFabCore.GDK.vcxitems.filters @@ -0,0 +1,33 @@ + + + + + {59076205-1bc8-46af-831f-b15c74776933} + + + {b6ef33f1-8362-4eda-80e1-7c03a26dd328} + + + {fef92e28-e924-4a90-91cc-465909e84027} + + + {746ec713-ddaf-4066-87eb-750221d19814} + + + {6f2eb228-c40c-4c79-a60e-8a5fc2aadad5} + + + + + Source\Trace\Windows + + + Source\Authentication\GDK + + + + + Source\Trace\Windows + + + \ No newline at end of file diff --git a/Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems b/Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems new file mode 100644 index 0000000..06e0747 --- /dev/null +++ b/Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems @@ -0,0 +1,39 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {a3f3486c-8053-4cf1-a9c6-0330d41ef9f5} + + + + + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabCore\Include\Generated; + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems.filters b/Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems.filters new file mode 100644 index 0000000..6decab4 --- /dev/null +++ b/Build/PlayFabCore.ServiceWrappers/PlayFabCore.ServiceWrappers.vcxitems.filters @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + Include\Generated\playfab\core + + + Include\Generated\playfab\core\cpp + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\core + + + Include\Generated\playfab\core\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\core + + + Source\Generated + + + Include\Generated\playfab\core + + + Include\Generated\playfab\core\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\core + + + Source\Generated + + + \ No newline at end of file diff --git a/Build/PlayFabCore.Win32.143/PlayFabCore.Win32.143.vcxproj b/Build/PlayFabCore.Win32.143/PlayFabCore.Win32.143.vcxproj new file mode 100644 index 0000000..8842f02 --- /dev/null +++ b/Build/PlayFabCore.Win32.143/PlayFabCore.Win32.143.vcxproj @@ -0,0 +1,15 @@ + + + + {e39e44ee-0f50-4a99-a5d5-04633b19128f} + DynamicLibrary + v143 + 10.0.19041.0 + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems b/Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems new file mode 100644 index 0000000..88b1c7b --- /dev/null +++ b/Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems @@ -0,0 +1,22 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {6b13a20e-a44a-40d3-bc0e-1c4b4c080187} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems.filters b/Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems.filters new file mode 100644 index 0000000..16e98b1 --- /dev/null +++ b/Build/PlayFabCore.Win32/PlayFabCore.Win32.vcxitems.filters @@ -0,0 +1,24 @@ + + + + + {f3a3099f-1e30-4203-9d49-b41e14c15e9c} + + + {9f5627e1-b842-4aab-ad7f-a64a587ad9c3} + + + {1437d09b-9d72-47de-9b73-7d8f81c2c642} + + + + + Source\Trace\Windows + + + + + Source\Trace\Windows + + + \ No newline at end of file diff --git a/Build/PlayFabCore.import.props b/Build/PlayFabCore.import.props new file mode 100644 index 0000000..ce81273 --- /dev/null +++ b/Build/PlayFabCore.import.props @@ -0,0 +1,43 @@ + + + + true + + + + + + + + + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabCore\Include;$(PlayFabSourceDir)\PlayFabCore\Include\Generated + + + + + $(PlatformToolsetVersion) + 141 + 142 + 143 + PlayFabCore.$(HCPlatform).$(PlayFabCoreToolset) + $(PlayFabOutRoot)\$(Platform)\$(Configuration)\$(PlayFabCoreProjectName)\ + + + + + + {e39e44ee-0f50-4a99-a5d5-04633b19128f} + {073240eb-8e44-4e40-b5a9-3d2dc09b0d0b} + {d5c6a9a7-da63-4032-8ab2-3350f89162fc} + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems b/Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems new file mode 100644 index 0000000..4bbd5cc --- /dev/null +++ b/Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems @@ -0,0 +1,33 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {c0fc43fe-b741-4214-8278-04285ba33859} + + + + stdafx.h + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabServices\Include;$(PlayFabSourceDir)\PlayFabServices\Include\Generated;$(PlayFabSourceDir)\PlayFabServices\Source;$(PlayFabSourceDir)\PlayFabServices\Source\Common + + + + + + + + + + + + Create + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems.filters b/Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems.filters new file mode 100644 index 0000000..e3f75aa --- /dev/null +++ b/Build/PlayFabServices.Common/PlayFabServices.Common.vcxitems.filters @@ -0,0 +1,60 @@ + + + + + {3e794b0d-a722-463c-909e-080d0130f2c4} + + + {5de2a984-6a2d-4e8c-afb5-f26dbbd0ae84} + + + {86f10500-7bbf-41f6-9360-0579bf511929} + + + {cf44a0dc-3f6e-45d6-bfbc-8b687dadd7c3} + + + {aaaeaf10-7245-4031-a9c8-c9a087f24283} + + + {3883be85-6cec-4adf-9816-40a0f7a3f126} + + + {ca042ba8-8b25-4125-ac46-7da831a12ef0} + + + + + Source + + + Source\Api + + + Source\Common + + + Source\Common + + + Source\Common + + + + + Source + + + Source\Common + + + Source\Common + + + Source\Common + + + Include\Generated\playfab\services + + + \ No newline at end of file diff --git a/Build/PlayFabServices.GDK.142/PlayFabServices.GDK.142.vcxproj b/Build/PlayFabServices.GDK.142/PlayFabServices.GDK.142.vcxproj new file mode 100644 index 0000000..edb4eb1 --- /dev/null +++ b/Build/PlayFabServices.GDK.142/PlayFabServices.GDK.142.vcxproj @@ -0,0 +1,15 @@ + + + + {7cf96aad-a922-47b4-9da2-fa30f7e47d72} + DynamicLibrary + v142 + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabServices.GDK.143/PlayFabServices.GDK.143.vcxproj b/Build/PlayFabServices.GDK.143/PlayFabServices.GDK.143.vcxproj new file mode 100644 index 0000000..aebac0c --- /dev/null +++ b/Build/PlayFabServices.GDK.143/PlayFabServices.GDK.143.vcxproj @@ -0,0 +1,21 @@ + + + + {fb3a4738-544d-4a89-ba69-31d7c86e7af7} + DynamicLibrary + v143 + + + + + + + + + + + false + + + + \ No newline at end of file diff --git a/Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems b/Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems new file mode 100644 index 0000000..bd118a6 --- /dev/null +++ b/Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems @@ -0,0 +1,21 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {56671826-2060-4e28-b815-e30ef7f88535} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems.filters b/Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems.filters new file mode 100644 index 0000000..543331b --- /dev/null +++ b/Build/PlayFabServices.GDK/PlayFabServices.GDK.vcxitems.filters @@ -0,0 +1,22 @@ + + + + + {6a477f34-9fc5-49c2-94c3-7f532b4684f1} + + + {b843c27b-49ba-47d1-a378-c7f69dd2cd77} + + + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + \ No newline at end of file diff --git a/Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems b/Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems new file mode 100644 index 0000000..3d21e14 --- /dev/null +++ b/Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems @@ -0,0 +1,161 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {358C20A7-2D82-440B-AF94-8F419D3B0E75} + + + + + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabServices\Include\Generated; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems.filters b/Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems.filters new file mode 100644 index 0000000..f347c74 --- /dev/null +++ b/Build/PlayFabServices.ServiceWrappers/PlayFabServices.ServiceWrappers.vcxitems.filters @@ -0,0 +1,440 @@ + + + + + + + + + + + + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + Include\Generated\playfab\services + + + Include\Generated\playfab\services\cpp + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Source\Generated + + + Include\Generated\playfab\services + + + Source\Generated + + + \ No newline at end of file diff --git a/Build/PlayFabServices.Win32.143/PlayFabServices.Win32.143.vcxproj b/Build/PlayFabServices.Win32.143/PlayFabServices.Win32.143.vcxproj new file mode 100644 index 0000000..69b381e --- /dev/null +++ b/Build/PlayFabServices.Win32.143/PlayFabServices.Win32.143.vcxproj @@ -0,0 +1,14 @@ + + + + {9740c935-821c-498c-a942-817eea7fdcd7} + DynamicLibrary + v143 + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabServices.import.props b/Build/PlayFabServices.import.props new file mode 100644 index 0000000..9e890d5 --- /dev/null +++ b/Build/PlayFabServices.import.props @@ -0,0 +1,35 @@ + + + + true + + + + + + + + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabServices\Include;$(PlayFabSourceDir)\PlayFabServices\Include\Generated + + + + + PlayFabServices.$(HCPlatform).$(PlayFabCoreToolset) + $(PlayFabOutRoot)\$(Platform)\$(Configuration)\$(PlayFabServicesProjectName)\ + + + + + + {9740c935-821c-498c-a942-817eea7fdcd7} + {7cf96aad-a922-47b4-9da2-fa30f7e47d72} + {fb3a4738-544d-4a89-ba69-31d7c86e7af7} + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal.GDK.142/PlayFabSharedInternal.GDK.142.vcxproj b/Build/PlayFabSharedInternal.GDK.142/PlayFabSharedInternal.GDK.142.vcxproj new file mode 100644 index 0000000..5e7acff --- /dev/null +++ b/Build/PlayFabSharedInternal.GDK.142/PlayFabSharedInternal.GDK.142.vcxproj @@ -0,0 +1,12 @@ + + + + {6741104b-b479-4d1d-8b5c-588f13f4d51a} + StaticLibrary + v142 + + + + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal.GDK.143/PlayFabSharedInternal.GDK.143.vcxproj b/Build/PlayFabSharedInternal.GDK.143/PlayFabSharedInternal.GDK.143.vcxproj new file mode 100644 index 0000000..82b2407 --- /dev/null +++ b/Build/PlayFabSharedInternal.GDK.143/PlayFabSharedInternal.GDK.143.vcxproj @@ -0,0 +1,12 @@ + + + + {91e7010a-a099-41a7-914c-1c19a3539a79} + StaticLibrary + v143 + + + + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems b/Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems new file mode 100644 index 0000000..389fa24 --- /dev/null +++ b/Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems @@ -0,0 +1,22 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {fa97dc9e-93ba-4afd-a301-47ff0b618df6} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems.filters b/Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems.filters new file mode 100644 index 0000000..db1200d --- /dev/null +++ b/Build/PlayFabSharedInternal.GDK/PlayFabSharedInternal.GDK.vcxitems.filters @@ -0,0 +1,27 @@ + + + + + {7ac90edc-f827-4635-8622-fe1a66e05193} + + + {ca7777ee-d83e-4329-84f5-df2f708f9962} + + + {611ed5b5-f8d7-466a-8e00-e2411ff5c944} + + + {4614d1af-4ab0-46f1-a87c-015afc88f21d} + + + + + Include\GDK + + + + + Source\GDK + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal.Win32.143/PlayFabSharedInternal.Win32.143.vcxproj b/Build/PlayFabSharedInternal.Win32.143/PlayFabSharedInternal.Win32.143.vcxproj new file mode 100644 index 0000000..7652d7d --- /dev/null +++ b/Build/PlayFabSharedInternal.Win32.143/PlayFabSharedInternal.Win32.143.vcxproj @@ -0,0 +1,12 @@ + + + + {96e92b5b-7172-4a6b-9982-19f7c0c48632} + StaticLibrary + v143 + + + + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal.import.props b/Build/PlayFabSharedInternal.import.props new file mode 100644 index 0000000..4229dfb --- /dev/null +++ b/Build/PlayFabSharedInternal.import.props @@ -0,0 +1,47 @@ + + + + true + + + + + + + + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabCore\Include;$(PlayFabSourceDir)\PlayFabCore\Include\Generated;$(PlayFabSourceDir)\PlayFabSharedInternal\Include;$(PlayFabSourceDir)\PlayFabSharedInternal\Include\Generated + + + + + $(PlatformToolsetVersion) + 141 + 142 + 143 + PlayFabSharedInternal.$(HCPlatform).$(PlayFabSharedInternalToolset) + + + + + {96e92b5b-7172-4a6b-9982-19f7c0c48632} + {6741104b-b479-4d1d-8b5c-588f13f4d51a} + {91e7010a-a099-41a7-914c-1c19a3539a79} + + + + + + $(PlayFabExternalDir)\rapidjson\ + $(RapidJsonSdkRoot)include\ + + + + + %(AdditionalIncludeDirectories);$(RapidJsonSdkInclude) + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems b/Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems new file mode 100644 index 0000000..1802c3f --- /dev/null +++ b/Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems @@ -0,0 +1,58 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {c069ffad-7e86-4569-852a-be773dac9a6f} + + + + %(AdditionalIncludeDirectories);$(PlayFabSourceDir)\PlayFabCore\Include;$(PlayFabSourceDir)\PlayFabCore\Include\Generated;$(PlayFabSourceDir)\PlayFabSharedInternal\Include;$(PlayFabSourceDir)\PlayFabSharedInternal\Include\Generated;$(PlayFabSourceDir)\PlayFabSharedInternal\Source;$(RapidJsonIncludeDir) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + \ No newline at end of file diff --git a/Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems.filters b/Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems.filters new file mode 100644 index 0000000..43d9e0a --- /dev/null +++ b/Build/PlayFabSharedInternal/PlayFabSharedInternal.vcxitems.filters @@ -0,0 +1,123 @@ + + + + + {774f3afa-0234-4527-8082-3b3534c640c6} + + + {974957ee-ecd0-43f5-893f-8e6b1f3ca02c} + + + {bbec3a0e-e473-44f9-861b-34761ced2683} + + + {75860d5f-8bd1-48f3-ba46-ded1a66bbe0f} + + + + + Include\Generated + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Include + + + Source + + + Include + + + + + Source\Generated + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + + + + \ No newline at end of file diff --git a/Build/libHttpClient.142.GDK.C/libHttpClient.142.GDK.C.vcxproj b/Build/libHttpClient.142.GDK.C/libHttpClient.142.GDK.C.vcxproj new file mode 100644 index 0000000..f35c2dd --- /dev/null +++ b/Build/libHttpClient.142.GDK.C/libHttpClient.142.GDK.C.vcxproj @@ -0,0 +1,18 @@ + + + + {66365E18-7B53-44BF-A348-6735058E359E} + StaticLibrary + v142 + + + + + + + + %(AdditionalIncludeDirectories);$(Console_SdkIncludeRoot) + + + + \ No newline at end of file diff --git a/Build/libHttpClient.143.GDK.C/libHttpClient.143.GDK.C.vcxproj b/Build/libHttpClient.143.GDK.C/libHttpClient.143.GDK.C.vcxproj new file mode 100644 index 0000000..fdf5648 --- /dev/null +++ b/Build/libHttpClient.143.GDK.C/libHttpClient.143.GDK.C.vcxproj @@ -0,0 +1,18 @@ + + + + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E} + StaticLibrary + v143 + + + + + + + + %(AdditionalIncludeDirectories);$(Console_SdkIncludeRoot) + + + + \ No newline at end of file diff --git a/Build/libHttpClient.143.Win32.C/libHttpClient.143.Win32.C.vcxproj b/Build/libHttpClient.143.Win32.C/libHttpClient.143.Win32.C.vcxproj new file mode 100644 index 0000000..7fa055c --- /dev/null +++ b/Build/libHttpClient.143.Win32.C/libHttpClient.143.Win32.C.vcxproj @@ -0,0 +1,14 @@ + + + + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8} + StaticLibrary + v143 + + + + + + + + \ No newline at end of file diff --git a/Build/libHttpClient.import.props b/Build/libHttpClient.import.props new file mode 100644 index 0000000..914a25d --- /dev/null +++ b/Build/libHttpClient.import.props @@ -0,0 +1,50 @@ + + + + + + true + + + + + + + $(PlatformToolsetVersion) + 141 + 142 + 143 + libHttpClient.$(HCLibToolset).$(HCPlatform).C + + + + + + + + {9164C6C9-3872-4922-A3E3-3822622D3E71} + {66365E18-7B53-44BF-A348-6735058E359E} + {0A6D51A3-0D86-4D0E-9DAA-54BA75E1DA1C} + + + + + + %(AdditionalIncludeDirectories);$(HCIncludeDir) + + + %(AdditionalDependencies);Appnotify.lib;winhttp.lib;crypt32.lib + + + + + + + + + + %(AdditionalLibraryDirectories);$(Console_SdkLibPath) + + + + diff --git a/External/libHttpClient b/External/libHttpClient new file mode 160000 index 0000000..7e66157 --- /dev/null +++ b/External/libHttpClient @@ -0,0 +1 @@ +Subproject commit 7e66157fd8713d940d322e8401465ff9feb4b228 diff --git a/External/rapidjson b/External/rapidjson new file mode 160000 index 0000000..973dc9c --- /dev/null +++ b/External/rapidjson @@ -0,0 +1 @@ +Subproject commit 973dc9c06dcd3d035ebd039cfb9ea457721ec213 diff --git a/External/rapidjson.natvis b/External/rapidjson.natvis new file mode 100644 index 0000000..a525ea5 --- /dev/null +++ b/External/rapidjson.natvis @@ -0,0 +1,37 @@ + + + + + null + true + false + {(const Ch*)data_.ss.str,na} + {(const Ch*)((size_t)data_.s.str & 0x0000FFFFFFFFFFFF),na} + {data_.n.i.i} + {data_.n.u.u} + {data_.n.i64} + {data_.n.u64} + {data_.n.d} + Object members={data_.o.size} + Array members={data_.a.size} + + data_.o.size + data_.o.capacity + + data_.o.size + + (rapidjson::GenericMember<$T1,$T2>*)(((size_t)data_.o.members) & 0x0000FFFFFFFFFFFF) + + + data_.a.size + data_.a.capacity + + data_.a.size + + (rapidjson::GenericValue<$T1,$T2>*)(((size_t)data_.a.elements) & 0x0000FFFFFFFFFFFF) + + + + + + diff --git a/PlayFab.C.vs2022.sln b/PlayFab.C.vs2022.sln new file mode 100644 index 0000000..a9e53a9 --- /dev/null +++ b/PlayFab.C.vs2022.sln @@ -0,0 +1,254 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33627.172 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{EA3CEEF0-6E0D-4449-8102-909E9AD5DFB0}" + ProjectSection(SolutionItems) = preProject + Build\libHttpClient.import.props = Build\libHttpClient.import.props + Build\PlayFab.C.GDK.props = Build\PlayFab.C.GDK.props + Build\PlayFab.C.paths.props = Build\PlayFab.C.paths.props + Build\PlayFab.C.Win32.props = Build\PlayFab.C.Win32.props + Build\PlayFabCore.import.props = Build\PlayFabCore.import.props + Build\PlayFabServices.import.props = Build\PlayFabServices.import.props + Build\PlayFabSharedInternal.import.props = Build\PlayFabSharedInternal.import.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Win32", "Win32", "{5E84551E-42EB-42A4-90FE-ED5DFC3C6B93}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GDK", "GDK", "{7B0C92B1-9A07-49BA-8C74-02551B46EADB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{766242E2-BD80-4F36-B7FB-FD141D54ED27}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServices.GeneratedApiWrappers", "Test\PlayFabServices.GeneratedApiWrappers\PlayFabServices.GeneratedApiWrappers.vcxitems", "{893D9F15-D625-483B-969F-0E54DED9960D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServices.GeneratedTests", "Test\PlayFabServices.GeneratedTests\PlayFabServices.GeneratedTests.vcxitems", "{ED91BB24-B033-4DEE-984F-1B4609C0811A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{24C7A79B-55BA-48C0-824D-1B95BE3B71EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServicesTestApp.Win32", "Test\PlayFabServicesTestApp\Win32\PlayFabServicesTestApp.Win32.vcxproj", "{09CAF325-10E5-4DA3-A2C0-88D26416A4B1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{3CD23B1E-3FEA-4076-BC6B-A3D2298CCEEA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabSharedInternal.GDK.143", "Build\PlayFabSharedInternal.GDK.143\PlayFabSharedInternal.GDK.143.vcxproj", "{91E7010A-A099-41A7-914C-1C19A3539A79}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServices.GDK", "Build\PlayFabServices.GDK\PlayFabServices.GDK.vcxitems", "{56671826-2060-4E28-B815-E30EF7F88535}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabCore.UnitTests", "Test\PlayFabCore.UnitTests\PlayFabCore.UnitTests.vcxproj", "{2800A769-2DA4-42CC-AC27-6AD411BC4349}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabSharedInternal", "Build\PlayFabSharedInternal\PlayFabSharedInternal.vcxitems", "{C069FFAD-7E86-4569-852A-BE773DAC9A6F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabCore.Common", "Build\PlayFabCore.Common\PlayFabCore.Common.vcxitems", "{C48A8F56-812F-43DE-9512-7E408497FDE8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabCore.ServiceWrappers", "Build\PlayFabCore.ServiceWrappers\PlayFabCore.ServiceWrappers.vcxitems", "{A3F3486C-8053-4CF1-A9C6-0330D41EF9F5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServices.Common", "Build\PlayFabServices.Common\PlayFabServices.Common.vcxitems", "{C0FC43FE-B741-4214-8278-04285BA33859}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServices.ServiceWrappers", "Build\PlayFabServices.ServiceWrappers\PlayFabServices.ServiceWrappers.vcxitems", "{358C20A7-2D82-440B-AF94-8F419D3B0E75}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabCore.GDK", "Build\PlayFabCore.GDK\PlayFabCore.GDK.vcxitems", "{F6ABE37D-E40B-4622-8D9A-3956B87EF4EA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabCore.Win32", "Build\PlayFabCore.Win32\PlayFabCore.Win32.vcxitems", "{6B13A20E-A44A-40D3-BC0E-1C4B4C080187}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libHttpClient.143.Win32.C", "Build\libHttpClient.143.Win32.C\libHttpClient.143.Win32.C.vcxproj", "{E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabSharedInternal.Win32.143", "Build\PlayFabSharedInternal.Win32.143\PlayFabSharedInternal.Win32.143.vcxproj", "{96E92B5B-7172-4A6B-9982-19F7C0C48632}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libHttpClient.143.GDK.C", "Build\libHttpClient.143.GDK.C\libHttpClient.143.GDK.C.vcxproj", "{FD35375E-DCEA-4BF5-874E-5C2733DAB50E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabCore.GDK.143", "Build\PlayFabCore.GDK.143\PlayFabCore.GDK.143.vcxproj", "{D5C6A9A7-DA63-4032-8AB2-3350F89162FC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabCore.Win32.143", "Build\PlayFabCore.Win32.143\PlayFabCore.Win32.143.vcxproj", "{E39E44EE-0F50-4A99-A5D5-04633B19128F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServices.Win32.143", "Build\PlayFabServices.Win32.143\PlayFabServices.Win32.143.vcxproj", "{9740C935-821C-498C-A942-817EEA7FDCD7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServices.GDK.143", "Build\PlayFabServices.GDK.143\PlayFabServices.GDK.143.vcxproj", "{FB3A4738-544D-4A89-BA69-31D7C86E7AF7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServicesTestApp.GDK", "Test\PlayFabServicesTestApp\GDK\PlayFabServicesTestApp.GDK.vcxproj", "{2298C785-C226-4ED7-8BD6-305C4D73BD1C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServicesTestApp.Common", "Test\PlayFabServicesTestApp\PlayFabServicesTestApp.Common.vcxitems", "{7EFAAB05-6336-49B3-9262-13FD023BEDE5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabSharedInternal.GDK", "Build\PlayFabSharedInternal.GDK\PlayFabSharedInternal.GDK.vcxitems", "{FA97DC9E-93BA-4AFD-A301-47FF0B618DF6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Gaming.Desktop.x64 = Debug|Gaming.Desktop.x64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Gaming.Desktop.x64 = Release|Gaming.Desktop.x64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|x64 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Debug|x64.ActiveCfg = Debug|x64 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Debug|x64.Build.0 = Debug|x64 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Debug|x86.ActiveCfg = Debug|Win32 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Debug|x86.Build.0 = Debug|Win32 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Release|Gaming.Desktop.x64.ActiveCfg = Release|x64 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Release|x64.ActiveCfg = Release|x64 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Release|x64.Build.0 = Release|x64 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Release|x86.ActiveCfg = Release|Win32 + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1}.Release|x86.Build.0 = Release|Win32 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64 + {91E7010A-A099-41A7-914C-1C19A3539A79}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|x64 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Debug|x64.ActiveCfg = Debug|x64 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Debug|x64.Build.0 = Debug|x64 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Debug|x86.ActiveCfg = Debug|Win32 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Debug|x86.Build.0 = Debug|Win32 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Release|Gaming.Desktop.x64.ActiveCfg = Release|x64 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Release|x64.ActiveCfg = Release|x64 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Release|x64.Build.0 = Release|x64 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Release|x86.ActiveCfg = Release|Win32 + {2800A769-2DA4-42CC-AC27-6AD411BC4349}.Release|x86.Build.0 = Release|Win32 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|x64 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Debug|x64.ActiveCfg = Debug|x64 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Debug|x64.Build.0 = Debug|x64 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Debug|x86.ActiveCfg = Debug|Win32 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Debug|x86.Build.0 = Debug|Win32 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Release|Gaming.Desktop.x64.ActiveCfg = Release|x64 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Release|x64.ActiveCfg = Release|x64 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Release|x64.Build.0 = Release|x64 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Release|x86.ActiveCfg = Release|Win32 + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8}.Release|x86.Build.0 = Release|Win32 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|x64 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Debug|x64.ActiveCfg = Debug|x64 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Debug|x64.Build.0 = Debug|x64 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Debug|x86.ActiveCfg = Debug|Win32 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Debug|x86.Build.0 = Debug|Win32 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Release|Gaming.Desktop.x64.ActiveCfg = Release|x64 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Release|x64.ActiveCfg = Release|x64 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Release|x64.Build.0 = Release|x64 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Release|x86.ActiveCfg = Release|Win32 + {96E92B5B-7172-4A6B-9982-19F7C0C48632}.Release|x86.Build.0 = Release|Win32 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64 + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64 + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|x64 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Debug|x64.ActiveCfg = Debug|x64 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Debug|x64.Build.0 = Debug|x64 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Debug|x86.ActiveCfg = Debug|Win32 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Debug|x86.Build.0 = Debug|Win32 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Release|Gaming.Desktop.x64.ActiveCfg = Release|x64 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Release|x64.ActiveCfg = Release|x64 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Release|x64.Build.0 = Release|x64 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Release|x86.ActiveCfg = Release|Win32 + {E39E44EE-0F50-4A99-A5D5-04633B19128F}.Release|x86.Build.0 = Release|Win32 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|x64 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Debug|x64.ActiveCfg = Debug|x64 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Debug|x64.Build.0 = Debug|x64 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Debug|x86.ActiveCfg = Debug|Win32 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Debug|x86.Build.0 = Debug|Win32 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Release|Gaming.Desktop.x64.ActiveCfg = Release|x64 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Release|x64.ActiveCfg = Release|x64 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Release|x64.Build.0 = Release|x64 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Release|x86.ActiveCfg = Release|Win32 + {9740C935-821C-498C-A942-817EEA7FDCD7}.Release|x86.Build.0 = Release|Win32 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64 + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Debug|x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Debug|x86.ActiveCfg = Debug|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Release|x64.ActiveCfg = Release|Gaming.Desktop.x64 + {2298C785-C226-4ED7-8BD6-305C4D73BD1C}.Release|x86.ActiveCfg = Release|Gaming.Desktop.x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {893D9F15-D625-483B-969F-0E54DED9960D} = {766242E2-BD80-4F36-B7FB-FD141D54ED27} + {ED91BB24-B033-4DEE-984F-1B4609C0811A} = {766242E2-BD80-4F36-B7FB-FD141D54ED27} + {24C7A79B-55BA-48C0-824D-1B95BE3B71EC} = {5E84551E-42EB-42A4-90FE-ED5DFC3C6B93} + {09CAF325-10E5-4DA3-A2C0-88D26416A4B1} = {24C7A79B-55BA-48C0-824D-1B95BE3B71EC} + {3CD23B1E-3FEA-4076-BC6B-A3D2298CCEEA} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + {91E7010A-A099-41A7-914C-1C19A3539A79} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + {56671826-2060-4E28-B815-E30EF7F88535} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + {2800A769-2DA4-42CC-AC27-6AD411BC4349} = {766242E2-BD80-4F36-B7FB-FD141D54ED27} + {F6ABE37D-E40B-4622-8D9A-3956B87EF4EA} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + {6B13A20E-A44A-40D3-BC0E-1C4B4C080187} = {5E84551E-42EB-42A4-90FE-ED5DFC3C6B93} + {E35BA8A1-AE7B-4FB5-8200-469B98BC1CA8} = {5E84551E-42EB-42A4-90FE-ED5DFC3C6B93} + {96E92B5B-7172-4A6B-9982-19F7C0C48632} = {5E84551E-42EB-42A4-90FE-ED5DFC3C6B93} + {FD35375E-DCEA-4BF5-874E-5C2733DAB50E} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + {D5C6A9A7-DA63-4032-8AB2-3350F89162FC} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + {E39E44EE-0F50-4A99-A5D5-04633B19128F} = {5E84551E-42EB-42A4-90FE-ED5DFC3C6B93} + {9740C935-821C-498C-A942-817EEA7FDCD7} = {5E84551E-42EB-42A4-90FE-ED5DFC3C6B93} + {FB3A4738-544D-4A89-BA69-31D7C86E7AF7} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + {2298C785-C226-4ED7-8BD6-305C4D73BD1C} = {3CD23B1E-3FEA-4076-BC6B-A3D2298CCEEA} + {7EFAAB05-6336-49B3-9262-13FD023BEDE5} = {766242E2-BD80-4F36-B7FB-FD141D54ED27} + {FA97DC9E-93BA-4AFD-A301-47FF0B618DF6} = {7B0C92B1-9A07-49BA-8C74-02551B46EADB} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B4E1CAC7-E8D6-4B4F-A822-DCCF848F75C9} + EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + Test\PlayFabServices.GeneratedApiWrappers\PlayFabServices.GeneratedApiWrappers.vcxitems*{09caf325-10e5-4da3-a2c0-88d26416a4b1}*SharedItemsImports = 4 + Test\PlayFabServices.GeneratedTests\PlayFabServices.GeneratedTests.vcxitems*{09caf325-10e5-4da3-a2c0-88d26416a4b1}*SharedItemsImports = 4 + Test\PlayFabServicesTestApp\PlayFabServicesTestApp.Common.vcxitems*{09caf325-10e5-4da3-a2c0-88d26416a4b1}*SharedItemsImports = 4 + Test\PlayFabServices.GeneratedApiWrappers\PlayFabServices.GeneratedApiWrappers.vcxitems*{2298c785-c226-4ed7-8bd6-305c4d73bd1c}*SharedItemsImports = 4 + Test\PlayFabServices.GeneratedTests\PlayFabServices.GeneratedTests.vcxitems*{2298c785-c226-4ed7-8bd6-305c4d73bd1c}*SharedItemsImports = 4 + Test\PlayFabServicesTestApp\PlayFabServicesTestApp.Common.vcxitems*{2298c785-c226-4ed7-8bd6-305c4d73bd1c}*SharedItemsImports = 4 + Build\PlayFabCore.Common\PlayFabCore.Common.vcxitems*{2800a769-2da4-42cc-ac27-6ad411bc4349}*SharedItemsImports = 4 + Build\PlayFabCore.ServiceWrappers\PlayFabCore.ServiceWrappers.vcxitems*{2800a769-2da4-42cc-ac27-6ad411bc4349}*SharedItemsImports = 4 + Build\PlayFabCore.Win32\PlayFabCore.Win32.vcxitems*{2800a769-2da4-42cc-ac27-6ad411bc4349}*SharedItemsImports = 4 + Build\PlayFabServices.ServiceWrappers\PlayFabServices.ServiceWrappers.vcxitems*{358c20a7-2d82-440b-af94-8f419d3b0e75}*SharedItemsImports = 9 + Build\PlayFabServices.GDK\PlayFabServices.GDK.vcxitems*{56671826-2060-4e28-b815-e30ef7f88535}*SharedItemsImports = 9 + Build\PlayFabCore.Win32\PlayFabCore.Win32.vcxitems*{6b13a20e-a44a-40d3-bc0e-1c4b4c080187}*SharedItemsImports = 9 + Test\PlayFabServicesTestApp\PlayFabServicesTestApp.Common.vcxitems*{7efaab05-6336-49b3-9262-13fd023bede5}*SharedItemsImports = 9 + Test\PlayFabServices.GeneratedApiWrappers\PlayFabServices.GeneratedApiWrappers.vcxitems*{893d9f15-d625-483b-969f-0e54ded9960d}*SharedItemsImports = 9 + Build\PlayFabSharedInternal.GDK\PlayFabSharedInternal.GDK.vcxitems*{91e7010a-a099-41a7-914c-1c19a3539a79}*SharedItemsImports = 4 + Build\PlayFabSharedInternal\PlayFabSharedInternal.vcxitems*{91e7010a-a099-41a7-914c-1c19a3539a79}*SharedItemsImports = 4 + Build\PlayFabSharedInternal\PlayFabSharedInternal.vcxitems*{96e92b5b-7172-4a6b-9982-19f7c0c48632}*SharedItemsImports = 4 + Build\PlayFabServices.Common\PlayFabServices.Common.vcxitems*{9740c935-821c-498c-a942-817eea7fdcd7}*SharedItemsImports = 4 + Build\PlayFabServices.ServiceWrappers\PlayFabServices.ServiceWrappers.vcxitems*{9740c935-821c-498c-a942-817eea7fdcd7}*SharedItemsImports = 4 + Build\PlayFabCore.ServiceWrappers\PlayFabCore.ServiceWrappers.vcxitems*{a3f3486c-8053-4cf1-a9c6-0330d41ef9f5}*SharedItemsImports = 9 + Build\PlayFabSharedInternal\PlayFabSharedInternal.vcxitems*{c069ffad-7e86-4569-852a-be773dac9a6f}*SharedItemsImports = 9 + Build\PlayFabServices.Common\PlayFabServices.Common.vcxitems*{c0fc43fe-b741-4214-8278-04285ba33859}*SharedItemsImports = 9 + Build\PlayFabCore.Common\PlayFabCore.Common.vcxitems*{c48a8f56-812f-43de-9512-7e408497fde8}*SharedItemsImports = 9 + Build\PlayFabCore.Common\PlayFabCore.Common.vcxitems*{d5c6a9a7-da63-4032-8ab2-3350f89162fc}*SharedItemsImports = 4 + Build\PlayFabCore.GDK\PlayFabCore.GDK.vcxitems*{d5c6a9a7-da63-4032-8ab2-3350f89162fc}*SharedItemsImports = 4 + Build\PlayFabCore.ServiceWrappers\PlayFabCore.ServiceWrappers.vcxitems*{d5c6a9a7-da63-4032-8ab2-3350f89162fc}*SharedItemsImports = 4 + ..\libHttpClient\Build\libHttpClient.Common\libHttpClient.Common.vcxitems*{e35ba8a1-ae7b-4fb5-8200-469b98bc1ca8}*SharedItemsImports = 4 + ..\libHttpClient\Build\libHttpClient.Win32\libHttpClient.Win32.vcxitems*{e35ba8a1-ae7b-4fb5-8200-469b98bc1ca8}*SharedItemsImports = 4 + ..\libHttpClient\Build\libHttpClient.XAsync\libHttpClient.XAsync.vcxitems*{e35ba8a1-ae7b-4fb5-8200-469b98bc1ca8}*SharedItemsImports = 4 + Build\PlayFabCore.Common\PlayFabCore.Common.vcxitems*{e39e44ee-0f50-4a99-a5d5-04633b19128f}*SharedItemsImports = 4 + Build\PlayFabCore.ServiceWrappers\PlayFabCore.ServiceWrappers.vcxitems*{e39e44ee-0f50-4a99-a5d5-04633b19128f}*SharedItemsImports = 4 + Build\PlayFabCore.Win32\PlayFabCore.Win32.vcxitems*{e39e44ee-0f50-4a99-a5d5-04633b19128f}*SharedItemsImports = 4 + Test\PlayFabServices.GeneratedTests\PlayFabServices.GeneratedTests.vcxitems*{ed91bb24-b033-4dee-984f-1b4609c0811a}*SharedItemsImports = 9 + Build\PlayFabCore.GDK\PlayFabCore.GDK.vcxitems*{f6abe37d-e40b-4622-8d9a-3956b87ef4ea}*SharedItemsImports = 9 + Build\PlayFabSharedInternal.GDK\PlayFabSharedInternal.GDK.vcxitems*{fa97dc9e-93ba-4afd-a301-47ff0b618df6}*SharedItemsImports = 9 + Build\PlayFabServices.Common\PlayFabServices.Common.vcxitems*{fb3a4738-544d-4a89-ba69-31d7c86e7af7}*SharedItemsImports = 4 + Build\PlayFabServices.GDK\PlayFabServices.GDK.vcxitems*{fb3a4738-544d-4a89-ba69-31d7c86e7af7}*SharedItemsImports = 4 + Build\PlayFabServices.ServiceWrappers\PlayFabServices.ServiceWrappers.vcxitems*{fb3a4738-544d-4a89-ba69-31d7c86e7af7}*SharedItemsImports = 4 + ..\libHttpClient\Build\libHttpClient.Common\libHttpClient.Common.vcxitems*{fd35375e-dcea-4bf5-874e-5c2733dab50e}*SharedItemsImports = 4 + ..\libHttpClient\Build\libHttpClient.GDK\libHttpClient.GDK.vcxitems*{fd35375e-dcea-4bf5-874e-5c2733dab50e}*SharedItemsImports = 4 + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md new file mode 100644 index 0000000..2627038 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# PlayFabCSdk +Cross-Platform C/C++ PlayFab SDK. + +This SDK currently supports the following platforms: +- Windows (Win32) x64 +- GDK (Xbox and Windows) + +For per-platform getting started guides and a complete list of available APIs, check out the [online documentation](https://learn.microsoft.com/gaming/playfab/sdks/c). + +This SDK lets you make REST API calls to the PlayFab service. It depends on some external third-party open source libraries referenced as git submodules in directory `/External`. Please make sure to use `--recurse-submodules` command line parameter when cloning this git repo: +``` +git clone --recurse-submodules +``` +or run the following commands to sync the content of submodules if the repo was cloned earlier without the `--recurse-submodules` parameter: + +``` +git submodule update --init --recursive +``` + +--- +## Building the SDK +The main solution file references all projects for each platform: +``` +PlayFab.C.vs2022 +| +|-- GDK + | + |-- GDK Projects + |-- GDK Shared Items +|-- Win32 +|-- ... +|-- PlayFabCore Shared Items +|-- PlayFabServices Shared Items +|-- ... +``` +The build projects are created for a build tool that is popular or commonly used on that platform (e.g. Visual Studio projects for Windows, Xbox). +There are common Shared Items projects for code that every platform uses and separate Shared Items projects for per-platform code. Each platform's main projects reference all the relevant Shared Items projects for that platform. + +### 1. Prerequisites: + +* IDE or a build tool specific to platform (Visual Studio 2022 for Windows, Xbox) +* Windows and GDK projects target platform toolset v143 (included in Visual Studio 2022). + +### 2. Installation & Configuration Instructions: + +Currently this project includes the SDK and test apps. + +* Open projects/solution in the IDE/build tool +* Build SDK \ No newline at end of file diff --git a/Source/PlayFabCore/API-List.csv b/Source/PlayFabCore/API-List.csv new file mode 100644 index 0000000..3463549 --- /dev/null +++ b/Source/PlayFabCore/API-List.csv @@ -0,0 +1,41 @@ +Library,Feature Group,API Name,Auth,Subgroup,Call Name,Trimmed?,GDK?,Win32?,Switch?,PlayStation? +PF Core,Authentication,PFAuthenticationGetPhotonAuthenticationTokenAsync,SessionTicket,Authentication,GetPhotonAuthenticationToken,false,No,No,No,No +PF Core,Authentication,PFAuthenticationGetTitlePublicKeyAsync,None,Authentication,GetTitlePublicKey,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithAndroidDeviceIDAsync,None,Authentication,LoginWithAndroidDeviceID,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithAppleAsync,None,Authentication,LoginWithApple,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithCustomIDAsync,None,Authentication,LoginWithCustomID,false,Yes,Yes,Yes,Yes +PF Core,Authentication,PFAuthenticationLoginWithEmailAddressAsync,None,Authentication,LoginWithEmailAddress,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithFacebookAsync,None,Authentication,LoginWithFacebook,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithFacebookInstantGamesIdAsync,None,Authentication,LoginWithFacebookInstantGamesId,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithGameCenterAsync,None,Authentication,LoginWithGameCenter,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithGoogleAccountAsync,None,Authentication,LoginWithGoogleAccount,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithGooglePlayGamesServicesAsync,None,Authentication,LoginWithGooglePlayGamesServices,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithIOSDeviceIDAsync,None,Authentication,LoginWithIOSDeviceID,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithKongregateAsync,None,Authentication,LoginWithKongregate,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithNintendoServiceAccountAsync,None,Authentication,LoginWithNintendoServiceAccount,false,No,No,Yes,No +PF Core,Authentication,PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync,None,Authentication,LoginWithNintendoSwitchDeviceId,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithOpenIdConnectAsync,None,Authentication,LoginWithOpenIdConnect,false,Yes,Yes,Yes,Yes +PF Core,Authentication,PFAuthenticationLoginWithPlayFabAsync,None,Authentication,LoginWithPlayFab,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithPSNAsync,None,Authentication,LoginWithPSN,false,No,No,No,Yes +PF Core,Authentication,PFAuthenticationLoginWithSteamAsync,None,Authentication,LoginWithSteam,false,No,Yes,No,No +PF Core,Authentication,PFAuthenticationLoginWithTwitchAsync,None,Authentication,LoginWithTwitch,false,No,No,No,No +PF Core,Authentication,PFAuthenticationLoginWithXboxAsync,None,Authentication,LoginWithXbox,false,No,Yes,No,No +PF Core,Authentication,PFAuthenticationRegisterPlayFabUserAsync,None,Authentication,RegisterPlayFabUser,false,No,No,No,No +PF Core,Authentication,PFAuthenticationSetPlayerSecretAsync,SessionTicket,Authentication,SetPlayerSecret,false,No,No,No,No +PF Core,Authentication,PFAuthenticationServerLoginWithServerCustomIdAsync,SecretKey,Authentication,ServerLoginWithServerCustomId,false,No,No,No,No +PF Core,Authentication,PFAuthenticationServerLoginWithSteamIdAsync,SecretKey,Authentication,ServerLoginWithSteamId,false,No,No,No,No +PF Core,Authentication,PFAuthenticationServerLoginWithXboxAsync,SecretKey,Authentication,ServerLoginWithXbox,false,No,No,No,No +PF Core,Authentication,PFAuthenticationServerLoginWithXboxIdAsync,SecretKey,Authentication,ServerLoginWithXboxId,false,No,No,No,No +PF Core,Authentication,PFAuthenticationAuthenticateGameServerWithCustomIdAsync,EntityToken,Authentication,AuthenticateGameServerWithCustomId,false,No,No,No,No +PF Core,Authentication,PFAuthenticationDeleteAsync,EntityToken,Authentication,Delete,false,No,No,No,No +PF Core,Authentication,PFAuthenticationGetEntityAsync,None,Authentication,GetEntity,false,No,No,No,No +PF Core,Authentication,PFAuthenticationGetEntityWithSecretKeyAsync,SecretKey,Authentication,GetEntityWithSecretKey,false,No,Yes,No,No +PF Core,Authentication,PFAuthenticationValidateEntityTokenAsync,EntityToken,Authentication,ValidateEntityToken,false,No,No,No,No +PF Core,Events,PFEventsCreateTelemetryKeyAsync,EntityToken,PlayStream Events,CreateTelemetryKey,false,No,Yes,Yes,Yes +PF Core,Events,PFEventsDeleteTelemetryKeyAsync,EntityToken,PlayStream Events,DeleteTelemetryKey,false,No,Yes,Yes,Yes +PF Core,Events,PFEventsGetTelemetryKeyAsync,EntityToken,PlayStream Events,GetTelemetryKey,false,No,Yes,Yes,Yes +PF Core,Events,PFEventsListTelemetryKeysAsync,EntityToken,PlayStream Events,ListTelemetryKeys,false,No,Yes,Yes,Yes +PF Core,Events,PFEventsSetTelemetryKeyActiveAsync,EntityToken,PlayStream Events,SetTelemetryKeyActive,false,No,Yes,Yes,Yes +PF Core,Events,PFEventsWriteEventsAsync,EntityToken,PlayStream Events,WriteEvents,false,Yes,Yes,Yes,Yes +PF Core,Events,PFEventsWriteTelemetryEventsAsync,EntityToken,PlayStream Events,WriteTelemetryEvents,false,Yes,Yes,Yes,Yes + diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/PFAuthentication.h b/Source/PlayFabCore/Include/Generated/playfab/core/PFAuthentication.h new file mode 100644 index 0000000..33fcf51 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/PFAuthentication.h @@ -0,0 +1,2611 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#if 0 +/// +/// Gets a Photon custom authentication token that can be used to securely join the player into a Photon +/// room. See https://docs.microsoft.com/gaming/playfab/features/multiplayer/photon/quickstart for more +/// details. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAuthenticationGetPhotonAuthenticationTokenAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationGetPhotonAuthenticationTokenRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetPhotonAuthenticationToken call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PHOTON_APPLICATION_NOT_ASSOCIATED_WITH_TITLE, +/// E_PF_PHOTON_APPLICATION_NOT_FOUND, E_PF_PHOTON_NOT_ENABLED_FOR_TITLE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationGetPhotonAuthenticationTokenGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAuthenticationGetPhotonAuthenticationTokenAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAuthenticationGetPhotonAuthenticationTokenGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationGetPhotonAuthenticationTokenResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Returns the title's base 64 encoded RSA CSP blob. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// An RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires +/// a signature header. For example if Client/LoginWithCustomId requires signature headers but the player +/// does not have an account yet follow these steps: 1) Call Client/GetTitlePublicKey with one of the +/// title's shared secrets. 2) Convert the Base64 encoded CSP blob to a byte array and create an RSA signing +/// object. 3) Encrypt the UTF8 encoded JSON body of the registration request and place the Base64 encoded +/// result into the EncryptedRequest and with the TitleId field, all other fields can be left empty when +/// performing the API request. 4) Client receives authentication token as normal. Future requests to +/// LoginWithCustomId will require the X-PlayFab-Signature header. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAuthenticationGetTitlePublicKeyAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationGetTitlePublicKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetTitlePublicKey call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_BROKEN, +/// E_PF_INVALID_SHARED_SECRET_KEY, E_PF_NO_SHARED_SECRET_KEY_CONFIGURED or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationGetTitlePublicKeyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAuthenticationGetTitlePublicKeyAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAuthenticationGetTitlePublicKeyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationGetTitlePublicKeyResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using the Android device identifier, returning a session identifier that can subsequently +/// be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// On Android devices, the recommendation is to use the Settings.Secure.ANDROID_ID as the AndroidDeviceId, +/// as described in this blog post (http://android-developers.blogspot.com/2011/03/identifying-app-installations.html). +/// More information on this identifier can be found in the Android documentation (http://developer.android.com/reference/android/provider/Settings.Secure.html). +/// If this is the first time a user has signed in with the Android device and CreateAccount is set to +/// true, a new PlayFab account will be created and linked to the Android device ID. In this case, no +/// email or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is +/// linked to the Android device, an error indicating this will be returned, so that the title can guide +/// the user through creation of a PlayFab account. Please note that while multiple devices of this type +/// can be linked to a single user account, only the one most recently used to login (or most recently +/// linked) will be reflected in the user's account information. We will be updating to show all linked +/// devices in a future release. See also ClientLinkAndroidDeviceIDAsync, ClientLoginWithIOSDeviceIDAsync, +/// ClientUnlinkAndroidDeviceIDAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithAndroidDeviceIDAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithAndroidDeviceIDAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithAndroidDeviceIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithAndroidDeviceIDAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithAndroidDeviceIDAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithAndroidDeviceIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithAndroidDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs in the user with a Sign in with Apple identity token. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkAppleAsync, ClientUnlinkAppleAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithAppleAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithAppleAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_APPLE_NOT_ENABLED_FOR_TITLE, +/// E_PF_ENCRYPTION_KEY_MISSING, E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithAppleGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithAppleAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_APPLE_NOT_ENABLED_FOR_TITLE, +/// E_PF_ENCRYPTION_KEY_MISSING, E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithAppleAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithAppleGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithAppleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +/// +/// Signs the user in using a custom unique identifier generated by the title, returning a session identifier +/// that can subsequently be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// It is highly recommended that developers ensure that it is extremely unlikely that a customer could +/// generate an ID which is already in use by another customer. If this is the first time a user has signed +/// in with the Custom ID and CreateAccount is set to true, a new PlayFab account will be created and +/// linked to the Custom ID. In this case, no email or username will be associated with the PlayFab account. +/// Otherwise, if no PlayFab account is linked to the Custom ID, an error indicating this will be returned, +/// so that the title can guide the user through creation of a PlayFab account. See also ClientLinkCustomIDAsync, +/// ClientUnlinkCustomIDAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithCustomIDAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithCustomIDAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTED_REQUEST_NOT_ALLOWED, +/// E_PF_ENCRYPTION_KEY_MISSING, E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, +/// E_PF_SIGNED_REQUEST_NOT_ALLOWED or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithCustomIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithCustomIDAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTED_REQUEST_NOT_ALLOWED, +/// E_PF_ENCRYPTION_KEY_MISSING, E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, +/// E_PF_SIGNED_REQUEST_NOT_ALLOWED or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithCustomIDAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithCustomIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithCustomIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + + +#if 0 +/// +/// Signs the user into the PlayFab account, returning a session identifier that can subsequently be +/// used for API calls which require an authenticated user. Unlike most other login API calls, LoginWithEmailAddress +/// does not permit the creation of new accounts via the CreateAccountFlag. Email addresses may be used +/// to create accounts via RegisterPlayFabUser. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Email address and password lengths are provided for information purposes. The server will validate +/// that data passed in conforms to the field definition and report errors appropriately. It is recommended +/// that developers not perform this validation locally, so that future updates do not require client +/// updates. See also ClientLoginWithPlayFabAsync, ClientRegisterPlayFabUserAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithEmailAddressAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithEmailAddressRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithEmailAddressAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_EMAIL_OR_PASSWORD, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithEmailAddressGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithEmailAddressAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_EMAIL_OR_PASSWORD, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithEmailAddressAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithEmailAddressGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithEmailAddressAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithEmailAddressRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using a Facebook access token, returning a session identifier that can subsequently +/// be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Facebook sign-in is accomplished using the Facebook User Access Token. More information on the Token +/// can be found in the Facebook developer documentation (https://developers.facebook.com/docs/facebook-login/access-tokens/). +/// In Unity, for example, the Token is available as AccessToken in the Facebook SDK ScriptableObject +/// FB. If this is the first time a user has signed in with the Facebook account and CreateAccount is +/// set to true, a new PlayFab account will be created and linked to the provided account's Facebook ID. +/// In this case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab +/// account is linked to the Facebook account, an error indicating this will be returned, so that the +/// title can guide the user through creation of a PlayFab account. Note that titles should never re-use +/// the same Facebook applications between PlayFab Title IDs, as Facebook provides unique user IDs per +/// application and doing so can result in issues with the Facebook ID for the user in their PlayFab account +/// information. If you must re-use an application in a new PlayFab Title ID, please be sure to first +/// unlink all accounts from Facebook, or delete all users in the first Title ID. See also ClientLinkFacebookAccountAsync, +/// ClientUnlinkFacebookAccountAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithFacebookAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithFacebookRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithFacebookAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FACEBOOK_API_ERROR, E_PF_INVALID_FACEBOOK_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithFacebookGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithFacebookAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FACEBOOK_API_ERROR, E_PF_INVALID_FACEBOOK_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithFacebookAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithFacebookGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithFacebookAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithFacebookRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using a Facebook Instant Games ID, returning a session identifier that can subsequently +/// be used for API calls which require an authenticated user. Requires Facebook Instant Games to be configured. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkFacebookInstantGamesIdAsync, ClientUnlinkFacebookInstantGamesIdAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithFacebookInstantGamesIdAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FACEBOOK_INSTANT_GAMES_AUTH_NOT_CONFIGURED_FOR_TITLE, +/// E_PF_INVALID_FACEBOOK_INSTANT_GAMES_SIGNATURE, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithFacebookInstantGamesIdAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FACEBOOK_INSTANT_GAMES_AUTH_NOT_CONFIGURED_FOR_TITLE, +/// E_PF_INVALID_FACEBOOK_INSTANT_GAMES_SIGNATURE, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithFacebookInstantGamesIdAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithFacebookInstantGamesIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using an iOS Game Center player identifier, returning a session identifier that +/// can subsequently be used for API calls which require an authenticated user. Logging in with a Game +/// Center ID is insecure if you do not include the optional PublicKeyUrl, Salt, Signature, and Timestamp +/// parameters in this request. It is recommended you require these parameters on all Game Center calls +/// by going to the Apple Add-ons page in the PlayFab Game Manager and enabling the 'Require secure authentication +/// only for this app' option. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// The Game Center player identifier (https://developer.apple.com/library/ios/documentation/Accounts/Reference/ACAccountClassRef/index.html#//apple_ref/occ/instp/ACAccount/identifier) +/// is a generated string which is stored on the local device. As with device identifiers, care must be +/// taken to never expose a player's Game Center identifier to end users, as that could result in a user's +/// account being compromised. If this is the first time a user has signed in with Game Center and CreateAccount +/// is set to true, a new PlayFab account will be created and linked to the Game Center identifier. In +/// this case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab +/// account is linked to the Game Center account, an error indicating this will be returned, so that the +/// title can guide the user through creation of a PlayFab account. If an invalid iOS Game Center player +/// identifier is used, an error indicating this will be returned. See also ClientLoginWithIOSDeviceIDAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithGameCenterAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithGameCenterRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithGameCenterAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_GAME_CENTER_AUTHENTICATION_FAILED, E_PF_INVALID_GAME_CENTER_AUTH_REQUEST, +/// E_PF_INVALID_GAME_CENTER_ID, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithGameCenterGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithGameCenterAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_GAME_CENTER_AUTHENTICATION_FAILED, E_PF_INVALID_GAME_CENTER_AUTH_REQUEST, +/// E_PF_INVALID_GAME_CENTER_ID, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithGameCenterAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithGameCenterGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithGameCenterAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGameCenterRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using their Google account credentials +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Google sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google sign-in +/// for Android APIs on the device and passing it to this API. If this is the first time a user has signed +/// in with the Google account and CreateAccount is set to true, a new PlayFab account will be created +/// and linked to the Google account. Otherwise, if no PlayFab account is linked to the Google account, +/// an error indicating this will be returned, so that the title can guide the user through creation of +/// a PlayFab account. The current (recommended) method for obtaining a Google account credential in an +/// Android application is to call GoogleSignInAccount.getServerAuthCode() and send the auth code as the +/// ServerAuthCode parameter of this API. Before doing this, you must create an OAuth 2.0 web application +/// client ID in the Google API Console and configure its client ID and secret in the PlayFab Game Manager +/// Google Add-on for your title. This method does not require prompting of the user for additional Google +/// account permissions, resulting in a user experience with the least possible friction. For more information +/// about obtaining the server auth code, see https://developers.google.com/identity/sign-in/android/offline-access. +/// The previous (deprecated) method was to obtain an OAuth access token by calling GetAccessToken() on +/// the client and passing it as the AccessToken parameter to this API. for the with the Google OAuth +/// 2.0 Access Token. More information on this change can be found in the Google developer documentation +/// (https://android-developers.googleblog.com/2016/01/play-games-permissions-are-changing-in.html). +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithGoogleAccountAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithGoogleAccountAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_GOOGLE_O_AUTH_ERROR, E_PF_GOOGLE_O_AUTH_NO_ID_TOKEN_INCLUDED_IN_RESPONSE, +/// E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_GOOGLE_TOKEN, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithGoogleAccountGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithGoogleAccountAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_GOOGLE_O_AUTH_ERROR, E_PF_GOOGLE_O_AUTH_NO_ID_TOKEN_INCLUDED_IN_RESPONSE, +/// E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_GOOGLE_TOKEN, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithGoogleAccountAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithGoogleAccountGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithGoogleAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using their Google Play Games account credentials +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Google Play Games sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google +/// Play Games sign-in for Android APIs on the device and passing it to this API. If this is the first +/// time a user has signed in with the Google Play Games account and CreateAccount is set to true, a new +/// PlayFab account will be created and linked to the Google Play Games account. Otherwise, if no PlayFab +/// account is linked to the Google Play Games account, an error indicating this will be returned, so +/// that the title can guide the user through creation of a PlayFab account. The current (recommended) +/// method for obtaining a Google Play Games account credential in an Android application is to call GamesSignInClient.requestServerSideAccess() +/// and send the auth code as the ServerAuthCode parameter of this API. Before doing this, you must create +/// an OAuth 2.0 web application client ID in the Google API Console and configure its client ID and secret +/// in the PlayFab Game Manager Google Add-on for your title. This method does not require prompting of +/// the user for additional Google account permissions, resulting in a user experience with the least +/// possible friction. For more information about obtaining the server auth code, see https://developers.google.com/games/services/android/signin. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithGooglePlayGamesServicesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithGooglePlayGamesServicesAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_GOOGLE_O_AUTH_ERROR, E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE, +/// E_PF_INVALID_GOOGLE_PLAY_GAMES_SERVER_AUTH_CODE, E_PF_INVALID_GOOGLE_TOKEN, E_PF_INVALID_GOOGLE_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithGooglePlayGamesServicesAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_GOOGLE_O_AUTH_ERROR, E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE, +/// E_PF_INVALID_GOOGLE_PLAY_GAMES_SERVER_AUTH_CODE, E_PF_INVALID_GOOGLE_TOKEN, E_PF_INVALID_GOOGLE_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithGooglePlayGamesServicesAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithGooglePlayGamesServicesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGooglePlayGamesServicesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using the vendor-specific iOS device identifier, returning a session identifier +/// that can subsequently be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// On iOS devices, the identifierForVendor (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDevice_Class/index.html#//apple_ref/occ/instp/UIDevice/identifierForVendor) +/// must be used as the DeviceId, as the UIDevice uniqueIdentifier has been deprecated as of iOS 5, and +/// use of the advertisingIdentifier for this purpose will result in failure of Apple's certification +/// process. If this is the first time a user has signed in with the iOS device and CreateAccount is set +/// to true, a new PlayFab account will be created and linked to the vendor-specific iOS device ID. In +/// this case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab +/// account is linked to the iOS device, an error indicating this will be returned, so that the title +/// can guide the user through creation of a PlayFab account. Please note that while multiple devices +/// of this type can be linked to a single user account, only the one most recently used to login (or +/// most recently linked) will be reflected in the user's account information. We will be updating to +/// show all linked devices in a future release. See also ClientLinkIOSDeviceIDAsync, ClientUnlinkIOSDeviceIDAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithIOSDeviceIDAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithIOSDeviceIDAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithIOSDeviceIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithIOSDeviceIDAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithIOSDeviceIDAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithIOSDeviceIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithIOSDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using a Kongregate player account. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// More details regarding Kongregate and their game authentication system can be found at http://developers.kongregate.com/docs/virtual-goods/authentication. +/// Developers must provide the Kongregate user ID and auth token that are generated using the Kongregate +/// client library. PlayFab will combine these identifiers with the title's unique Kongregate app ID to +/// log the player into the Kongregate system. If CreateAccount is set to true and there is not already +/// a user matched to this Kongregate ID, then PlayFab will create a new account for this user and link +/// the ID. In this case, no email or username will be associated with the PlayFab account. If there is +/// already a different PlayFab user linked with this account, then an error will be returned. See also +/// ClientLinkKongregateAsync, ClientUnlinkKongregateAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithKongregateAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithKongregateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithKongregateAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_KONGREGATE_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithKongregateGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithKongregateAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_KONGREGATE_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithKongregateAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithKongregateGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithKongregateAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithKongregateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +/// +/// Signs in the user with a Nintendo service account token. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Nintendo Switch. +/// See also ClientLinkNintendoServiceAccountAsync, ClientUnlinkNintendoServiceAccountAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithNintendoServiceAccountAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithNintendoServiceAccountAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithNintendoServiceAccountGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithNintendoServiceAccountAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithNintendoServiceAccountAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithNintendoServiceAccountGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithNintendoServiceAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using a Nintendo Switch Device ID, returning a session identifier that can subsequently +/// be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkNintendoSwitchDeviceIdAsync, ClientUnlinkNintendoSwitchDeviceIdAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_INVALID_SIGNATURE, E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +/// +/// Logs in a user with an Open ID Connect JWT created by an existing relationship between a title and +/// an Open ID Connect provider. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientLinkOpenIdConnectAsync, ClientUnlinkOpenIdConnectAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithOpenIdConnectAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithOpenIdConnectAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_IDENTITY_PROVIDER_ID, E_PF_INVALID_SIGNATURE, +/// E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithOpenIdConnectGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithOpenIdConnectAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_IDENTITY_PROVIDER_ID, E_PF_INVALID_SIGNATURE, +/// E_PF_INVALID_SIGNATURE_TIME, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithOpenIdConnectAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithOpenIdConnectGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithOpenIdConnectAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + + +#if 0 +/// +/// Signs the user into the PlayFab account, returning a session identifier that can subsequently be +/// used for API calls which require an authenticated user. Unlike most other login API calls, LoginWithPlayFab +/// does not permit the creation of new accounts via the CreateAccountFlag. Username/Password credentials +/// may be used to create accounts via RegisterPlayFabUser, or added to existing accounts using AddUsernamePassword. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Username and password lengths are provided for information purposes. The server will validate that +/// data passed in conforms to the field definition and report errors appropriately. It is recommended +/// that developers not perform this validation locally, so that future updates to the username or password +/// do not require client updates. See also ClientAddUsernamePasswordAsync, ClientLoginWithEmailAddressAsync, +/// ClientRegisterPlayFabUserAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithPlayFabAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithPlayFabRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithPlayFabAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_SIGNATURE, +/// E_PF_INVALID_USERNAME_OR_PASSWORD, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithPlayFabGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithPlayFabAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_SIGNATURE, +/// E_PF_INVALID_USERNAME_OR_PASSWORD, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithPlayFabAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithPlayFabGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithPlayFabAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithPlayFabRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Signs the user in using a PlayStation :tm: Network authentication code, returning a session identifier +/// that can subsequently be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Sony PlayStation®. +/// If this is the first time a user has signed in with the PlayStation :tm: Network account and CreateAccount +/// is set to true, a new PlayFab account will be created and linked to the PlayStation :tm: Network account. +/// In this case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab +/// account is linked to the PlayStation :tm: Network account, an error indicating this will be returned, +/// so that the title can guide the user through creation of a PlayFab account. See also ClientLinkPSNAccountAsync, +/// ClientUnlinkPSNAccountAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithPSNAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithPSNRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithPSNAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_PSN_AUTH_CODE, E_PF_INVALID_PSN_ISSUER_ID, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_PSN_INACCESSIBLE, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationLoginWithPSNGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithPSNAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_PSN_AUTH_CODE, E_PF_INVALID_PSN_ISSUER_ID, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_PSN_INACCESSIBLE, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationLoginWithPSNAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithPSNGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithPSNAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithPSNRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +/// +/// Signs the user in using a Steam authentication ticket, returning a session identifier that can subsequently +/// be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32. +/// Steam sign-in is accomplished with the Steam Session Ticket. More information on the Ticket can be +/// found in the Steamworks SDK, here: https://partner.steamgames.com/documentation/auth. NOTE: For Steam +/// authentication to work, the title must be configured with the Steam Application ID and Web API Key +/// in the PlayFab Game Manager (under Steam in the Add-ons Marketplace). You can obtain a Web API Key +/// from the Permissions page of any Group associated with your App ID in the Steamworks site. If this +/// is the first time a user has signed in with the Steam account and CreateAccount is set to true, a +/// new PlayFab account will be created and linked to the provided account's Steam ID. In this case, no +/// email or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is +/// linked to the Steam account, an error indicating this will be returned, so that the title can guide +/// the user through creation of a PlayFab account. See also ClientLinkSteamAccountAsync, ClientUnlinkSteamAccountAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithSteamAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithSteamRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithSteamAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_STEAM_TICKET, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_STEAM_NOT_ENABLED_FOR_TITLE, +/// E_PF_STEAM_USER_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithSteamGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithSteamAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_STEAM_TICKET, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, +/// E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_STEAM_NOT_ENABLED_FOR_TITLE, +/// E_PF_STEAM_USER_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithSteamAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithSteamGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithSteamAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithSteamRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using a Twitch access token. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// More details regarding Twitch and their authentication system can be found at https://github.com/justintv/Twitch-API/blob/master/authentication.md. +/// Developers must provide the Twitch access token that is generated using one of the Twitch authentication +/// flows. PlayFab will use the title's unique Twitch Client ID to authenticate the token and log in to +/// the PlayFab system. If CreateAccount is set to true and there is not already a user matched to the +/// Twitch username that generated the token, then PlayFab will create a new account for this user and +/// link the ID. In this case, no email or username will be associated with the PlayFab account. If there +/// is already a different PlayFab user linked with this account, then an error will be returned. See +/// also ClientLinkTwitchAsync, ClientUnlinkTwitchAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithTwitchAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithTwitchRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithTwitchAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_TWITCH_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, +/// E_PF_TWITCH_RESPONSE_ERROR or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithTwitchGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithTwitchAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_TWITCH_TOKEN, +/// E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, +/// E_PF_TWITCH_RESPONSE_ERROR or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithTwitchAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithTwitchGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithTwitchAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithTwitchRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +/// +/// Signs the user in using a Xbox Live Token, returning a session identifier that can subsequently be +/// used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32. +/// If this is the first time a user has signed in with the Xbox Live account and CreateAccount is set +/// to true, a new PlayFab account will be created and linked to the Xbox Live account. In this case, +/// no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab account +/// is linked to the Xbox Live account, an error indicating this will be returned, so that the title can +/// guide the user through creation of a PlayFab account. See also ClientLinkXboxAccountAsync, ClientUnlinkXboxAccountAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationLoginWithXboxAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithXboxAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_INVALID_XBOX_LIVE_TOKEN, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithXboxGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithXboxAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_INVALID_XBOX_LIVE_TOKEN, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithXboxAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithXboxGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle. Used to address situations where the EntityToken expired and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithXboxAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Signs the user in using an XUserHandle, returning a session identifier that can subsequently be +/// used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on GDK. +/// If this is the first time a user has signed in with the Xbox Live account and CreateAccount is set +/// to true, a new PlayFab account will be created and linked to the Xbox Live account. In this case, +/// no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab account +/// is linked to the Xbox Live account, an error indicating this will be returned, so that the title can +/// guide the user through creation of a PlayFab account. See also ClientLinkXboxAccountAsync, ClientUnlinkXboxAccountAsync. +/// +/// When the asynchronous task is complete, call to get the result. +/// +PF_API PFAuthenticationLoginWithXUserAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationLoginWithXUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationLoginWithXUserAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_INVALID_XBOX_LIVE_TOKEN, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationLoginWithXUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationLoginWithXUserAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_MISSING, +/// E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_INVALID_XBOX_LIVE_TOKEN, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_SIGNED_REQUEST_NOT_ALLOWED, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationLoginWithXUserAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationLoginWithXUserGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Reauthenticates an existing PFEntityHandle using an XUserHandle. Used to address situations where the EntityToken expired +/// and the PlayFab SDK is unable to refresh it. +/// +/// PFEntityHandle to re-login. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the result of the operation. +/// If successful, the cached EntityToken for the PFEntityHandle will be updated in place. +/// +PF_API PFAuthenticationReLoginWithXUserAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithXUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Registers a new Playfab user account, returning a session identifier that can subsequently be used +/// for API calls which require an authenticated user. You must supply either a username or an email address. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithEmailAddressAsync, ClientLoginWithPlayFabAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAuthenticationRegisterPlayFabUserAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAuthenticationRegisterPlayFabUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RegisterPlayFabUser call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EMAIL_ADDRESS_NOT_AVAILABLE, +/// E_PF_ENCRYPTION_KEY_MISSING, E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, E_PF_INVALID_EMAIL_ADDRESS, +/// E_PF_INVALID_PARTNER_RESPONSE, E_PF_INVALID_PASSWORD, E_PF_INVALID_USERNAME, E_PF_NAME_NOT_AVAILABLE, +/// E_PF_PROFANE_DISPLAY_NAME, E_PF_SIGNED_REQUEST_NOT_ALLOWED, E_PF_USERNAME_NOT_AVAILABLE or any of +/// the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAuthenticationRegisterPlayFabUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAuthenticationRegisterPlayFabUserAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAuthenticationRegisterPlayFabUserGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationRegisterPlayFabUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. +/// To reset a player's secret use the Admin or Server API method SetPlayerSecret. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// APIs that require signatures require that the player have a configured Player Secret Key that is +/// used to sign all requests. Players that don't have a secret will be blocked from making API calls +/// until it is configured. To create a signature header add a SHA256 hashed string containing UTF8 encoded +/// JSON body as it will be sent to the server, the current time in UTC formatted to ISO 8601, and the +/// players secret formatted as 'body.date.secret'. Place the resulting hash into the header X-PlayFab-Signature, +/// along with a header X-PlayFab-Timestamp of the same UTC timestamp used in the signature. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ENCRYPTION_KEY_MISSING, E_PF_PLAYER_SECRET_ALREADY_CONFIGURED, E_PF_PLAYER_SECRET_NOT_CONFIGURED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationSetPlayerSecretAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationSetPlayerSecretRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Securely login a game client from an external server backend using a custom identifier for that player. +/// Server Custom ID and Client Custom ID are mutually exclusive and cannot be used to retrieve the same +/// player account. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Title Secret Key used to authenticate the service request. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationServerLoginWithServerCustomIdAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithServerCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationServerLoginWithServerCustomIdAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationServerLoginWithServerCustomIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationServerLoginWithServerCustomIdAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationServerLoginWithServerCustomIdAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationServerLoginWithServerCustomIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using an Steam ID, returning a session identifier that can subsequently be used +/// for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Title Secret Key used to authenticate the service request. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// If this is the first time a user has signed in with the Steam ID and CreateAccount is set to true, +/// a new PlayFab account will be created and linked to the Steam account. In this case, no email or username +/// will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Steam +/// account, an error indicating this will be returned, so that the title can guide the user through creation +/// of a PlayFab account. Steam users that are not logged into the Steam Client app will only have their +/// Steam username synced, other data, such as currency and country will not be available until they login +/// while the Client is open. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationServerLoginWithSteamIdAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithSteamIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationServerLoginWithSteamIdAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_STEAM_NOT_ENABLED_FOR_TITLE, E_PF_STEAM_USER_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationServerLoginWithSteamIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationServerLoginWithSteamIdAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_STEAM_NOT_ENABLED_FOR_TITLE, E_PF_STEAM_USER_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationServerLoginWithSteamIdAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationServerLoginWithSteamIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using a Xbox Live Token from an external server backend, returning a session identifier +/// that can subsequently be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Title Secret Key used to authenticate the service request. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// If this is the first time a user has signed in with the Xbox Live account and CreateAccount is set +/// to true, a new PlayFab account will be created and linked to the Xbox Live account. In this case, +/// no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab account +/// is linked to the Xbox Live account, an error indicating this will be returned, so that the title can +/// guide the user through creation of a PlayFab account. See also ServerLinkXboxAccountAsync, ServerUnlinkXboxAccountAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationServerLoginWithXboxAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationServerLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationServerLoginWithXboxAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, +/// E_PF_XBOX_INACCESSIBLE, E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, E_PF_XBOX_XASS_EXCHANGE_FAILURE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAuthenticationServerLoginWithXboxGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationServerLoginWithXboxAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, +/// E_PF_XBOX_INACCESSIBLE, E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, E_PF_XBOX_XASS_EXCHANGE_FAILURE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// If the PFAuthenticationServerLoginWithXboxAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationServerLoginWithXboxGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Signs the user in using an Xbox ID and Sandbox ID, returning a session identifier that can subsequently +/// be used for API calls which require an authenticated user +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Title Secret Key used to authenticate the service request. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// If this is the first time a user has signed in with the Xbox ID and CreateAccount is set to true, +/// a new PlayFab account will be created and linked to the Xbox Live account. In this case, no email +/// or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked +/// to the Xbox Live account, an error indicating this will be returned, so that the title can guide the +/// user through creation of a PlayFab account. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationServerLoginWithXboxIdAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithXboxIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFAuthenticationServerLoginWithXboxIdAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_XBOX_INACCESSIBLE, E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, +/// E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationServerLoginWithXboxIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the result from a PFAuthenticationServerLoginWithXboxIdAsync call. The PFEntityHandle will always be returned, but the additional info +/// in the PFAuthenticationLoginResult is only returned if a buffer is provided. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// The size of the buffer for the result object. +/// Byte buffer used for the Login result value and its fields. +/// Pointer to the LoginResult object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED, E_PF_XBOX_INACCESSIBLE, E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST, +/// E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationServerLoginWithXboxIdAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. If returned, 'result' is a pointer within 'buffer' and does not need to be freed separately. +/// +PF_API PFAuthenticationServerLoginWithXboxIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Create a game_server entity token and return a new or existing game_server entity. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Create or return a game_server entity token. Caller must be a title entity. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationAuthenticateCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a AuthenticateGameServerWithCustomId call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAuthenticationAuthenticateGameServerWithCustomIdAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationAuthenticateCustomIdResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if 0 +/// +/// Delete a game_server entity. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Delete a game_server entity. The caller can be the game_server entity attempting to delete itself. +/// Or a title entity attempting to delete game_server entities for this title. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFAuthenticationDeleteAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationDeleteRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#endif + +#if 0 +/// +/// Method to exchange a legacy AuthenticationTicket or title SecretKey for an Entity Token or to refresh +/// a still valid Entity Token. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API must be called with X-SecretKey, X-Authentication or X-EntityToken headers. An optional +/// EntityKey may be included to attempt to set the resulting EntityToken to a specific entity, however +/// the entity must be a relation of the caller, such as the master_player_account of a character. If +/// sending X-EntityToken the account will be marked as freshly logged in and will issue a new token. +/// If using X-Authentication or X-EntityToken the header must still be valid and cannot be expired or +/// revoked. +/// +/// When the asynchronous task is complete, call to +/// get the result. +/// +PF_API PFAuthenticationGetEntityAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationGetEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFAuthenticationGetEntityAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_BROKEN, +/// E_PF_NO_VALID_CERTIFICATE_FOR_AAD or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationGetEntityAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. +/// +PF_API PFAuthenticationGetEntityGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* result +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +/// +/// Method to exchange a legacy AuthenticationTicket or title SecretKey for an Entity Token or to refresh +/// a still valid Entity Token. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Title Secret Key used to authenticate the service request. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32. +/// This API must be called with X-SecretKey, X-Authentication or X-EntityToken headers. An optional +/// EntityKey may be included to attempt to set the resulting EntityToken to a specific entity, however +/// the entity must be a relation of the caller, such as the master_player_account of a character. If +/// sending X-EntityToken the account will be marked as freshly logged in and will issue a new token. +/// If using X-Authentication or X-EntityToken the header must still be valid and cannot be expired or +/// revoked. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAuthenticationGetEntityWithSecretKeyAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationGetEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFAuthenticationGetEntityWithSecretKeyAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFEntityHandle which can be used to authenticate other PlayFab API calls. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_BROKEN, +/// E_PF_NO_VALID_CERTIFICATE_FOR_AAD or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// If the PFAuthenticationGetEntityWithSecretKeyAsync call fails, entityHandle with be null. Otherwise, the handle must be closed with PFEntityCloseHandle +/// when it is no longer needed. +/// +PF_API PFAuthenticationGetEntityWithSecretKeyGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* result +) noexcept; + +#endif + +#if 0 +/// +/// Method for a server to validate a client provided EntityToken. Only callable by the title entity. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Given an entity token, validates that it hasn't expired or been revoked and will return details of +/// the owner. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAuthenticationValidateEntityTokenAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationValidateEntityTokenRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ValidateEntityToken call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAuthenticationValidateEntityTokenGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAuthenticationValidateEntityTokenAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAuthenticationValidateEntityTokenGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationValidateEntityTokenResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +} diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/PFAuthenticationTypes.h b/Source/PlayFabCore/Include/Generated/playfab/core/PFAuthenticationTypes.h new file mode 100644 index 0000000..c3f8df2 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/PFAuthenticationTypes.h @@ -0,0 +1,1558 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +#include + +#if HC_PLATFORM == HC_PLATFORM_GDK +#include +#endif + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// IdentifiedDeviceType enum. +/// +enum class PFAuthenticationIdentifiedDeviceType : uint32_t +{ + Unknown, + XboxOne, + Scarlett +}; + +/// +/// PFAuthenticationGetPhotonAuthenticationTokenRequest data model. +/// +typedef struct PFAuthenticationGetPhotonAuthenticationTokenRequest +{ + /// + /// The Photon applicationId for the game you wish to log into. + /// + _Null_terminated_ const char* photonApplicationId; + +} PFAuthenticationGetPhotonAuthenticationTokenRequest; + +/// +/// PFAuthenticationGetPhotonAuthenticationTokenResult data model. +/// +typedef struct PFAuthenticationGetPhotonAuthenticationTokenResult +{ + /// + /// (Optional) The Photon authentication token for this game-session. + /// + _Maybenull_ _Null_terminated_ const char* photonCustomAuthenticationToken; + +} PFAuthenticationGetPhotonAuthenticationTokenResult; + +/// +/// PFAuthenticationGetTitlePublicKeyRequest data model. An RSA CSP blob to be used to encrypt the payload +/// of account creation requests when that API requires a signature header. For example if Client/LoginWithCustomId +/// requires signature headers but the player does not have an account yet follow these steps: 1) Call +/// Client/GetTitlePublicKey with one of the title's shared secrets. 2) Convert the Base64 encoded CSP +/// blob to a byte array and create an RSA signing object. 3) Encrypt the UTF8 encoded JSON body of the +/// registration request and place the Base64 encoded result into the EncryptedRequest and with the TitleId +/// field, all other fields can be left empty when performing the API request. 4) Client receives authentication +/// token as normal. Future requests to LoginWithCustomId will require the X-PlayFab-Signature header. +/// +typedef struct PFAuthenticationGetTitlePublicKeyRequest +{ + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab + /// developer site when a title has been selected. + /// + _Null_terminated_ const char* titleId; + + /// + /// The shared secret key for this title. + /// + _Null_terminated_ const char* titleSharedSecret; + +} PFAuthenticationGetTitlePublicKeyRequest; + +/// +/// PFAuthenticationGetTitlePublicKeyResult data model. +/// +typedef struct PFAuthenticationGetTitlePublicKeyResult +{ + /// + /// (Optional) Base64 encoded RSA CSP byte array blob containing the title's public RSA key. + /// + _Maybenull_ _Null_terminated_ const char* RSAPublicKey; + +} PFAuthenticationGetTitlePublicKeyResult; + +/// +/// PFAuthenticationLoginWithAndroidDeviceIDRequest data model. On Android devices, the recommendation +/// is to use the Settings.Secure.ANDROID_ID as the AndroidDeviceId, as described in this blog post (http://android-developers.blogspot.com/2011/03/identifying-app-installations.html). +/// More information on this identifier can be found in the Android documentation (http://developer.android.com/reference/android/provider/Settings.Secure.html). +/// If this is the first time a user has signed in with the Android device and CreateAccount is set to +/// true, a new PlayFab account will be created and linked to the Android device ID. In this case, no +/// email or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is +/// linked to the Android device, an error indicating this will be returned, so that the title can guide +/// the user through creation of a PlayFab account. Please note that while multiple devices of this type +/// can be linked to a single user account, only the one most recently used to login (or most recently +/// linked) will be reflected in the user's account information. We will be updating to show all linked +/// devices in a future release. +/// +typedef struct PFAuthenticationLoginWithAndroidDeviceIDRequest +{ + /// + /// (Optional) Specific model of the user's device. + /// + _Maybenull_ _Null_terminated_ const char* androidDevice; + + /// + /// Android device identifier for the user's device. + /// + _Null_terminated_ const char* androidDeviceId; + + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Specific Operating System version for the user's device. + /// + _Maybenull_ _Null_terminated_ const char* OS; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithAndroidDeviceIDRequest; + +/// +/// PFAuthenticationUserSettings data model. +/// +typedef struct PFAuthenticationUserSettings +{ + /// + /// Boolean for whether this player is eligible for gathering device info. + /// + bool gatherDeviceInfo; + + /// + /// Boolean for whether this player should report OnFocus play-time tracking. + /// + bool gatherFocusInfo; + + /// + /// Boolean for whether this player is eligible for ad tracking. + /// + bool needsAttribution; + +} PFAuthenticationUserSettings; + +/// +/// PFAuthenticationLoginResult data model. +/// +typedef struct PFAuthenticationLoginResult +{ + /// + /// (Optional) Results for requested info. + /// + _Maybenull_ PFGetPlayerCombinedInfoResultPayload const* infoResultPayload; + + /// + /// (Optional) The time of this user's previous login. If there was no previous login, then it's + /// DateTime.MinValue. + /// + _Maybenull_ time_t const* lastLoginTime; + + /// + /// True if the account was newly created on this login. + /// + bool newlyCreated; + + /// + /// (Optional) Player's unique PlayFabId. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Settings specific to this user. + /// + _Maybenull_ PFAuthenticationUserSettings const* settingsForUser; + + /// + /// (Optional) The experimentation treatments for this user at the time of login. + /// + _Maybenull_ PFTreatmentAssignment const* treatmentAssignment; + +} PFAuthenticationLoginResult; + +/// +/// PFAuthenticationLoginWithAppleRequest data model. +/// +typedef struct PFAuthenticationLoginWithAppleRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The JSON Web token (JWT) returned by Apple after login. Represented as the identityToken field + /// in the authorization credential payload. If you choose to ignore the expiration date for identity + /// tokens, you will receive an NotAuthorized error if Apple rotates the signing key. In this case, + /// users have to login to provide a fresh identity token. + /// + _Null_terminated_ const char* identityToken; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithAppleRequest; + +/// +/// PFAuthenticationLoginWithCustomIDRequest data model. It is highly recommended that developers ensure +/// that it is extremely unlikely that a customer could generate an ID which is already in use by another +/// customer. If this is the first time a user has signed in with the Custom ID and CreateAccount is set +/// to true, a new PlayFab account will be created and linked to the Custom ID. In this case, no email +/// or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked +/// to the Custom ID, an error indicating this will be returned, so that the title can guide the user +/// through creation of a PlayFab account. +/// +typedef struct PFAuthenticationLoginWithCustomIDRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// Custom unique identifier for the user, generated by the title. + /// + _Null_terminated_ const char* customId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithCustomIDRequest; + +/// +/// PFAuthenticationLoginWithEmailAddressRequest data model. Email address and password lengths are provided +/// for information purposes. The server will validate that data passed in conforms to the field definition +/// and report errors appropriately. It is recommended that developers not perform this validation locally, +/// so that future updates do not require client updates. +/// +typedef struct PFAuthenticationLoginWithEmailAddressRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Email address for the account. + /// + _Null_terminated_ const char* email; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// Password for the PlayFab account (6-100 characters). + /// + _Null_terminated_ const char* password; + +} PFAuthenticationLoginWithEmailAddressRequest; + +/// +/// PFAuthenticationLoginWithFacebookRequest data model. Facebook sign-in is accomplished using the Facebook +/// User Access Token. More information on the Token can be found in the Facebook developer documentation +/// (https://developers.facebook.com/docs/facebook-login/access-tokens/). In Unity, for example, the Token +/// is available as AccessToken in the Facebook SDK ScriptableObject FB. If this is the first time a user +/// has signed in with the Facebook account and CreateAccount is set to true, a new PlayFab account will +/// be created and linked to the provided account's Facebook ID. In this case, no email or username will +/// be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Facebook +/// account, an error indicating this will be returned, so that the title can guide the user through creation +/// of a PlayFab account. Note that titles should never re-use the same Facebook applications between +/// PlayFab Title IDs, as Facebook provides unique user IDs per application and doing so can result in +/// issues with the Facebook ID for the user in their PlayFab account information. If you must re-use +/// an application in a new PlayFab Title ID, please be sure to first unlink all accounts from Facebook, +/// or delete all users in the first Title ID. +/// +typedef struct PFAuthenticationLoginWithFacebookRequest +{ + /// + /// Unique identifier from Facebook for the user. + /// + _Null_terminated_ const char* accessToken; + + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithFacebookRequest; + +/// +/// PFAuthenticationLoginWithFacebookInstantGamesIdRequest data model. +/// +typedef struct PFAuthenticationLoginWithFacebookInstantGamesIdRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Facebook Instant Games signature for the user. + /// + _Null_terminated_ const char* facebookInstantGamesSignature; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithFacebookInstantGamesIdRequest; + +/// +/// PFAuthenticationLoginWithGameCenterRequest data model. The Game Center player identifier (https://developer.apple.com/library/ios/documentation/Accounts/Reference/ACAccountClassRef/index.html#//apple_ref/occ/instp/ACAccount/identifier) +/// is a generated string which is stored on the local device. As with device identifiers, care must be +/// taken to never expose a player's Game Center identifier to end users, as that could result in a user's +/// account being compromised. If this is the first time a user has signed in with Game Center and CreateAccount +/// is set to true, a new PlayFab account will be created and linked to the Game Center identifier. In +/// this case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab +/// account is linked to the Game Center account, an error indicating this will be returned, so that the +/// title can guide the user through creation of a PlayFab account. If an invalid iOS Game Center player +/// identifier is used, an error indicating this will be returned. +/// +typedef struct PFAuthenticationLoginWithGameCenterRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Unique Game Center player id. + /// + _Maybenull_ _Null_terminated_ const char* playerId; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// (Optional) The URL for the public encryption key that will be used to verify the signature. + /// + _Maybenull_ _Null_terminated_ const char* publicKeyUrl; + + /// + /// (Optional) A random value used to compute the hash and keep it randomized. + /// + _Maybenull_ _Null_terminated_ const char* salt; + + /// + /// (Optional) The verification signature of the authentication payload. + /// + _Maybenull_ _Null_terminated_ const char* signature; + + /// + /// (Optional) The integer representation of date and time that the signature was created on. PlayFab + /// will reject authentication signatures not within 10 minutes of the server's current time. + /// + _Maybenull_ _Null_terminated_ const char* timestamp; + +} PFAuthenticationLoginWithGameCenterRequest; + +/// +/// PFAuthenticationLoginWithGoogleAccountRequest data model. Google sign-in is accomplished by obtaining +/// a Google OAuth 2.0 credential using the Google sign-in for Android APIs on the device and passing +/// it to this API. If this is the first time a user has signed in with the Google account and CreateAccount +/// is set to true, a new PlayFab account will be created and linked to the Google account. Otherwise, +/// if no PlayFab account is linked to the Google account, an error indicating this will be returned, +/// so that the title can guide the user through creation of a PlayFab account. The current (recommended) +/// method for obtaining a Google account credential in an Android application is to call GoogleSignInAccount.getServerAuthCode() +/// and send the auth code as the ServerAuthCode parameter of this API. Before doing this, you must create +/// an OAuth 2.0 web application client ID in the Google API Console and configure its client ID and secret +/// in the PlayFab Game Manager Google Add-on for your title. This method does not require prompting of +/// the user for additional Google account permissions, resulting in a user experience with the least +/// possible friction. For more information about obtaining the server auth code, see https://developers.google.com/identity/sign-in/android/offline-access. +/// The previous (deprecated) method was to obtain an OAuth access token by calling GetAccessToken() on +/// the client and passing it as the AccessToken parameter to this API. for the with the Google OAuth +/// 2.0 Access Token. More information on this change can be found in the Google developer documentation +/// (https://android-developers.googleblog.com/2016/01/play-games-permissions-are-changing-in.html). +/// +typedef struct PFAuthenticationLoginWithGoogleAccountRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the getServerAuthCode() + /// (https://developers.google.com/identity/sign-in/android/offline-access) Google client API. + /// + _Null_terminated_ const char* serverAuthCode; + + /// + /// (Optional) Optional boolean to opt out of setting the MPA email when creating a Google account, + /// defaults to true. + /// + _Maybenull_ bool const* setEmail; + +} PFAuthenticationLoginWithGoogleAccountRequest; + +/// +/// PFAuthenticationLoginWithGooglePlayGamesServicesRequest data model. Google Play Games sign-in is +/// accomplished by obtaining a Google OAuth 2.0 credential using the Google Play Games sign-in for Android +/// APIs on the device and passing it to this API. If this is the first time a user has signed in with +/// the Google Play Games account and CreateAccount is set to true, a new PlayFab account will be created +/// and linked to the Google Play Games account. Otherwise, if no PlayFab account is linked to the Google +/// Play Games account, an error indicating this will be returned, so that the title can guide the user +/// through creation of a PlayFab account. The current (recommended) method for obtaining a Google Play +/// Games account credential in an Android application is to call GamesSignInClient.requestServerSideAccess() +/// and send the auth code as the ServerAuthCode parameter of this API. Before doing this, you must create +/// an OAuth 2.0 web application client ID in the Google API Console and configure its client ID and secret +/// in the PlayFab Game Manager Google Add-on for your title. This method does not require prompting of +/// the user for additional Google account permissions, resulting in a user experience with the least +/// possible friction. For more information about obtaining the server auth code, see https://developers.google.com/games/services/android/signin. +/// +typedef struct PFAuthenticationLoginWithGooglePlayGamesServicesRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the requestServerSideAccess() + /// (https://developers.google.com/games/services/android/signin) Google Play Games client API. + /// + _Null_terminated_ const char* serverAuthCode; + +} PFAuthenticationLoginWithGooglePlayGamesServicesRequest; + +/// +/// PFAuthenticationLoginWithIOSDeviceIDRequest data model. On iOS devices, the identifierForVendor (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDevice_Class/index.html#//apple_ref/occ/instp/UIDevice/identifierForVendor) +/// must be used as the DeviceId, as the UIDevice uniqueIdentifier has been deprecated as of iOS 5, and +/// use of the advertisingIdentifier for this purpose will result in failure of Apple's certification +/// process. If this is the first time a user has signed in with the iOS device and CreateAccount is set +/// to true, a new PlayFab account will be created and linked to the vendor-specific iOS device ID. In +/// this case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab +/// account is linked to the iOS device, an error indicating this will be returned, so that the title +/// can guide the user through creation of a PlayFab account. Please note that while multiple devices +/// of this type can be linked to a single user account, only the one most recently used to login (or +/// most recently linked) will be reflected in the user's account information. We will be updating to +/// show all linked devices in a future release. +/// +typedef struct PFAuthenticationLoginWithIOSDeviceIDRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Vendor-specific iOS identifier for the user's device. + /// + _Null_terminated_ const char* deviceId; + + /// + /// (Optional) Specific model of the user's device. + /// + _Maybenull_ _Null_terminated_ const char* deviceModel; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Specific Operating System version for the user's device. + /// + _Maybenull_ _Null_terminated_ const char* OS; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithIOSDeviceIDRequest; + +/// +/// PFAuthenticationLoginWithKongregateRequest data model. More details regarding Kongregate and their +/// game authentication system can be found at http://developers.kongregate.com/docs/virtual-goods/authentication. +/// Developers must provide the Kongregate user ID and auth token that are generated using the Kongregate +/// client library. PlayFab will combine these identifiers with the title's unique Kongregate app ID to +/// log the player into the Kongregate system. If CreateAccount is set to true and there is not already +/// a user matched to this Kongregate ID, then PlayFab will create a new account for this user and link +/// the ID. In this case, no email or username will be associated with the PlayFab account. If there is +/// already a different PlayFab user linked with this account, then an error will be returned. +/// +typedef struct PFAuthenticationLoginWithKongregateRequest +{ + /// + /// Token issued by Kongregate's client API for the user. + /// + _Null_terminated_ const char* authTicket; + + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// Numeric user ID assigned by Kongregate. + /// + _Null_terminated_ const char* kongregateId; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithKongregateRequest; + +/// +/// PFAuthenticationLoginWithNintendoServiceAccountRequest data model. +/// +typedef struct PFAuthenticationLoginWithNintendoServiceAccountRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The JSON Web token (JWT) returned by Nintendo after login. + /// + _Null_terminated_ const char* identityToken; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithNintendoServiceAccountRequest; + +/// +/// PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest data model. +/// +typedef struct PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Nintendo Switch unique identifier for the user's device. + /// + _Maybenull_ _Null_terminated_ const char* nintendoSwitchDeviceId; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest; + +/// +/// PFAuthenticationLoginWithOpenIdConnectRequest data model. +/// +typedef struct PFAuthenticationLoginWithOpenIdConnectRequest +{ + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum + /// 100 characters. + /// + _Null_terminated_ const char* connectionId; + + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The JSON Web token (JWT) returned by the identity provider after login. Represented as the id_token + /// field in the identity provider's response. + /// + _Null_terminated_ const char* idToken; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithOpenIdConnectRequest; + +/// +/// PFAuthenticationLoginWithPlayFabRequest data model. Username and password lengths are provided for +/// information purposes. The server will validate that data passed in conforms to the field definition +/// and report errors appropriately. It is recommended that developers not perform this validation locally, +/// so that future updates to the username or password do not require client updates. +/// +typedef struct PFAuthenticationLoginWithPlayFabRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// Password for the PlayFab account (6-100 characters). + /// + _Null_terminated_ const char* password; + + /// + /// PlayFab username for the account. + /// + _Null_terminated_ const char* username; + +} PFAuthenticationLoginWithPlayFabRequest; + +/// +/// PFAuthenticationLoginWithPSNRequest data model. If this is the first time a user has signed in with +/// the PlayStation :tm: Network account and CreateAccount is set to true, a new PlayFab account will +/// be created and linked to the PlayStation :tm: Network account. In this case, no email or username +/// will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the PlayStation +/// :tm: Network account, an error indicating this will be returned, so that the title can guide the user +/// through creation of a PlayFab account. +/// +typedef struct PFAuthenticationLoginWithPSNRequest +{ + /// + /// Auth code provided by the PlayStation :tm: Network OAuth provider. + /// + _Null_terminated_ const char* authCode; + + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Id of the PlayStation :tm: Network issuer environment. If null, defaults to production + /// environment. + /// + _Maybenull_ int32_t const* issuerId; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// (Optional) Redirect URI supplied to PlayStation :tm: Network when requesting an auth code. + /// + _Maybenull_ _Null_terminated_ const char* redirectUri; + +} PFAuthenticationLoginWithPSNRequest; + +/// +/// PFAuthenticationLoginWithSteamRequest data model. Steam sign-in is accomplished with the Steam Session +/// Ticket. More information on the Ticket can be found in the Steamworks SDK, here: https://partner.steamgames.com/documentation/auth. +/// NOTE: For Steam authentication to work, the title must be configured with the Steam Application ID +/// and Web API Key in the PlayFab Game Manager (under Steam in the Add-ons Marketplace). You can obtain +/// a Web API Key from the Permissions page of any Group associated with your App ID in the Steamworks +/// site. If this is the first time a user has signed in with the Steam account and CreateAccount is set +/// to true, a new PlayFab account will be created and linked to the provided account's Steam ID. In this +/// case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab account +/// is linked to the Steam account, an error indicating this will be returned, so that the title can guide +/// the user through creation of a PlayFab account. +/// +typedef struct PFAuthenticationLoginWithSteamRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// Authentication token for the user, returned as a byte array from Steam, and converted to a string + /// (for example, the byte 0x08 should become "08"). + /// + _Null_terminated_ const char* steamTicket; + + /// + /// (Optional) True if ticket was generated using ISteamUser::GetAuthTicketForWebAPI() using "AzurePlayFab" + /// as the identity string. False if the ticket was generated with ISteamUser::GetAuthSessionTicket(). + /// + _Maybenull_ bool const* ticketIsServiceSpecific; + +} PFAuthenticationLoginWithSteamRequest; + +/// +/// PFAuthenticationLoginWithTwitchRequest data model. More details regarding Twitch and their authentication +/// system can be found at https://github.com/justintv/Twitch-API/blob/master/authentication.md. Developers +/// must provide the Twitch access token that is generated using one of the Twitch authentication flows. +/// PlayFab will use the title's unique Twitch Client ID to authenticate the token and log in to the PlayFab +/// system. If CreateAccount is set to true and there is not already a user matched to the Twitch username +/// that generated the token, then PlayFab will create a new account for this user and link the ID. In +/// this case, no email or username will be associated with the PlayFab account. If there is already a +/// different PlayFab user linked with this account, then an error will be returned. +/// +typedef struct PFAuthenticationLoginWithTwitchRequest +{ + /// + /// Token issued by Twitch's API for the user. + /// + _Null_terminated_ const char* accessToken; + + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationLoginWithTwitchRequest; + +/// +/// PFAuthenticationLoginWithXboxRequest data model. If this is the first time a user has signed in with +/// the Xbox Live account and CreateAccount is set to true, a new PlayFab account will be created and +/// linked to the Xbox Live account. In this case, no email or username will be associated with the PlayFab +/// account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error indicating +/// this will be returned, so that the title can guide the user through creation of a PlayFab account. +/// +typedef struct PFAuthenticationLoginWithXboxRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", + /// ""). + /// + _Null_terminated_ const char* xboxToken; + +} PFAuthenticationLoginWithXboxRequest; + +#if HC_PLATFORM == HC_PLATFORM_GDK +/// +/// PFAuthenticationLoginWithXUserRequest data model. If this is the first time a user has signed in with +/// the Xbox Live account and CreateAccount is set to true, a new PlayFab account will be created and +/// linked to the Xbox Live account. In this case, no email or username will be associated with the PlayFab +/// account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error indicating +/// this will be returned, so that the title can guide the user through creation of a PlayFab account. +/// Request object for PFAuthenticationLoginWithXUserAsync. +/// +typedef struct PFAuthenticationLoginWithXUserRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// XUserHandle returned from XUserAddAsync or XUserAddByIdWithUiAsync. + /// + XUserHandle user; + +} PFAuthenticationLoginWithXUserRequest; +#endif + +/// +/// PFAuthenticationRegisterPlayFabUserRequest data model. +/// +typedef struct PFAuthenticationRegisterPlayFabUserRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) An optional parameter for setting the display name for this title (3-25 characters). + /// + _Maybenull_ _Null_terminated_ const char* displayName; + + /// + /// (Optional) User email address attached to their account. + /// + _Maybenull_ _Null_terminated_ const char* email; + + /// + /// (Optional) Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise + /// Only). + /// + _Maybenull_ _Null_terminated_ const char* encryptedRequest; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Password for the PlayFab account (6-100 characters). + /// + _Maybenull_ _Null_terminated_ const char* password; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// (Optional) An optional parameter that specifies whether both the username and email parameters + /// are required. If true, both parameters are required; if false, the user must supply either the + /// username or email parameter. The default value is true. + /// + _Maybenull_ bool const* requireBothUsernameAndEmail; + + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab + /// developer site when a title has been selected. + /// + _Null_terminated_ const char* titleId; + + /// + /// (Optional) PlayFab username for the account (3-20 characters). + /// + _Maybenull_ _Null_terminated_ const char* username; + +} PFAuthenticationRegisterPlayFabUserRequest; + +/// +/// PFAuthenticationRegisterPlayFabUserResult data model. Each account must have a unique email address +/// in the PlayFab service. Once created, the account may be associated with additional accounts (Steam, +/// Facebook, Game Center, etc.), allowing for added social network lists and achievements systems. +/// +typedef struct PFAuthenticationRegisterPlayFabUserResult +{ + /// + /// (Optional) PlayFab unique identifier for this newly created account. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Settings specific to this user. + /// + _Maybenull_ PFAuthenticationUserSettings const* settingsForUser; + + /// + /// (Optional) PlayFab unique user name. + /// + _Maybenull_ _Null_terminated_ const char* username; + +} PFAuthenticationRegisterPlayFabUserResult; + +/// +/// PFAuthenticationSetPlayerSecretRequest data model. APIs that require signatures require that the +/// player have a configured Player Secret Key that is used to sign all requests. Players that don't have +/// a secret will be blocked from making API calls until it is configured. To create a signature header +/// add a SHA256 hashed string containing UTF8 encoded JSON body as it will be sent to the server, the +/// current time in UTC formatted to ISO 8601, and the players secret formatted as 'body.date.secret'. +/// Place the resulting hash into the header X-PlayFab-Signature, along with a header X-PlayFab-Timestamp +/// of the same UTC timestamp used in the signature. +/// +typedef struct PFAuthenticationSetPlayerSecretRequest +{ + /// + /// (Optional) Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise + /// Only). + /// + _Maybenull_ _Null_terminated_ const char* encryptedRequest; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + +} PFAuthenticationSetPlayerSecretRequest; + +/// +/// PFAuthenticationLoginWithServerCustomIdRequest data model. +/// +typedef struct PFAuthenticationLoginWithServerCustomIdRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// (Optional) Player secret that is used to verify API request signatures (Enterprise Only). + /// + _Maybenull_ _Null_terminated_ const char* playerSecret; + + /// + /// The backend server identifier for this player. + /// + _Null_terminated_ const char* serverCustomId; + +} PFAuthenticationLoginWithServerCustomIdRequest; + +/// +/// PFAuthenticationLoginWithSteamIdRequest data model. If this is the first time a user has signed in +/// with the Steam ID and CreateAccount is set to true, a new PlayFab account will be created and linked +/// to the Steam account. In this case, no email or username will be associated with the PlayFab account. +/// Otherwise, if no PlayFab account is linked to the Steam account, an error indicating this will be +/// returned, so that the title can guide the user through creation of a PlayFab account. Steam users +/// that are not logged into the Steam Client app will only have their Steam username synced, other data, +/// such as currency and country will not be available until they login while the Client is open. +/// +typedef struct PFAuthenticationLoginWithSteamIdRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// Unique Steam identifier for a user. + /// + _Null_terminated_ const char* steamId; + +} PFAuthenticationLoginWithSteamIdRequest; + +/// +/// PFAuthenticationServerLoginWithXboxRequest data model. If this is the first time a user has signed +/// in with the Xbox Live account and CreateAccount is set to true, a new PlayFab account will be created +/// and linked to the Xbox Live account. In this case, no email or username will be associated with the +/// PlayFab account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error indicating +/// this will be returned, so that the title can guide the user through creation of a PlayFab account. +/// +typedef struct PFAuthenticationServerLoginWithXboxRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", + /// ""). + /// + _Null_terminated_ const char* xboxToken; + +} PFAuthenticationServerLoginWithXboxRequest; + +/// +/// PFAuthenticationLoginWithXboxIdRequest data model. If this is the first time a user has signed in +/// with the Xbox ID and CreateAccount is set to true, a new PlayFab account will be created and linked +/// to the Xbox Live account. In this case, no email or username will be associated with the PlayFab account. +/// Otherwise, if no PlayFab account is linked to the Xbox Live account, an error indicating this will +/// be returned, so that the title can guide the user through creation of a PlayFab account. +/// +typedef struct PFAuthenticationLoginWithXboxIdRequest +{ + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + bool createAccount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Flags for which pieces of info to return for the user. + /// + _Maybenull_ PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// The id of Xbox Live sandbox. + /// + _Null_terminated_ const char* sandbox; + + /// + /// Unique Xbox identifier for a user. + /// + _Null_terminated_ const char* xboxId; + +} PFAuthenticationLoginWithXboxIdRequest; + +#if HC_PLATFORM != HC_PLATFORM_GDK +/// +/// PFAuthenticationAuthenticateCustomIdRequest data model. Create or return a game_server entity token. +/// Caller must be a title entity. +/// +typedef struct PFAuthenticationAuthenticateCustomIdRequest +{ + /// + /// The customId used to create and retrieve game_server entity tokens. This is unique at the title + /// level. CustomId must be between 32 and 100 characters. + /// + _Null_terminated_ const char* customId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAuthenticationAuthenticateCustomIdRequest; +#endif + +/// +/// PFAuthenticationEntityTokenResponse data model. +/// +typedef struct PFAuthenticationEntityTokenResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The token used to set X-EntityToken for all entity based API calls. + /// + _Maybenull_ _Null_terminated_ const char* entityToken; + + /// + /// (Optional) The time the token will expire, if it is an expiring token, in UTC. + /// + _Maybenull_ time_t const* tokenExpiration; + +} PFAuthenticationEntityTokenResponse; + +#if HC_PLATFORM != HC_PLATFORM_GDK +/// +/// PFAuthenticationAuthenticateCustomIdResult data model. +/// +typedef struct PFAuthenticationAuthenticateCustomIdResult +{ + /// + /// (Optional) The token generated used to set X-EntityToken for game_server calls. + /// + _Maybenull_ PFAuthenticationEntityTokenResponse const* entityToken; + + /// + /// True if the account was newly created on this authentication. + /// + bool newlyCreated; + +} PFAuthenticationAuthenticateCustomIdResult; +#endif + +/// +/// PFAuthenticationDeleteRequest data model. Delete a game_server entity. The caller can be the game_server +/// entity attempting to delete itself. Or a title entity attempting to delete game_server entities for +/// this title. +/// +typedef struct PFAuthenticationDeleteRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The game_server entity to be removed. + /// + PFEntityKey const* entity; + +} PFAuthenticationDeleteRequest; + +/// +/// PFAuthenticationGetEntityRequest data model. This API must be called with X-SecretKey, X-Authentication +/// or X-EntityToken headers. An optional EntityKey may be included to attempt to set the resulting EntityToken +/// to a specific entity, however the entity must be a relation of the caller, such as the master_player_account +/// of a character. If sending X-EntityToken the account will be marked as freshly logged in and will +/// issue a new token. If using X-Authentication or X-EntityToken the header must still be valid and cannot +/// be expired or revoked. +/// +typedef struct PFAuthenticationGetEntityRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFAuthenticationGetEntityRequest; + +/// +/// PFAuthenticationValidateEntityTokenRequest data model. Given an entity token, validates that it hasn't +/// expired or been revoked and will return details of the owner. +/// +typedef struct PFAuthenticationValidateEntityTokenRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Client EntityToken. + /// + _Null_terminated_ const char* entityToken; + +} PFAuthenticationValidateEntityTokenRequest; + +/// +/// PFAuthenticationValidateEntityTokenResponse data model. +/// +typedef struct PFAuthenticationValidateEntityTokenResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The authenticated device for this entity, for the given login. + /// + _Maybenull_ PFAuthenticationIdentifiedDeviceType const* identifiedDeviceType; + + /// + /// (Optional) The identity provider for this entity, for the given login. + /// + _Maybenull_ PFLoginIdentityProvider const* identityProvider; + + /// + /// (Optional) The ID issued by the identity provider, e.g. a XUID on Xbox Live. + /// + _Maybenull_ _Null_terminated_ const char* identityProviderIssuedId; + + /// + /// (Optional) The lineage of this profile. + /// + _Maybenull_ PFEntityLineage const* lineage; + +} PFAuthenticationValidateEntityTokenResponse; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/PFEntity.h b/Source/PlayFabCore/Include/Generated/playfab/core/PFEntity.h new file mode 100644 index 0000000..8f5bd1f --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/PFEntity.h @@ -0,0 +1,290 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include +#include +#include + +extern "C" +{ + +/// +/// Handle to an authenticated Entity (TitlePlayer, Title, etc.). Contains the auth tokens needed to make PlayFab service +/// calls. When no longer needed, the Entity handle must be closed with PFEntityCloseHandle. +/// +typedef struct PFEntity* PFEntityHandle; + +/// +/// Entity type for all TitlePlayer Entities. This const value can be used to populate PFEntityKeys referring to TitlePlayer Entities. +/// +static const char* PFEntityTitlePlayerEntityType = "title_player_account"; + +/// +/// PlayFab EntityToken and its expiration time. Used to authenticate PlayFab service calls. +/// +typedef struct PFEntityToken +{ + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + const char* token; + + /// + /// (Optional) The time the token will expire, if it is an expiring token, in UTC. + /// + time_t const* expiration; + +} PFEntityToken; + +/// +/// Duplicates a PFEntityHandle. +/// +/// Entity handle to duplicate. +/// The duplicated handle. +/// Result code for this API operation. +/// +/// Both the duplicated handle and the original handle need to be closed with PFEntityCloseHandle when they +/// are no longer needed. +/// +PF_API PFEntityDuplicateHandle( + _In_ PFEntityHandle entityHandle, + _Out_ PFEntityHandle* duplicatedEntityHandle +) noexcept; + +/// +/// Closes a PFEntityHandle. +/// +/// Entity handle to close. +/// Result code for this API operation. +PF_API_(void) PFEntityCloseHandle( + _In_ PFEntityHandle entityHandle +) noexcept; + +/// +/// Get the cached PFEntityToken for an Entity. +/// +/// PFEntityHandle returned from a login call. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +PF_API PFEntityGetEntityTokenAsync( + _In_ PFEntityHandle entityHandle, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PFEntityGetEntityTokenAsync call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// Result code for this API operation. +PF_API PFEntityGetEntityTokenResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFEntityGetEntityTokenAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the EntityToken object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// entityToken is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEntityGetEntityTokenResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ const PFEntityToken** entityToken, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if HC_PLATFORM != HC_PLATFORM_GDK +/// +/// Gets the size of the buffer needed to hold the PlayFab secretKey. Will fail with E_PF_NOSECRETKEY if there is no +/// Secret Key associated with the provided Entity. +/// +/// Entity handle. +/// Buffer size required for the secretKey (including null terminator). +/// Result code for this API operation. +PF_API PFEntityGetSecretKeySize( + _In_ PFEntityHandle handle, + _Out_ size_t* secretKeySize +) noexcept; + +/// +/// Gets the PlayFab secretKey associated with a title Entity. Will fail with E_PF_NOSECRETKEY if there is no Secret +/// Key associated with the provided Entity. +/// +/// Entity handle. +/// Size of the provided buffer. Required size can be obtained via PFServiceConfigGetSecretKeySize. +/// Buffer the secretKey will be written to. +/// The number of bytes used in the buffer including the null terminator. +/// Result code for this API operation. +PF_API PFEntityGetSecretKey( + _In_ PFEntityHandle handle, + _In_ size_t secretKeySize, + _Out_writes_(secretKeySize) char* secretKey, + _Out_opt_ size_t* secretKeyUsed +) noexcept; +#endif + + +/// +/// Get the size in bytes needed to store the PFEntityKey for an Entity. +/// +/// PFEntityHandle returned from a auth call. +/// The buffer size in bytes required for the EntityKey. +/// Result code for this API operation. +PF_API PFEntityGetEntityKeySize( + _In_ PFEntityHandle entityHandle, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Get the PFEntityKey for an entity. +/// +/// PFEntityHandle returned from a auth call. +/// The size of the buffer for the PFEntityKey. The required size can be obtained from PFEntityGetEntityKeySize. +/// Byte buffer used for the PFEntityKey and its fields. +/// Pointer to the PFEntityKey object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// entityKey is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEntityGetEntityKey( + _In_ PFEntityHandle entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ const PFEntityKey** entityKey, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Convenience method to check if an Entity is a Title Player. This is equivalent to calling PFEntityGetEntityKey and comparing +/// entityKey.type to PFTitlePlayerEntityType. +/// +/// PFEntityHandle returned from a auth call. +/// Will be set to true if the entity is a TitlePlayer and false otherwise. +/// Result code for this API operation. +PF_API PFEntityIsTitlePlayer( + _In_ PFEntityHandle entityHandle, + _Out_ bool* isTitlePlayer +) noexcept; + + +/// +/// Gets the size of the buffer needed to hold the API endpoint string from an entity handle. +/// +/// PFEntityHandle returned from a auth call. +/// Buffer size required for the API endpoint string (including null terminator). +/// Result code for this API operation. +PF_API PFEntityGetAPIEndpointSize( + _In_ PFEntityHandle entityHandle, + _Out_ size_t* apiEndpointSize +) noexcept; + +/// +/// Gets the API endpoint for the PFServiceConfig associated with an entity handle. +/// +/// PFEntityHandle returned from a auth call. +/// Size of the provided buffer. Required size can be obtained via PFEntityGetAPIEndpointSize. +/// Buffer the API endpoint string will be written to. +/// The number of bytes used in the buffer including the null terminator. +/// Result code for this API operation. +PF_API PFEntityGetAPIEndpoint( + _In_ PFEntityHandle entityHandle, + _In_ size_t apiEndpointSize, + _Out_writes_(apiEndpointSize) char* apiEndpoint, + _Out_opt_ size_t* apiEndpointUsed +) noexcept; + +/// +/// EntityToken expired event handler. Needed to reauthenticate players in scenarios where the SDK is unable to automatically +/// refresh the cached EntityToken. +/// +/// Optional context pointer to data used by the event handler. +/// The EntityKey for the Entity whose auth token expired. +/// +typedef void CALLBACK PFEntityTokenExpiredEventHandler( + _In_ void* context, + _In_ const PFEntityKey* entityKey +); + +/// +/// Register a handler for EntityToken expired events. +/// +/// The async queue the callback should be invoked on. +/// Optional pointer to data used by the event handler. +/// The event handler, . +/// The token for unregistering this callback +/// Result code for this API operation. Possible values are S_OK, E_PF_NOT_INITIALIZED, or E_FAIL. +PF_API PFEntityRegisterTokenExpiredEventHandler( + _In_opt_ XTaskQueueHandle queue, + _In_opt_ void* context, + _In_ PFEntityTokenExpiredEventHandler* handler, + _Out_ PFRegistrationToken* token +) noexcept; + +/// +/// Unregisters a previously registered callback. +/// +/// The token returned from PFEntityRegisterTokenExpiredEventHandler. +/// +PF_API_(void) PFEntityUnregisterTokenExpiredEventHandler( + _In_ PFRegistrationToken token +) noexcept; + +/// +/// A handler invoked every time an Entity is automatically re-authenticated, thus obtaining a new EntityToken. An entity +/// will be automatically re-authenticated prior to its EntityToken expiring. +/// +/// Optional context pointer to data used by the event handler. +/// The EntityKey for the Entity whose EntityToken expired. +/// The new token for the refreshed entity. +/// +typedef void CALLBACK PFEntityTokenRefreshedEventHandler( + _In_ void* context, + _In_ const PFEntityKey* entityKey, + _In_ const PFEntityToken* newToken +); + +/// +/// Register a handler for EntityToken refreshed events. +/// +/// Entity handle for the entity. +/// The async queue the callback should be invoked on. +/// The callback, . +/// Optional pointer to data used by the callback. +/// The token for unregistering the callback. +/// Result code for this API operation. +PF_API PFEntityRegisterTokenRefreshedEventHandler( + _In_ XTaskQueueHandle queue, + _In_opt_ void* context, + _In_ PFEntityTokenRefreshedEventHandler* handler, + _Out_ PFRegistrationToken* token +) noexcept; + +/// +/// Unregisters a previously registered PFEntityTokenRefreshedCallback. +/// +/// Entity handle for the entity. +/// Registration token from PFEntityRegisterTokenRefreshedCallback. +/// Result code for this API operation. +PF_API_(void) PFEntityUnregisterTokenRefreshedEventHandler( + _In_ PFRegistrationToken token +) noexcept; + +} diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/PFErrors.h b/Source/PlayFabCore/Include/Generated/playfab/core/PFErrors.h new file mode 100644 index 0000000..c26f702 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/PFErrors.h @@ -0,0 +1,758 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +extern "C" +{ + +// PlayFab HRESULT error codes start at FACILITY_XBOX + 0x5400 + +// Client-side errors. Typically these errors indicate improper calling patterns. +#define E_PF_CORE_NOT_INITIALIZED MAKE_E_HC(0x5400L) // 0x89235400 +#define E_PF_CORE_ALREADY_INITIALIZED MAKE_E_HC(0x5401L) // 0x89235401 +#define E_PF_INVALIDHANDLE MAKE_E_HC(0x5402L) // 0x89235402 + +// Client-side auth token check errors. Returned when the required auth token is missing or expired. +#define E_PF_NOENTITYTOKEN MAKE_E_HC(0x5411L) // 0x89235411 +#define E_PF_NOSECRETKEY MAKE_E_HC(0x5412L) // 0x89235412 + +// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more information. +#define E_PF_UNKOWN_ERROR MAKE_E_HC(0x5420L) // 0x89235420 +#define E_PF_INVALID_PARAMS MAKE_E_HC(0x5421L) // 0x89235421 +#define E_PF_ACCOUNT_NOT_FOUND MAKE_E_HC(0x5422L) // 0x89235422 +#define E_PF_ACCOUNT_BANNED MAKE_E_HC(0x5423L) // 0x89235423 +#define E_PF_INVALID_USERNAME_OR_PASSWORD MAKE_E_HC(0x5424L) // 0x89235424 +#define E_PF_INVALID_TITLE_ID MAKE_E_HC(0x5425L) // 0x89235425 +#define E_PF_INVALID_EMAIL_ADDRESS MAKE_E_HC(0x5426L) // 0x89235426 +#define E_PF_EMAIL_ADDRESS_NOT_AVAILABLE MAKE_E_HC(0x5427L) // 0x89235427 +#define E_PF_INVALID_USERNAME MAKE_E_HC(0x5428L) // 0x89235428 +#define E_PF_INVALID_PASSWORD MAKE_E_HC(0x5429L) // 0x89235429 +#define E_PF_USERNAME_NOT_AVAILABLE MAKE_E_HC(0x542aL) // 0x8923542a +#define E_PF_INVALID_STEAM_TICKET MAKE_E_HC(0x542bL) // 0x8923542b +#define E_PF_ACCOUNT_ALREADY_LINKED MAKE_E_HC(0x542cL) // 0x8923542c +#define E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED MAKE_E_HC(0x542dL) // 0x8923542d +#define E_PF_INVALID_FACEBOOK_TOKEN MAKE_E_HC(0x542eL) // 0x8923542e +#define E_PF_ACCOUNT_NOT_LINKED MAKE_E_HC(0x542fL) // 0x8923542f +#define E_PF_FAILED_BY_PAYMENT_PROVIDER MAKE_E_HC(0x5430L) // 0x89235430 +#define E_PF_COUPON_CODE_NOT_FOUND MAKE_E_HC(0x5431L) // 0x89235431 +#define E_PF_INVALID_CONTAINER_ITEM MAKE_E_HC(0x5432L) // 0x89235432 +#define E_PF_CONTAINER_NOT_OWNED MAKE_E_HC(0x5433L) // 0x89235433 +#define E_PF_KEY_NOT_OWNED MAKE_E_HC(0x5434L) // 0x89235434 +#define E_PF_INVALID_ITEM_ID_IN_TABLE MAKE_E_HC(0x5435L) // 0x89235435 +#define E_PF_INVALID_RECEIPT MAKE_E_HC(0x5436L) // 0x89235436 +#define E_PF_RECEIPT_ALREADY_USED MAKE_E_HC(0x5437L) // 0x89235437 +#define E_PF_RECEIPT_CANCELLED MAKE_E_HC(0x5438L) // 0x89235438 +#define E_PF_GAME_NOT_FOUND MAKE_E_HC(0x5439L) // 0x89235439 +#define E_PF_GAME_MODE_NOT_FOUND MAKE_E_HC(0x543aL) // 0x8923543a +#define E_PF_INVALID_GOOGLE_TOKEN MAKE_E_HC(0x543bL) // 0x8923543b +#define E_PF_USER_IS_NOT_PART_OF_DEVELOPER MAKE_E_HC(0x543cL) // 0x8923543c +#define E_PF_INVALID_TITLE_FOR_DEVELOPER MAKE_E_HC(0x543dL) // 0x8923543d +#define E_PF_TITLE_NAME_CONFLICTS MAKE_E_HC(0x543eL) // 0x8923543e +#define E_PF_USERIS_NOT_VALID MAKE_E_HC(0x543fL) // 0x8923543f +#define E_PF_VALUE_ALREADY_EXISTS MAKE_E_HC(0x5440L) // 0x89235440 +#define E_PF_BUILD_NOT_FOUND MAKE_E_HC(0x5441L) // 0x89235441 +#define E_PF_PLAYER_NOT_IN_GAME MAKE_E_HC(0x5442L) // 0x89235442 +#define E_PF_INVALID_TICKET MAKE_E_HC(0x5443L) // 0x89235443 +#define E_PF_INVALID_DEVELOPER MAKE_E_HC(0x5444L) // 0x89235444 +#define E_PF_INVALID_ORDER_INFO MAKE_E_HC(0x5445L) // 0x89235445 +#define E_PF_REGISTRATION_INCOMPLETE MAKE_E_HC(0x5446L) // 0x89235446 +#define E_PF_INVALID_PLATFORM MAKE_E_HC(0x5447L) // 0x89235447 +#define E_PF_UNKNOWN_ERROR MAKE_E_HC(0x5448L) // 0x89235448 +#define E_PF_STEAM_APPLICATION_NOT_OWNED MAKE_E_HC(0x5449L) // 0x89235449 +#define E_PF_WRONG_STEAM_ACCOUNT MAKE_E_HC(0x544aL) // 0x8923544a +#define E_PF_TITLE_NOT_ACTIVATED MAKE_E_HC(0x544bL) // 0x8923544b +#define E_PF_REGISTRATION_SESSION_NOT_FOUND MAKE_E_HC(0x544cL) // 0x8923544c +#define E_PF_NO_SUCH_MOD MAKE_E_HC(0x544dL) // 0x8923544d +#define E_PF_FILE_NOT_FOUND MAKE_E_HC(0x544eL) // 0x8923544e +#define E_PF_DUPLICATE_EMAIL MAKE_E_HC(0x544fL) // 0x8923544f +#define E_PF_ITEM_NOT_FOUND MAKE_E_HC(0x5450L) // 0x89235450 +#define E_PF_ITEM_NOT_OWNED MAKE_E_HC(0x5451L) // 0x89235451 +#define E_PF_ITEM_NOT_RECYCLEABLE MAKE_E_HC(0x5452L) // 0x89235452 +#define E_PF_ITEM_NOT_AFFORDABLE MAKE_E_HC(0x5453L) // 0x89235453 +#define E_PF_INVALID_VIRTUAL_CURRENCY MAKE_E_HC(0x5454L) // 0x89235454 +#define E_PF_WRONG_VIRTUAL_CURRENCY MAKE_E_HC(0x5455L) // 0x89235455 +#define E_PF_WRONG_PRICE MAKE_E_HC(0x5456L) // 0x89235456 +#define E_PF_NON_POSITIVE_VALUE MAKE_E_HC(0x5457L) // 0x89235457 +#define E_PF_INVALID_REGION MAKE_E_HC(0x5458L) // 0x89235458 +#define E_PF_REGION_AT_CAPACITY MAKE_E_HC(0x5459L) // 0x89235459 +#define E_PF_SERVER_FAILED_TO_START MAKE_E_HC(0x545aL) // 0x8923545a +#define E_PF_NAME_NOT_AVAILABLE MAKE_E_HC(0x545bL) // 0x8923545b +#define E_PF_INSUFFICIENT_FUNDS MAKE_E_HC(0x545cL) // 0x8923545c +#define E_PF_INVALID_DEVICE_ID MAKE_E_HC(0x545dL) // 0x8923545d +#define E_PF_INVALID_PUSH_NOTIFICATION_TOKEN MAKE_E_HC(0x545eL) // 0x8923545e +#define E_PF_NO_REMAINING_USES MAKE_E_HC(0x545fL) // 0x8923545f +#define E_PF_INVALID_PAYMENT_PROVIDER MAKE_E_HC(0x5460L) // 0x89235460 +#define E_PF_PURCHASE_INITIALIZATION_FAILURE MAKE_E_HC(0x5461L) // 0x89235461 +#define E_PF_DUPLICATE_USERNAME MAKE_E_HC(0x5462L) // 0x89235462 +#define E_PF_INVALID_BUYER_INFO MAKE_E_HC(0x5463L) // 0x89235463 +#define E_PF_NO_GAME_MODE_PARAMS_SET MAKE_E_HC(0x5464L) // 0x89235464 +#define E_PF_BODY_TOO_LARGE MAKE_E_HC(0x5465L) // 0x89235465 +#define E_PF_RESERVED_WORD_IN_BODY MAKE_E_HC(0x5466L) // 0x89235466 +#define E_PF_INVALID_TYPE_IN_BODY MAKE_E_HC(0x5467L) // 0x89235467 +#define E_PF_INVALID_REQUEST MAKE_E_HC(0x5468L) // 0x89235468 +#define E_PF_RESERVED_EVENT_NAME MAKE_E_HC(0x5469L) // 0x89235469 +#define E_PF_INVALID_USER_STATISTICS MAKE_E_HC(0x546aL) // 0x8923546a +#define E_PF_NOT_AUTHENTICATED MAKE_E_HC(0x546bL) // 0x8923546b +#define E_PF_STREAM_ALREADY_EXISTS MAKE_E_HC(0x546cL) // 0x8923546c +#define E_PF_ERROR_CREATING_STREAM MAKE_E_HC(0x546dL) // 0x8923546d +#define E_PF_STREAM_NOT_FOUND MAKE_E_HC(0x546eL) // 0x8923546e +#define E_PF_INVALID_ACCOUNT MAKE_E_HC(0x546fL) // 0x8923546f +#define E_PF_PURCHASE_DOES_NOT_EXIST MAKE_E_HC(0x5470L) // 0x89235470 +#define E_PF_INVALID_PURCHASE_TRANSACTION_STATUS MAKE_E_HC(0x5471L) // 0x89235471 +#define E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS MAKE_E_HC(0x5472L) // 0x89235472 +#define E_PF_NO_PUSH_NOTIFICATION_ARN_FOR_TITLE MAKE_E_HC(0x5473L) // 0x89235473 +#define E_PF_BUILD_ALREADY_EXISTS MAKE_E_HC(0x5474L) // 0x89235474 +#define E_PF_BUILD_PACKAGE_DOES_NOT_EXIST MAKE_E_HC(0x5475L) // 0x89235475 +#define E_PF_CUSTOM_ANALYTICS_EVENTS_NOT_ENABLED_FOR_TITLE MAKE_E_HC(0x5476L) // 0x89235476 +#define E_PF_INVALID_SHARED_GROUP_ID MAKE_E_HC(0x5477L) // 0x89235477 +#define E_PF_NOT_AUTHORIZED MAKE_E_HC(0x5478L) // 0x89235478 +#define E_PF_MISSING_TITLE_GOOGLE_PROPERTIES MAKE_E_HC(0x5479L) // 0x89235479 +#define E_PF_INVALID_ITEM_PROPERTIES MAKE_E_HC(0x547aL) // 0x8923547a +#define E_PF_INVALID_PSN_AUTH_CODE MAKE_E_HC(0x547bL) // 0x8923547b +#define E_PF_INVALID_ITEM_ID MAKE_E_HC(0x547cL) // 0x8923547c +#define E_PF_PUSH_NOT_ENABLED_FOR_ACCOUNT MAKE_E_HC(0x547dL) // 0x8923547d +#define E_PF_PUSH_SERVICE_ERROR MAKE_E_HC(0x547eL) // 0x8923547e +#define E_PF_RECEIPT_DOES_NOT_CONTAIN_IN_APP_ITEMS MAKE_E_HC(0x547fL) // 0x8923547f +#define E_PF_RECEIPT_CONTAINS_MULTIPLE_IN_APP_ITEMS MAKE_E_HC(0x5480L) // 0x89235480 +#define E_PF_INVALID_BUNDLE_ID MAKE_E_HC(0x5481L) // 0x89235481 +#define E_PF_JAVASCRIPT_EXCEPTION MAKE_E_HC(0x5482L) // 0x89235482 +#define E_PF_INVALID_SESSION_TICKET MAKE_E_HC(0x5483L) // 0x89235483 +#define E_PF_UNABLE_TO_CONNECT_TO_DATABASE MAKE_E_HC(0x5484L) // 0x89235484 +#define E_PF_INTERNAL_SERVER_ERROR MAKE_E_HC(0x5485L) // 0x89235485 +#define E_PF_INVALID_REPORT_DATE MAKE_E_HC(0x5486L) // 0x89235486 +#define E_PF_REPORT_NOT_AVAILABLE MAKE_E_HC(0x5487L) // 0x89235487 +#define E_PF_DATABASE_THROUGHPUT_EXCEEDED MAKE_E_HC(0x5488L) // 0x89235488 +#define E_PF_INVALID_GAME_TICKET MAKE_E_HC(0x5489L) // 0x89235489 +#define E_PF_EXPIRED_GAME_TICKET MAKE_E_HC(0x548aL) // 0x8923548a +#define E_PF_GAME_TICKET_DOES_NOT_MATCH_LOBBY MAKE_E_HC(0x548bL) // 0x8923548b +#define E_PF_LINKED_DEVICE_ALREADY_CLAIMED MAKE_E_HC(0x548cL) // 0x8923548c +#define E_PF_DEVICE_ALREADY_LINKED MAKE_E_HC(0x548dL) // 0x8923548d +#define E_PF_DEVICE_NOT_LINKED MAKE_E_HC(0x548eL) // 0x8923548e +#define E_PF_PARTIAL_FAILURE MAKE_E_HC(0x548fL) // 0x8923548f +#define E_PF_PUBLISHER_NOT_SET MAKE_E_HC(0x5490L) // 0x89235490 +#define E_PF_SERVICE_UNAVAILABLE MAKE_E_HC(0x5491L) // 0x89235491 +#define E_PF_VERSION_NOT_FOUND MAKE_E_HC(0x5492L) // 0x89235492 +#define E_PF_REVISION_NOT_FOUND MAKE_E_HC(0x5493L) // 0x89235493 +#define E_PF_INVALID_PUBLISHER_ID MAKE_E_HC(0x5494L) // 0x89235494 +#define E_PF_DOWNSTREAM_SERVICE_UNAVAILABLE MAKE_E_HC(0x5495L) // 0x89235495 +#define E_PF_API_NOT_INCLUDED_IN_TITLE_USAGE_TIER MAKE_E_HC(0x5496L) // 0x89235496 +#define E_PF_DAU_LIMIT_EXCEEDED MAKE_E_HC(0x5497L) // 0x89235497 +#define E_PF_API_REQUEST_LIMIT_EXCEEDED MAKE_E_HC(0x5498L) // 0x89235498 +#define E_PF_INVALID_API_ENDPOINT MAKE_E_HC(0x5499L) // 0x89235499 +#define E_PF_BUILD_NOT_AVAILABLE MAKE_E_HC(0x549aL) // 0x8923549a +#define E_PF_CONCURRENT_EDIT_ERROR MAKE_E_HC(0x549bL) // 0x8923549b +#define E_PF_CONTENT_NOT_FOUND MAKE_E_HC(0x549cL) // 0x8923549c +#define E_PF_CHARACTER_NOT_FOUND MAKE_E_HC(0x549dL) // 0x8923549d +#define E_PF_CLOUD_SCRIPT_NOT_FOUND MAKE_E_HC(0x549eL) // 0x8923549e +#define E_PF_CONTENT_QUOTA_EXCEEDED MAKE_E_HC(0x549fL) // 0x8923549f +#define E_PF_INVALID_CHARACTER_STATISTICS MAKE_E_HC(0x54a0L) // 0x892354a0 +#define E_PF_PHOTON_NOT_ENABLED_FOR_TITLE MAKE_E_HC(0x54a1L) // 0x892354a1 +#define E_PF_PHOTON_APPLICATION_NOT_FOUND MAKE_E_HC(0x54a2L) // 0x892354a2 +#define E_PF_PHOTON_APPLICATION_NOT_ASSOCIATED_WITH_TITLE MAKE_E_HC(0x54a3L) // 0x892354a3 +#define E_PF_INVALID_EMAIL_OR_PASSWORD MAKE_E_HC(0x54a4L) // 0x892354a4 +#define E_PF_FACEBOOK_API_ERROR MAKE_E_HC(0x54a5L) // 0x892354a5 +#define E_PF_INVALID_CONTENT_TYPE MAKE_E_HC(0x54a6L) // 0x892354a6 +#define E_PF_KEY_LENGTH_EXCEEDED MAKE_E_HC(0x54a7L) // 0x892354a7 +#define E_PF_DATA_LENGTH_EXCEEDED MAKE_E_HC(0x54a8L) // 0x892354a8 +#define E_PF_TOO_MANY_KEYS MAKE_E_HC(0x54a9L) // 0x892354a9 +#define E_PF_FREE_TIER_CANNOT_HAVE_VIRTUAL_CURRENCY MAKE_E_HC(0x54aaL) // 0x892354aa +#define E_PF_MISSING_AMAZON_SHARED_KEY MAKE_E_HC(0x54abL) // 0x892354ab +#define E_PF_AMAZON_VALIDATION_ERROR MAKE_E_HC(0x54acL) // 0x892354ac +#define E_PF_INVALID_PSN_ISSUER_ID MAKE_E_HC(0x54adL) // 0x892354ad +#define E_PF_PSN_INACCESSIBLE MAKE_E_HC(0x54aeL) // 0x892354ae +#define E_PF_EXPIRED_AUTH_TOKEN MAKE_E_HC(0x54afL) // 0x892354af +#define E_PF_FAILED_TO_GET_ENTITLEMENTS MAKE_E_HC(0x54b0L) // 0x892354b0 +#define E_PF_FAILED_TO_CONSUME_ENTITLEMENT MAKE_E_HC(0x54b1L) // 0x892354b1 +#define E_PF_TRADE_ACCEPTING_USER_NOT_ALLOWED MAKE_E_HC(0x54b2L) // 0x892354b2 +#define E_PF_TRADE_INVENTORY_ITEM_IS_ASSIGNED_TO_CHARACTER MAKE_E_HC(0x54b3L) // 0x892354b3 +#define E_PF_TRADE_INVENTORY_ITEM_IS_BUNDLE MAKE_E_HC(0x54b4L) // 0x892354b4 +#define E_PF_TRADE_STATUS_NOT_VALID_FOR_CANCELLING MAKE_E_HC(0x54b5L) // 0x892354b5 +#define E_PF_TRADE_STATUS_NOT_VALID_FOR_ACCEPTING MAKE_E_HC(0x54b6L) // 0x892354b6 +#define E_PF_TRADE_DOES_NOT_EXIST MAKE_E_HC(0x54b7L) // 0x892354b7 +#define E_PF_TRADE_CANCELLED MAKE_E_HC(0x54b8L) // 0x892354b8 +#define E_PF_TRADE_ALREADY_FILLED MAKE_E_HC(0x54b9L) // 0x892354b9 +#define E_PF_TRADE_WAIT_FOR_STATUS_TIMEOUT MAKE_E_HC(0x54baL) // 0x892354ba +#define E_PF_TRADE_INVENTORY_ITEM_EXPIRED MAKE_E_HC(0x54bbL) // 0x892354bb +#define E_PF_TRADE_MISSING_OFFERED_AND_ACCEPTED_ITEMS MAKE_E_HC(0x54bcL) // 0x892354bc +#define E_PF_TRADE_ACCEPTED_ITEM_IS_BUNDLE MAKE_E_HC(0x54bdL) // 0x892354bd +#define E_PF_TRADE_ACCEPTED_ITEM_IS_STACKABLE MAKE_E_HC(0x54beL) // 0x892354be +#define E_PF_TRADE_INVENTORY_ITEM_INVALID_STATUS MAKE_E_HC(0x54bfL) // 0x892354bf +#define E_PF_TRADE_ACCEPTED_CATALOG_ITEM_INVALID MAKE_E_HC(0x54c0L) // 0x892354c0 +#define E_PF_TRADE_ALLOWED_USERS_INVALID MAKE_E_HC(0x54c1L) // 0x892354c1 +#define E_PF_TRADE_INVENTORY_ITEM_DOES_NOT_EXIST MAKE_E_HC(0x54c2L) // 0x892354c2 +#define E_PF_TRADE_INVENTORY_ITEM_IS_CONSUMED MAKE_E_HC(0x54c3L) // 0x892354c3 +#define E_PF_TRADE_INVENTORY_ITEM_IS_STACKABLE MAKE_E_HC(0x54c4L) // 0x892354c4 +#define E_PF_TRADE_ACCEPTED_ITEMS_MISMATCH MAKE_E_HC(0x54c5L) // 0x892354c5 +#define E_PF_INVALID_KONGREGATE_TOKEN MAKE_E_HC(0x54c6L) // 0x892354c6 +#define E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE MAKE_E_HC(0x54c7L) // 0x892354c7 +#define E_PF_NO_MATCHING_CATALOG_ITEM_FOR_RECEIPT MAKE_E_HC(0x54c8L) // 0x892354c8 +#define E_PF_INVALID_CURRENCY_CODE MAKE_E_HC(0x54c9L) // 0x892354c9 +#define E_PF_NO_REAL_MONEY_PRICE_FOR_CATALOG_ITEM MAKE_E_HC(0x54caL) // 0x892354ca +#define E_PF_TRADE_INVENTORY_ITEM_IS_NOT_TRADABLE MAKE_E_HC(0x54cbL) // 0x892354cb +#define E_PF_TRADE_ACCEPTED_CATALOG_ITEM_IS_NOT_TRADABLE MAKE_E_HC(0x54ccL) // 0x892354cc +#define E_PF_USERS_ALREADY_FRIENDS MAKE_E_HC(0x54cdL) // 0x892354cd +#define E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED MAKE_E_HC(0x54ceL) // 0x892354ce +#define E_PF_CUSTOM_ID_NOT_LINKED MAKE_E_HC(0x54cfL) // 0x892354cf +#define E_PF_TOTAL_DATA_SIZE_EXCEEDED MAKE_E_HC(0x54d0L) // 0x892354d0 +#define E_PF_DELETE_KEY_CONFLICT MAKE_E_HC(0x54d1L) // 0x892354d1 +#define E_PF_INVALID_XBOX_LIVE_TOKEN MAKE_E_HC(0x54d2L) // 0x892354d2 +#define E_PF_EXPIRED_XBOX_LIVE_TOKEN MAKE_E_HC(0x54d3L) // 0x892354d3 +#define E_PF_RESETTABLE_STATISTIC_VERSION_REQUIRED MAKE_E_HC(0x54d4L) // 0x892354d4 +#define E_PF_NOT_AUTHORIZED_BY_TITLE MAKE_E_HC(0x54d5L) // 0x892354d5 +#define E_PF_NO_PARTNER_ENABLED MAKE_E_HC(0x54d6L) // 0x892354d6 +#define E_PF_INVALID_PARTNER_RESPONSE MAKE_E_HC(0x54d7L) // 0x892354d7 +#define E_PF_API_NOT_ENABLED_FOR_GAME_SERVER_ACCESS MAKE_E_HC(0x54d8L) // 0x892354d8 +#define E_PF_STATISTIC_NOT_FOUND MAKE_E_HC(0x54d9L) // 0x892354d9 +#define E_PF_STATISTIC_NAME_CONFLICT MAKE_E_HC(0x54daL) // 0x892354da +#define E_PF_STATISTIC_VERSION_CLOSED_FOR_WRITES MAKE_E_HC(0x54dbL) // 0x892354db +#define E_PF_STATISTIC_VERSION_INVALID MAKE_E_HC(0x54dcL) // 0x892354dc +#define E_PF_API_CLIENT_REQUEST_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x54ddL) // 0x892354dd +#define E_PF_INVALID_JSON_CONTENT MAKE_E_HC(0x54deL) // 0x892354de +#define E_PF_INVALID_DROP_TABLE MAKE_E_HC(0x54dfL) // 0x892354df +#define E_PF_STATISTIC_VERSION_ALREADY_INCREMENTED_FOR_SCHEDULED_INTERVAL MAKE_E_HC(0x54e0L) // 0x892354e0 +#define E_PF_STATISTIC_COUNT_LIMIT_EXCEEDED MAKE_E_HC(0x54e1L) // 0x892354e1 +#define E_PF_STATISTIC_VERSION_INCREMENT_RATE_EXCEEDED MAKE_E_HC(0x54e2L) // 0x892354e2 +#define E_PF_CONTAINER_KEY_INVALID MAKE_E_HC(0x54e3L) // 0x892354e3 +#define E_PF_CLOUD_SCRIPT_EXECUTION_TIME_LIMIT_EXCEEDED MAKE_E_HC(0x54e4L) // 0x892354e4 +#define E_PF_NO_WRITE_PERMISSIONS_FOR_EVENT MAKE_E_HC(0x54e5L) // 0x892354e5 +#define E_PF_CLOUD_SCRIPT_FUNCTION_ARGUMENT_SIZE_EXCEEDED MAKE_E_HC(0x54e6L) // 0x892354e6 +#define E_PF_CLOUD_SCRIPT_API_REQUEST_COUNT_EXCEEDED MAKE_E_HC(0x54e7L) // 0x892354e7 +#define E_PF_CLOUD_SCRIPT_API_REQUEST_ERROR MAKE_E_HC(0x54e8L) // 0x892354e8 +#define E_PF_CLOUD_SCRIPT_HTTP_REQUEST_ERROR MAKE_E_HC(0x54e9L) // 0x892354e9 +#define E_PF_INSUFFICIENT_GUILD_ROLE MAKE_E_HC(0x54eaL) // 0x892354ea +#define E_PF_GUILD_NOT_FOUND MAKE_E_HC(0x54ebL) // 0x892354eb +#define E_PF_OVER_LIMIT MAKE_E_HC(0x54ecL) // 0x892354ec +#define E_PF_EVENT_NOT_FOUND MAKE_E_HC(0x54edL) // 0x892354ed +#define E_PF_INVALID_EVENT_FIELD MAKE_E_HC(0x54eeL) // 0x892354ee +#define E_PF_INVALID_EVENT_NAME MAKE_E_HC(0x54efL) // 0x892354ef +#define E_PF_CATALOG_NOT_CONFIGURED MAKE_E_HC(0x54f0L) // 0x892354f0 +#define E_PF_OPERATION_NOT_SUPPORTED_FOR_PLATFORM MAKE_E_HC(0x54f1L) // 0x892354f1 +#define E_PF_SEGMENT_NOT_FOUND MAKE_E_HC(0x54f2L) // 0x892354f2 +#define E_PF_STORE_NOT_FOUND MAKE_E_HC(0x54f3L) // 0x892354f3 +#define E_PF_INVALID_STATISTIC_NAME MAKE_E_HC(0x54f4L) // 0x892354f4 +#define E_PF_TITLE_NOT_QUALIFIED_FOR_LIMIT MAKE_E_HC(0x54f5L) // 0x892354f5 +#define E_PF_INVALID_SERVICE_LIMIT_LEVEL MAKE_E_HC(0x54f6L) // 0x892354f6 +#define E_PF_SERVICE_LIMIT_LEVEL_IN_TRANSITION MAKE_E_HC(0x54f7L) // 0x892354f7 +#define E_PF_COUPON_ALREADY_REDEEMED MAKE_E_HC(0x54f8L) // 0x892354f8 +#define E_PF_GAME_SERVER_BUILD_SIZE_LIMIT_EXCEEDED MAKE_E_HC(0x54f9L) // 0x892354f9 +#define E_PF_GAME_SERVER_BUILD_COUNT_LIMIT_EXCEEDED MAKE_E_HC(0x54faL) // 0x892354fa +#define E_PF_VIRTUAL_CURRENCY_COUNT_LIMIT_EXCEEDED MAKE_E_HC(0x54fbL) // 0x892354fb +#define E_PF_VIRTUAL_CURRENCY_CODE_EXISTS MAKE_E_HC(0x54fcL) // 0x892354fc +#define E_PF_TITLE_NEWS_ITEM_COUNT_LIMIT_EXCEEDED MAKE_E_HC(0x54fdL) // 0x892354fd +#define E_PF_INVALID_TWITCH_TOKEN MAKE_E_HC(0x54feL) // 0x892354fe +#define E_PF_TWITCH_RESPONSE_ERROR MAKE_E_HC(0x54ffL) // 0x892354ff +#define E_PF_PROFANE_DISPLAY_NAME MAKE_E_HC(0x5500L) // 0x89235500 +#define E_PF_USER_ALREADY_ADDED MAKE_E_HC(0x5501L) // 0x89235501 +#define E_PF_INVALID_VIRTUAL_CURRENCY_CODE MAKE_E_HC(0x5502L) // 0x89235502 +#define E_PF_VIRTUAL_CURRENCY_CANNOT_BE_DELETED MAKE_E_HC(0x5503L) // 0x89235503 +#define E_PF_IDENTIFIER_ALREADY_CLAIMED MAKE_E_HC(0x5504L) // 0x89235504 +#define E_PF_IDENTIFIER_NOT_LINKED MAKE_E_HC(0x5505L) // 0x89235505 +#define E_PF_INVALID_CONTINUATION_TOKEN MAKE_E_HC(0x5506L) // 0x89235506 +#define E_PF_EXPIRED_CONTINUATION_TOKEN MAKE_E_HC(0x5507L) // 0x89235507 +#define E_PF_INVALID_SEGMENT MAKE_E_HC(0x5508L) // 0x89235508 +#define E_PF_INVALID_SESSION_ID MAKE_E_HC(0x5509L) // 0x89235509 +#define E_PF_SESSION_LOG_NOT_FOUND MAKE_E_HC(0x550aL) // 0x8923550a +#define E_PF_INVALID_SEARCH_TERM MAKE_E_HC(0x550bL) // 0x8923550b +#define E_PF_TWO_FACTOR_AUTHENTICATION_TOKEN_REQUIRED MAKE_E_HC(0x550cL) // 0x8923550c +#define E_PF_GAME_SERVER_HOST_COUNT_LIMIT_EXCEEDED MAKE_E_HC(0x550dL) // 0x8923550d +#define E_PF_PLAYER_TAG_COUNT_LIMIT_EXCEEDED MAKE_E_HC(0x550eL) // 0x8923550e +#define E_PF_REQUEST_ALREADY_RUNNING MAKE_E_HC(0x550fL) // 0x8923550f +#define E_PF_ACTION_GROUP_NOT_FOUND MAKE_E_HC(0x5510L) // 0x89235510 +#define E_PF_MAXIMUM_SEGMENT_BULK_ACTION_JOBS_RUNNING MAKE_E_HC(0x5511L) // 0x89235511 +#define E_PF_NO_ACTIONS_ON_PLAYERS_IN_SEGMENT_JOB MAKE_E_HC(0x5512L) // 0x89235512 +#define E_PF_DUPLICATE_STATISTIC_NAME MAKE_E_HC(0x5513L) // 0x89235513 +#define E_PF_SCHEDULED_TASK_NAME_CONFLICT MAKE_E_HC(0x5514L) // 0x89235514 +#define E_PF_SCHEDULED_TASK_CREATE_CONFLICT MAKE_E_HC(0x5515L) // 0x89235515 +#define E_PF_INVALID_SCHEDULED_TASK_NAME MAKE_E_HC(0x5516L) // 0x89235516 +#define E_PF_INVALID_TASK_SCHEDULE MAKE_E_HC(0x5517L) // 0x89235517 +#define E_PF_STEAM_NOT_ENABLED_FOR_TITLE MAKE_E_HC(0x5518L) // 0x89235518 +#define E_PF_LIMIT_NOT_AN_UPGRADE_OPTION MAKE_E_HC(0x5519L) // 0x89235519 +#define E_PF_NO_SECRET_KEY_ENABLED_FOR_CLOUD_SCRIPT MAKE_E_HC(0x551aL) // 0x8923551a +#define E_PF_TASK_NOT_FOUND MAKE_E_HC(0x551bL) // 0x8923551b +#define E_PF_TASK_INSTANCE_NOT_FOUND MAKE_E_HC(0x551cL) // 0x8923551c +#define E_PF_INVALID_IDENTITY_PROVIDER_ID MAKE_E_HC(0x551dL) // 0x8923551d +#define E_PF_MISCONFIGURED_IDENTITY_PROVIDER MAKE_E_HC(0x551eL) // 0x8923551e +#define E_PF_INVALID_SCHEDULED_TASK_TYPE MAKE_E_HC(0x551fL) // 0x8923551f +#define E_PF_BILLING_INFORMATION_REQUIRED MAKE_E_HC(0x5520L) // 0x89235520 +#define E_PF_LIMITED_EDITION_ITEM_UNAVAILABLE MAKE_E_HC(0x5521L) // 0x89235521 +#define E_PF_INVALID_AD_PLACEMENT_AND_REWARD MAKE_E_HC(0x5522L) // 0x89235522 +#define E_PF_ALL_AD_PLACEMENT_VIEWS_ALREADY_CONSUMED MAKE_E_HC(0x5523L) // 0x89235523 +#define E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE MAKE_E_HC(0x5524L) // 0x89235524 +#define E_PF_GOOGLE_O_AUTH_ERROR MAKE_E_HC(0x5525L) // 0x89235525 +#define E_PF_USER_NOT_FRIEND MAKE_E_HC(0x5526L) // 0x89235526 +#define E_PF_INVALID_SIGNATURE MAKE_E_HC(0x5527L) // 0x89235527 +#define E_PF_INVALID_PUBLIC_KEY MAKE_E_HC(0x5528L) // 0x89235528 +#define E_PF_GOOGLE_O_AUTH_NO_ID_TOKEN_INCLUDED_IN_RESPONSE MAKE_E_HC(0x5529L) // 0x89235529 +#define E_PF_STATISTIC_UPDATE_IN_PROGRESS MAKE_E_HC(0x552aL) // 0x8923552a +#define E_PF_LEADERBOARD_VERSION_NOT_AVAILABLE MAKE_E_HC(0x552bL) // 0x8923552b +#define E_PF_STATISTIC_ALREADY_HAS_PRIZE_TABLE MAKE_E_HC(0x552cL) // 0x8923552c +#define E_PF_PRIZE_TABLE_HAS_OVERLAPPING_RANKS MAKE_E_HC(0x552dL) // 0x8923552d +#define E_PF_PRIZE_TABLE_HAS_MISSING_RANKS MAKE_E_HC(0x552eL) // 0x8923552e +#define E_PF_PRIZE_TABLE_RANK_STARTS_AT_ZERO MAKE_E_HC(0x552fL) // 0x8923552f +#define E_PF_INVALID_STATISTIC MAKE_E_HC(0x5530L) // 0x89235530 +#define E_PF_EXPRESSION_PARSE_FAILURE MAKE_E_HC(0x5531L) // 0x89235531 +#define E_PF_EXPRESSION_INVOKE_FAILURE MAKE_E_HC(0x5532L) // 0x89235532 +#define E_PF_EXPRESSION_TOO_LONG MAKE_E_HC(0x5533L) // 0x89235533 +#define E_PF_DATA_UPDATE_RATE_EXCEEDED MAKE_E_HC(0x5534L) // 0x89235534 +#define E_PF_RESTRICTED_EMAIL_DOMAIN MAKE_E_HC(0x5535L) // 0x89235535 +#define E_PF_ENCRYPTION_KEY_DISABLED MAKE_E_HC(0x5536L) // 0x89235536 +#define E_PF_ENCRYPTION_KEY_MISSING MAKE_E_HC(0x5537L) // 0x89235537 +#define E_PF_ENCRYPTION_KEY_BROKEN MAKE_E_HC(0x5538L) // 0x89235538 +#define E_PF_NO_SHARED_SECRET_KEY_CONFIGURED MAKE_E_HC(0x5539L) // 0x89235539 +#define E_PF_SECRET_KEY_NOT_FOUND MAKE_E_HC(0x553aL) // 0x8923553a +#define E_PF_PLAYER_SECRET_ALREADY_CONFIGURED MAKE_E_HC(0x553bL) // 0x8923553b +#define E_PF_API_REQUESTS_DISABLED_FOR_TITLE MAKE_E_HC(0x553cL) // 0x8923553c +#define E_PF_INVALID_SHARED_SECRET_KEY MAKE_E_HC(0x553dL) // 0x8923553d +#define E_PF_PRIZE_TABLE_HAS_NO_RANKS MAKE_E_HC(0x553eL) // 0x8923553e +#define E_PF_PROFILE_DOES_NOT_EXIST MAKE_E_HC(0x553fL) // 0x8923553f +#define E_PF_CONTENT_S_3_ORIGIN_BUCKET_NOT_CONFIGURED MAKE_E_HC(0x5540L) // 0x89235540 +#define E_PF_INVALID_ENVIRONMENT_FOR_RECEIPT MAKE_E_HC(0x5541L) // 0x89235541 +#define E_PF_ENCRYPTED_REQUEST_NOT_ALLOWED MAKE_E_HC(0x5542L) // 0x89235542 +#define E_PF_SIGNED_REQUEST_NOT_ALLOWED MAKE_E_HC(0x5543L) // 0x89235543 +#define E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED MAKE_E_HC(0x5544L) // 0x89235544 +#define E_PF_BAD_PARTNER_CONFIGURATION MAKE_E_HC(0x5545L) // 0x89235545 +#define E_PF_XBOX_BP_CERTIFICATE_FAILURE MAKE_E_HC(0x5546L) // 0x89235546 +#define E_PF_XBOX_XASS_EXCHANGE_FAILURE MAKE_E_HC(0x5547L) // 0x89235547 +#define E_PF_INVALID_ENTITY_ID MAKE_E_HC(0x5548L) // 0x89235548 +#define E_PF_STATISTIC_VALUE_AGGREGATION_OVERFLOW MAKE_E_HC(0x5549L) // 0x89235549 +#define E_PF_EMAIL_MESSAGE_FROM_ADDRESS_IS_MISSING MAKE_E_HC(0x554aL) // 0x8923554a +#define E_PF_EMAIL_MESSAGE_TO_ADDRESS_IS_MISSING MAKE_E_HC(0x554bL) // 0x8923554b +#define E_PF_SMTP_SERVER_AUTHENTICATION_ERROR MAKE_E_HC(0x554cL) // 0x8923554c +#define E_PF_SMTP_SERVER_LIMIT_EXCEEDED MAKE_E_HC(0x554dL) // 0x8923554d +#define E_PF_SMTP_SERVER_INSUFFICIENT_STORAGE MAKE_E_HC(0x554eL) // 0x8923554e +#define E_PF_SMTP_SERVER_COMMUNICATION_ERROR MAKE_E_HC(0x554fL) // 0x8923554f +#define E_PF_SMTP_SERVER_GENERAL_FAILURE MAKE_E_HC(0x5550L) // 0x89235550 +#define E_PF_EMAIL_CLIENT_TIMEOUT MAKE_E_HC(0x5551L) // 0x89235551 +#define E_PF_EMAIL_CLIENT_CANCELED_TASK MAKE_E_HC(0x5552L) // 0x89235552 +#define E_PF_EMAIL_TEMPLATE_MISSING MAKE_E_HC(0x5553L) // 0x89235553 +#define E_PF_INVALID_HOST_FOR_TITLE_ID MAKE_E_HC(0x5554L) // 0x89235554 +#define E_PF_EMAIL_CONFIRMATION_TOKEN_DOES_NOT_EXIST MAKE_E_HC(0x5555L) // 0x89235555 +#define E_PF_EMAIL_CONFIRMATION_TOKEN_EXPIRED MAKE_E_HC(0x5556L) // 0x89235556 +#define E_PF_ACCOUNT_DELETED MAKE_E_HC(0x5557L) // 0x89235557 +#define E_PF_PLAYER_SECRET_NOT_CONFIGURED MAKE_E_HC(0x5558L) // 0x89235558 +#define E_PF_INVALID_SIGNATURE_TIME MAKE_E_HC(0x5559L) // 0x89235559 +#define E_PF_NO_CONTACT_EMAIL_ADDRESS_FOUND MAKE_E_HC(0x555aL) // 0x8923555a +#define E_PF_INVALID_AUTH_TOKEN MAKE_E_HC(0x555bL) // 0x8923555b +#define E_PF_AUTH_TOKEN_DOES_NOT_EXIST MAKE_E_HC(0x555cL) // 0x8923555c +#define E_PF_AUTH_TOKEN_EXPIRED MAKE_E_HC(0x555dL) // 0x8923555d +#define E_PF_AUTH_TOKEN_ALREADY_USED_TO_RESET_PASSWORD MAKE_E_HC(0x555eL) // 0x8923555e +#define E_PF_MEMBERSHIP_NAME_TOO_LONG MAKE_E_HC(0x555fL) // 0x8923555f +#define E_PF_MEMBERSHIP_NOT_FOUND MAKE_E_HC(0x5560L) // 0x89235560 +#define E_PF_GOOGLE_SERVICE_ACCOUNT_INVALID MAKE_E_HC(0x5561L) // 0x89235561 +#define E_PF_GOOGLE_SERVICE_ACCOUNT_PARSE_FAILURE MAKE_E_HC(0x5562L) // 0x89235562 +#define E_PF_ENTITY_TOKEN_MISSING MAKE_E_HC(0x5563L) // 0x89235563 +#define E_PF_ENTITY_TOKEN_INVALID MAKE_E_HC(0x5564L) // 0x89235564 +#define E_PF_ENTITY_TOKEN_EXPIRED MAKE_E_HC(0x5565L) // 0x89235565 +#define E_PF_ENTITY_TOKEN_REVOKED MAKE_E_HC(0x5566L) // 0x89235566 +#define E_PF_INVALID_PRODUCT_FOR_SUBSCRIPTION MAKE_E_HC(0x5567L) // 0x89235567 +#define E_PF_XBOX_INACCESSIBLE MAKE_E_HC(0x5568L) // 0x89235568 +#define E_PF_SUBSCRIPTION_ALREADY_TAKEN MAKE_E_HC(0x5569L) // 0x89235569 +#define E_PF_SMTP_ADDON_NOT_ENABLED MAKE_E_HC(0x556aL) // 0x8923556a +#define E_PF_API_CONCURRENT_REQUEST_LIMIT_EXCEEDED MAKE_E_HC(0x556bL) // 0x8923556b +#define E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST MAKE_E_HC(0x556cL) // 0x8923556c +#define E_PF_VARIABLE_NOT_DEFINED MAKE_E_HC(0x556dL) // 0x8923556d +#define E_PF_TEMPLATE_VERSION_NOT_DEFINED MAKE_E_HC(0x556eL) // 0x8923556e +#define E_PF_FILE_TOO_LARGE MAKE_E_HC(0x556fL) // 0x8923556f +#define E_PF_TITLE_DELETED MAKE_E_HC(0x5570L) // 0x89235570 +#define E_PF_TITLE_CONTAINS_USER_ACCOUNTS MAKE_E_HC(0x5571L) // 0x89235571 +#define E_PF_TITLE_DELETION_PLAYER_CLEANUP_FAILURE MAKE_E_HC(0x5572L) // 0x89235572 +#define E_PF_ENTITY_FILE_OPERATION_PENDING MAKE_E_HC(0x5573L) // 0x89235573 +#define E_PF_NO_ENTITY_FILE_OPERATION_PENDING MAKE_E_HC(0x5574L) // 0x89235574 +#define E_PF_ENTITY_PROFILE_VERSION_MISMATCH MAKE_E_HC(0x5575L) // 0x89235575 +#define E_PF_TEMPLATE_VERSION_TOO_OLD MAKE_E_HC(0x5576L) // 0x89235576 +#define E_PF_MEMBERSHIP_DEFINITION_IN_USE MAKE_E_HC(0x5577L) // 0x89235577 +#define E_PF_PAYMENT_PAGE_NOT_CONFIGURED MAKE_E_HC(0x5578L) // 0x89235578 +#define E_PF_FAILED_LOGIN_ATTEMPT_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x5579L) // 0x89235579 +#define E_PF_ENTITY_BLOCKED_BY_GROUP MAKE_E_HC(0x557aL) // 0x8923557a +#define E_PF_ROLE_DOES_NOT_EXIST MAKE_E_HC(0x557bL) // 0x8923557b +#define E_PF_ENTITY_IS_ALREADY_MEMBER MAKE_E_HC(0x557cL) // 0x8923557c +#define E_PF_DUPLICATE_ROLE_ID MAKE_E_HC(0x557dL) // 0x8923557d +#define E_PF_GROUP_INVITATION_NOT_FOUND MAKE_E_HC(0x557eL) // 0x8923557e +#define E_PF_GROUP_APPLICATION_NOT_FOUND MAKE_E_HC(0x557fL) // 0x8923557f +#define E_PF_OUTSTANDING_INVITATION_ACCEPTED_INSTEAD MAKE_E_HC(0x5580L) // 0x89235580 +#define E_PF_OUTSTANDING_APPLICATION_ACCEPTED_INSTEAD MAKE_E_HC(0x5581L) // 0x89235581 +#define E_PF_ROLE_IS_GROUP_DEFAULT_MEMBER MAKE_E_HC(0x5582L) // 0x89235582 +#define E_PF_ROLE_IS_GROUP_ADMIN MAKE_E_HC(0x5583L) // 0x89235583 +#define E_PF_ROLE_NAME_NOT_AVAILABLE MAKE_E_HC(0x5584L) // 0x89235584 +#define E_PF_GROUP_NAME_NOT_AVAILABLE MAKE_E_HC(0x5585L) // 0x89235585 +#define E_PF_EMAIL_REPORT_ALREADY_SENT MAKE_E_HC(0x5586L) // 0x89235586 +#define E_PF_EMAIL_REPORT_RECIPIENT_BLACKLISTED MAKE_E_HC(0x5587L) // 0x89235587 +#define E_PF_EVENT_NAMESPACE_NOT_ALLOWED MAKE_E_HC(0x5588L) // 0x89235588 +#define E_PF_EVENT_ENTITY_NOT_ALLOWED MAKE_E_HC(0x5589L) // 0x89235589 +#define E_PF_INVALID_ENTITY_TYPE MAKE_E_HC(0x558aL) // 0x8923558a +#define E_PF_NULL_TOKEN_RESULT_FROM_AAD MAKE_E_HC(0x558bL) // 0x8923558b +#define E_PF_INVALID_TOKEN_RESULT_FROM_AAD MAKE_E_HC(0x558cL) // 0x8923558c +#define E_PF_NO_VALID_CERTIFICATE_FOR_AAD MAKE_E_HC(0x558dL) // 0x8923558d +#define E_PF_INVALID_CERTIFICATE_FOR_AAD MAKE_E_HC(0x558eL) // 0x8923558e +#define E_PF_DUPLICATE_DROP_TABLE_ID MAKE_E_HC(0x558fL) // 0x8923558f +#define E_PF_MULTIPLAYER_SERVER_ERROR MAKE_E_HC(0x5590L) // 0x89235590 +#define E_PF_MULTIPLAYER_SERVER_TOO_MANY_REQUESTS MAKE_E_HC(0x5591L) // 0x89235591 +#define E_PF_MULTIPLAYER_SERVER_NO_CONTENT MAKE_E_HC(0x5592L) // 0x89235592 +#define E_PF_MULTIPLAYER_SERVER_BAD_REQUEST MAKE_E_HC(0x5593L) // 0x89235593 +#define E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED MAKE_E_HC(0x5594L) // 0x89235594 +#define E_PF_MULTIPLAYER_SERVER_FORBIDDEN MAKE_E_HC(0x5595L) // 0x89235595 +#define E_PF_MULTIPLAYER_SERVER_NOT_FOUND MAKE_E_HC(0x5596L) // 0x89235596 +#define E_PF_MULTIPLAYER_SERVER_CONFLICT MAKE_E_HC(0x5597L) // 0x89235597 +#define E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR MAKE_E_HC(0x5598L) // 0x89235598 +#define E_PF_MULTIPLAYER_SERVER_UNAVAILABLE MAKE_E_HC(0x5599L) // 0x89235599 +#define E_PF_EXPLICIT_CONTENT_DETECTED MAKE_E_HC(0x559aL) // 0x8923559a +#define E_PF_PII_CONTENT_DETECTED MAKE_E_HC(0x559bL) // 0x8923559b +#define E_PF_INVALID_SCHEDULED_TASK_PARAMETER MAKE_E_HC(0x559cL) // 0x8923559c +#define E_PF_PER_ENTITY_EVENT_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x559dL) // 0x8923559d +#define E_PF_TITLE_DEFAULT_LANGUAGE_NOT_SET MAKE_E_HC(0x559eL) // 0x8923559e +#define E_PF_EMAIL_TEMPLATE_MISSING_DEFAULT_VERSION MAKE_E_HC(0x559fL) // 0x8923559f +#define E_PF_FACEBOOK_INSTANT_GAMES_ID_NOT_LINKED MAKE_E_HC(0x55a0L) // 0x892355a0 +#define E_PF_INVALID_FACEBOOK_INSTANT_GAMES_SIGNATURE MAKE_E_HC(0x55a1L) // 0x892355a1 +#define E_PF_FACEBOOK_INSTANT_GAMES_AUTH_NOT_CONFIGURED_FOR_TITLE MAKE_E_HC(0x55a2L) // 0x892355a2 +#define E_PF_ENTITY_PROFILE_CONSTRAINT_VALIDATION_FAILED MAKE_E_HC(0x55a3L) // 0x892355a3 +#define E_PF_TELEMETRY_INGESTION_KEY_PENDING MAKE_E_HC(0x55a4L) // 0x892355a4 +#define E_PF_TELEMETRY_INGESTION_KEY_NOT_FOUND MAKE_E_HC(0x55a5L) // 0x892355a5 +#define E_PF_STATISTIC_CHILD_NAME_INVALID MAKE_E_HC(0x55a6L) // 0x892355a6 +#define E_PF_DATA_INTEGRITY_ERROR MAKE_E_HC(0x55a7L) // 0x892355a7 +#define E_PF_VIRTUAL_CURRENCY_CANNOT_BE_SET_TO_OLDER_VERSION MAKE_E_HC(0x55a8L) // 0x892355a8 +#define E_PF_VIRTUAL_CURRENCY_MUST_BE_WITHIN_INTEGER_RANGE MAKE_E_HC(0x55a9L) // 0x892355a9 +#define E_PF_EMAIL_TEMPLATE_INVALID_SYNTAX MAKE_E_HC(0x55aaL) // 0x892355aa +#define E_PF_EMAIL_TEMPLATE_MISSING_CALLBACK MAKE_E_HC(0x55abL) // 0x892355ab +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_INVALID_PAYLOAD MAKE_E_HC(0x55acL) // 0x892355ac +#define E_PF_INVALID_LOCALIZED_PUSH_NOTIFICATION_LANGUAGE MAKE_E_HC(0x55adL) // 0x892355ad +#define E_PF_MISSING_LOCALIZED_PUSH_NOTIFICATION_MESSAGE MAKE_E_HC(0x55aeL) // 0x892355ae +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_MISSING_PLATFORM_PAYLOAD MAKE_E_HC(0x55afL) // 0x892355af +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_PAYLOAD_CONTAINS_INVALID_JSON MAKE_E_HC(0x55b0L) // 0x892355b0 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_CONTAINS_INVALID_IOS_PAYLOAD MAKE_E_HC(0x55b1L) // 0x892355b1 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_CONTAINS_INVALID_ANDROID_PAYLOAD MAKE_E_HC(0x55b2L) // 0x892355b2 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_IOS_PAYLOAD_MISSING_NOTIFICATION_BODY MAKE_E_HC(0x55b3L) // 0x892355b3 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_ANDROID_PAYLOAD_MISSING_NOTIFICATION_BODY MAKE_E_HC(0x55b4L) // 0x892355b4 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_NOT_FOUND MAKE_E_HC(0x55b5L) // 0x892355b5 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_MISSING_DEFAULT_VERSION MAKE_E_HC(0x55b6L) // 0x892355b6 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_INVALID_SYNTAX MAKE_E_HC(0x55b7L) // 0x892355b7 +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_NO_CUSTOM_PAYLOAD_FOR_V_1 MAKE_E_HC(0x55b8L) // 0x892355b8 +#define E_PF_NO_LEADERBOARD_FOR_STATISTIC MAKE_E_HC(0x55b9L) // 0x892355b9 +#define E_PF_TITLE_NEWS_MISSING_DEFAULT_LANGUAGE MAKE_E_HC(0x55baL) // 0x892355ba +#define E_PF_TITLE_NEWS_NOT_FOUND MAKE_E_HC(0x55bbL) // 0x892355bb +#define E_PF_TITLE_NEWS_DUPLICATE_LANGUAGE MAKE_E_HC(0x55bcL) // 0x892355bc +#define E_PF_TITLE_NEWS_MISSING_TITLE_OR_BODY MAKE_E_HC(0x55bdL) // 0x892355bd +#define E_PF_TITLE_NEWS_INVALID_LANGUAGE MAKE_E_HC(0x55beL) // 0x892355be +#define E_PF_EMAIL_RECIPIENT_BLACKLISTED MAKE_E_HC(0x55bfL) // 0x892355bf +#define E_PF_INVALID_GAME_CENTER_AUTH_REQUEST MAKE_E_HC(0x55c0L) // 0x892355c0 +#define E_PF_GAME_CENTER_AUTHENTICATION_FAILED MAKE_E_HC(0x55c1L) // 0x892355c1 +#define E_PF_CANNOT_ENABLE_PARTIES_FOR_TITLE MAKE_E_HC(0x55c2L) // 0x892355c2 +#define E_PF_PARTY_ERROR MAKE_E_HC(0x55c3L) // 0x892355c3 +#define E_PF_PARTY_REQUESTS MAKE_E_HC(0x55c4L) // 0x892355c4 +#define E_PF_PARTY_NO_CONTENT MAKE_E_HC(0x55c5L) // 0x892355c5 +#define E_PF_PARTY_BAD_REQUEST MAKE_E_HC(0x55c6L) // 0x892355c6 +#define E_PF_PARTY_UNAUTHORIZED MAKE_E_HC(0x55c7L) // 0x892355c7 +#define E_PF_PARTY_FORBIDDEN MAKE_E_HC(0x55c8L) // 0x892355c8 +#define E_PF_PARTY_NOT_FOUND MAKE_E_HC(0x55c9L) // 0x892355c9 +#define E_PF_PARTY_CONFLICT MAKE_E_HC(0x55caL) // 0x892355ca +#define E_PF_PARTY_INTERNAL_SERVER_ERROR MAKE_E_HC(0x55cbL) // 0x892355cb +#define E_PF_PARTY_UNAVAILABLE MAKE_E_HC(0x55ccL) // 0x892355cc +#define E_PF_PARTY_TOO_MANY_REQUESTS MAKE_E_HC(0x55cdL) // 0x892355cd +#define E_PF_PUSH_NOTIFICATION_TEMPLATE_MISSING_NAME MAKE_E_HC(0x55ceL) // 0x892355ce +#define E_PF_CANNOT_ENABLE_MULTIPLAYER_SERVERS_FOR_TITLE MAKE_E_HC(0x55cfL) // 0x892355cf +#define E_PF_WRITE_ATTEMPTED_DURING_EXPORT MAKE_E_HC(0x55d0L) // 0x892355d0 +#define E_PF_MULTIPLAYER_SERVER_TITLE_QUOTA_CORES_EXCEEDED MAKE_E_HC(0x55d1L) // 0x892355d1 +#define E_PF_AUTOMATION_RULE_NOT_FOUND MAKE_E_HC(0x55d2L) // 0x892355d2 +#define E_PF_ENTITY_API_KEY_LIMIT_EXCEEDED MAKE_E_HC(0x55d3L) // 0x892355d3 +#define E_PF_ENTITY_API_KEY_NOT_FOUND MAKE_E_HC(0x55d4L) // 0x892355d4 +#define E_PF_ENTITY_API_KEY_OR_SECRET_INVALID MAKE_E_HC(0x55d5L) // 0x892355d5 +#define E_PF_ECONOMY_SERVICE_UNAVAILABLE MAKE_E_HC(0x55d6L) // 0x892355d6 +#define E_PF_ECONOMY_SERVICE_INTERNAL_ERROR MAKE_E_HC(0x55d7L) // 0x892355d7 +#define E_PF_QUERY_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x55d8L) // 0x892355d8 +#define E_PF_ENTITY_API_KEY_CREATION_DISABLED_FOR_ENTITY MAKE_E_HC(0x55d9L) // 0x892355d9 +#define E_PF_FORBIDDEN_BY_ENTITY_POLICY MAKE_E_HC(0x55daL) // 0x892355da +#define E_PF_UPDATE_INVENTORY_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x55dbL) // 0x892355db +#define E_PF_STUDIO_CREATION_RATE_LIMITED MAKE_E_HC(0x55dcL) // 0x892355dc +#define E_PF_STUDIO_CREATION_IN_PROGRESS MAKE_E_HC(0x55ddL) // 0x892355dd +#define E_PF_DUPLICATE_STUDIO_NAME MAKE_E_HC(0x55deL) // 0x892355de +#define E_PF_STUDIO_NOT_FOUND MAKE_E_HC(0x55dfL) // 0x892355df +#define E_PF_STUDIO_DELETED MAKE_E_HC(0x55e0L) // 0x892355e0 +#define E_PF_STUDIO_DEACTIVATED MAKE_E_HC(0x55e1L) // 0x892355e1 +#define E_PF_STUDIO_ACTIVATED MAKE_E_HC(0x55e2L) // 0x892355e2 +#define E_PF_TITLE_CREATION_RATE_LIMITED MAKE_E_HC(0x55e3L) // 0x892355e3 +#define E_PF_TITLE_CREATION_IN_PROGRESS MAKE_E_HC(0x55e4L) // 0x892355e4 +#define E_PF_DUPLICATE_TITLE_NAME MAKE_E_HC(0x55e5L) // 0x892355e5 +#define E_PF_TITLE_ACTIVATION_RATE_LIMITED MAKE_E_HC(0x55e6L) // 0x892355e6 +#define E_PF_TITLE_ACTIVATION_IN_PROGRESS MAKE_E_HC(0x55e7L) // 0x892355e7 +#define E_PF_TITLE_DEACTIVATED MAKE_E_HC(0x55e8L) // 0x892355e8 +#define E_PF_TITLE_ACTIVATED MAKE_E_HC(0x55e9L) // 0x892355e9 +#define E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_EXECUTION_TIME_LIMIT_EXCEEDED MAKE_E_HC(0x55eaL) // 0x892355ea +#define E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_ARGUMENT_SIZE_EXCEEDED MAKE_E_HC(0x55ebL) // 0x892355eb +#define E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_RETURN_SIZE_EXCEEDED MAKE_E_HC(0x55ecL) // 0x892355ec +#define E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_HTTP_REQUEST_ERROR MAKE_E_HC(0x55edL) // 0x892355ed +#define E_PF_VIRTUAL_CURRENCY_BETA_GET_ERROR MAKE_E_HC(0x55eeL) // 0x892355ee +#define E_PF_VIRTUAL_CURRENCY_BETA_CREATE_ERROR MAKE_E_HC(0x55efL) // 0x892355ef +#define E_PF_VIRTUAL_CURRENCY_BETA_INITIAL_DEPOSIT_SAVE_ERROR MAKE_E_HC(0x55f0L) // 0x892355f0 +#define E_PF_VIRTUAL_CURRENCY_BETA_SAVE_ERROR MAKE_E_HC(0x55f1L) // 0x892355f1 +#define E_PF_VIRTUAL_CURRENCY_BETA_DELETE_ERROR MAKE_E_HC(0x55f2L) // 0x892355f2 +#define E_PF_VIRTUAL_CURRENCY_BETA_RESTORE_ERROR MAKE_E_HC(0x55f3L) // 0x892355f3 +#define E_PF_VIRTUAL_CURRENCY_BETA_SAVE_CONFLICT MAKE_E_HC(0x55f4L) // 0x892355f4 +#define E_PF_VIRTUAL_CURRENCY_BETA_UPDATE_ERROR MAKE_E_HC(0x55f5L) // 0x892355f5 +#define E_PF_INSIGHTS_MANAGEMENT_DATABASE_NOT_FOUND MAKE_E_HC(0x55f6L) // 0x892355f6 +#define E_PF_INSIGHTS_MANAGEMENT_OPERATION_NOT_FOUND MAKE_E_HC(0x55f7L) // 0x892355f7 +#define E_PF_INSIGHTS_MANAGEMENT_ERROR_PENDING_OPERATION_EXISTS MAKE_E_HC(0x55f8L) // 0x892355f8 +#define E_PF_INSIGHTS_MANAGEMENT_SET_PERFORMANCE_LEVEL_INVALID_PARAMETER MAKE_E_HC(0x55f9L) // 0x892355f9 +#define E_PF_INSIGHTS_MANAGEMENT_SET_STORAGE_RETENTION_INVALID_PARAMETER MAKE_E_HC(0x55faL) // 0x892355fa +#define E_PF_INSIGHTS_MANAGEMENT_GET_STORAGE_USAGE_INVALID_PARAMETER MAKE_E_HC(0x55fbL) // 0x892355fb +#define E_PF_INSIGHTS_MANAGEMENT_GET_OPERATION_STATUS_INVALID_PARAMETER MAKE_E_HC(0x55fcL) // 0x892355fc +#define E_PF_DUPLICATE_PURCHASE_TRANSACTION_ID MAKE_E_HC(0x55fdL) // 0x892355fd +#define E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED MAKE_E_HC(0x55feL) // 0x892355fe +#define E_PF_GET_PLAYERS_IN_SEGMENT_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x55ffL) // 0x892355ff +#define E_PF_CLOUD_SCRIPT_FUNCTION_NAME_SIZE_EXCEEDED MAKE_E_HC(0x5600L) // 0x89235600 +#define E_PF_PAID_INSIGHTS_FEATURES_NOT_ENABLED MAKE_E_HC(0x5601L) // 0x89235601 +#define E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_QUEUE_REQUEST_ERROR MAKE_E_HC(0x5602L) // 0x89235602 +#define E_PF_EVALUATION_MODE_TITLE_COUNT_EXCEEDED MAKE_E_HC(0x5603L) // 0x89235603 +#define E_PF_INSIGHTS_MANAGEMENT_TITLE_NOT_IN_FLIGHT MAKE_E_HC(0x5604L) // 0x89235604 +#define E_PF_LIMIT_NOT_FOUND MAKE_E_HC(0x5605L) // 0x89235605 +#define E_PF_LIMIT_NOT_AVAILABLE_VIA_API MAKE_E_HC(0x5606L) // 0x89235606 +#define E_PF_INSIGHTS_MANAGEMENT_SET_STORAGE_RETENTION_BELOW_MINIMUM MAKE_E_HC(0x5607L) // 0x89235607 +#define E_PF_INSIGHTS_MANAGEMENT_SET_STORAGE_RETENTION_ABOVE_MAXIMUM MAKE_E_HC(0x5608L) // 0x89235608 +#define E_PF_APPLE_NOT_ENABLED_FOR_TITLE MAKE_E_HC(0x5609L) // 0x89235609 +#define E_PF_INSIGHTS_MANAGEMENT_NEW_ACTIVE_EVENT_EXPORT_LIMIT_INVALID MAKE_E_HC(0x560aL) // 0x8923560a +#define E_PF_INSIGHTS_MANAGEMENT_SET_PERFORMANCE_RATE_LIMITED MAKE_E_HC(0x560bL) // 0x8923560b +#define E_PF_PARTY_REQUESTS_THROTTLED_FROM_RATE_LIMITER MAKE_E_HC(0x560cL) // 0x8923560c +#define E_PF_XBOX_SERVICE_TOO_MANY_REQUESTS MAKE_E_HC(0x560dL) // 0x8923560d +#define E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE MAKE_E_HC(0x560eL) // 0x8923560e +#define E_PF_REQUEST_MULTIPLAYER_SERVERS_THROTTLED_FROM_RATE_LIMITER MAKE_E_HC(0x560fL) // 0x8923560f +#define E_PF_TITLE_DATA_OVERRIDE_NOT_FOUND MAKE_E_HC(0x5610L) // 0x89235610 +#define E_PF_DUPLICATE_KEYS MAKE_E_HC(0x5611L) // 0x89235611 +#define E_PF_WAS_NOT_CREATED_WITH_CLOUD_ROOT MAKE_E_HC(0x5612L) // 0x89235612 +#define E_PF_LEGACY_MULTIPLAYER_SERVERS_DEPRECATED MAKE_E_HC(0x5613L) // 0x89235613 +#define E_PF_VIRTUAL_CURRENCY_CURRENTLY_UNAVAILABLE MAKE_E_HC(0x5614L) // 0x89235614 +#define E_PF_STEAM_USER_NOT_FOUND MAKE_E_HC(0x5615L) // 0x89235615 +#define E_PF_ELASTIC_SEARCH_OPERATION_FAILED MAKE_E_HC(0x5616L) // 0x89235616 +#define E_PF_NOT_IMPLEMENTED MAKE_E_HC(0x5617L) // 0x89235617 +#define E_PF_PUBLISHER_NOT_FOUND MAKE_E_HC(0x5618L) // 0x89235618 +#define E_PF_PUBLISHER_DELETED MAKE_E_HC(0x5619L) // 0x89235619 +#define E_PF_API_DISABLED_FOR_MIGRATION MAKE_E_HC(0x561aL) // 0x8923561a +#define E_PF_RESOURCE_NAME_UPDATE_NOT_ALLOWED MAKE_E_HC(0x561bL) // 0x8923561b +#define E_PF_API_NOT_ENABLED_FOR_TITLE MAKE_E_HC(0x561cL) // 0x8923561c +#define E_PF_DUPLICATE_TITLE_NAME_FOR_PUBLISHER MAKE_E_HC(0x561dL) // 0x8923561d +#define E_PF_AZURE_TITLE_CREATION_IN_PROGRESS MAKE_E_HC(0x561eL) // 0x8923561e +#define E_PF_TITLE_CONSTRAINTS_PUBLISHER_DELETION MAKE_E_HC(0x561fL) // 0x8923561f +#define E_PF_INVALID_PLAYER_ACCOUNT_POOL_ID MAKE_E_HC(0x5620L) // 0x89235620 +#define E_PF_PLAYER_ACCOUNT_POOL_NOT_FOUND MAKE_E_HC(0x5621L) // 0x89235621 +#define E_PF_PLAYER_ACCOUNT_POOL_DELETED MAKE_E_HC(0x5622L) // 0x89235622 +#define E_PF_TITLE_CLEANUP_IN_PROGRESS MAKE_E_HC(0x5623L) // 0x89235623 +#define E_PF_AZURE_RESOURCE_CONCURRENT_OPERATION_IN_PROGRESS MAKE_E_HC(0x5624L) // 0x89235624 +#define E_PF_TITLE_PUBLISHER_UPDATE_NOT_ALLOWED MAKE_E_HC(0x5625L) // 0x89235625 +#define E_PF_AZURE_RESOURCE_MANAGER_NOT_SUPPORTED_IN_STAMP MAKE_E_HC(0x5626L) // 0x89235626 +#define E_PF_API_NOT_INCLUDED_IN_AZURE_PLAY_FAB_FEATURE_SET MAKE_E_HC(0x5627L) // 0x89235627 +#define E_PF_GOOGLE_SERVICE_ACCOUNT_FAILED_AUTH MAKE_E_HC(0x5628L) // 0x89235628 +#define E_PF_GOOGLE_API_SERVICE_UNAVAILABLE MAKE_E_HC(0x5629L) // 0x89235629 +#define E_PF_GOOGLE_API_SERVICE_UNKNOWN_ERROR MAKE_E_HC(0x562aL) // 0x8923562a +#define E_PF_NO_VALID_IDENTITY_FOR_AAD MAKE_E_HC(0x562bL) // 0x8923562b +#define E_PF_PLAYER_IDENTITY_LINK_NOT_FOUND MAKE_E_HC(0x562cL) // 0x8923562c +#define E_PF_PHOTON_APPLICATION_ID_ALREADY_IN_USE MAKE_E_HC(0x562dL) // 0x8923562d +#define E_PF_CLOUD_SCRIPT_UNABLE_TO_DELETE_PRODUCTION_REVISION MAKE_E_HC(0x562eL) // 0x8923562e +#define E_PF_CUSTOM_ID_NOT_FOUND MAKE_E_HC(0x562fL) // 0x8923562f +#define E_PF_AUTOMATION_INVALID_INPUT MAKE_E_HC(0x5630L) // 0x89235630 +#define E_PF_AUTOMATION_INVALID_RULE_NAME MAKE_E_HC(0x5631L) // 0x89235631 +#define E_PF_AUTOMATION_RULE_ALREADY_EXISTS MAKE_E_HC(0x5632L) // 0x89235632 +#define E_PF_AUTOMATION_RULE_LIMIT_EXCEEDED MAKE_E_HC(0x5633L) // 0x89235633 +#define E_PF_INVALID_GOOGLE_PLAY_GAMES_SERVER_AUTH_CODE MAKE_E_HC(0x5634L) // 0x89235634 +#define E_PF_PLAY_STREAM_CONNECTION_FAILED MAKE_E_HC(0x5635L) // 0x89235635 +#define E_PF_INVALID_EVENT_CONTENTS MAKE_E_HC(0x5636L) // 0x89235636 +#define E_PF_INSIGHTS_V_1_DEPRECATED MAKE_E_HC(0x5637L) // 0x89235637 +#define E_PF_ANALYSIS_SUBSCRIPTION_NOT_FOUND MAKE_E_HC(0x5638L) // 0x89235638 +#define E_PF_ANALYSIS_SUBSCRIPTION_FAILED MAKE_E_HC(0x5639L) // 0x89235639 +#define E_PF_ANALYSIS_SUBSCRIPTION_FOUND_ALREADY MAKE_E_HC(0x563aL) // 0x8923563a +#define E_PF_ANALYSIS_SUBSCRIPTION_MANAGEMENT_INVALID_INPUT MAKE_E_HC(0x563bL) // 0x8923563b +#define E_PF_INVALID_GAME_CENTER_ID MAKE_E_HC(0x563cL) // 0x8923563c +#define E_PF_INVALID_NINTENDO_SWITCH_ACCOUNT_ID MAKE_E_HC(0x563dL) // 0x8923563d +#define E_PF_ENTITY_API_KEYS_NOT_SUPPORTED MAKE_E_HC(0x563eL) // 0x8923563e +#define E_PF_IP_ADDRESS_BANNED MAKE_E_HC(0x563fL) // 0x8923563f +#define E_PF_ENTITY_LINEAGE_BANNED MAKE_E_HC(0x5640L) // 0x89235640 +#define E_PF_NAMESPACE_MISMATCH MAKE_E_HC(0x5641L) // 0x89235641 +#define E_PF_INVALID_SERVICE_CONFIGURATION MAKE_E_HC(0x5642L) // 0x89235642 +#define E_PF_INVALID_NAMESPACE_MISMATCH MAKE_E_HC(0x5643L) // 0x89235643 +#define E_PF_MATCHMAKING_ENTITY_INVALID MAKE_E_HC(0x5644L) // 0x89235644 +#define E_PF_MATCHMAKING_PLAYER_ATTRIBUTES_INVALID MAKE_E_HC(0x5645L) // 0x89235645 +#define E_PF_MATCHMAKING_QUEUE_NOT_FOUND MAKE_E_HC(0x5646L) // 0x89235646 +#define E_PF_MATCHMAKING_MATCH_NOT_FOUND MAKE_E_HC(0x5647L) // 0x89235647 +#define E_PF_MATCHMAKING_TICKET_NOT_FOUND MAKE_E_HC(0x5648L) // 0x89235648 +#define E_PF_MATCHMAKING_ALREADY_JOINED_TICKET MAKE_E_HC(0x5649L) // 0x89235649 +#define E_PF_MATCHMAKING_TICKET_ALREADY_COMPLETED MAKE_E_HC(0x564aL) // 0x8923564a +#define E_PF_MATCHMAKING_QUEUE_CONFIG_INVALID MAKE_E_HC(0x564bL) // 0x8923564b +#define E_PF_MATCHMAKING_MEMBER_PROFILE_INVALID MAKE_E_HC(0x564cL) // 0x8923564c +#define E_PF_NINTENDO_SWITCH_DEVICE_ID_NOT_LINKED MAKE_E_HC(0x564dL) // 0x8923564d +#define E_PF_MATCHMAKING_NOT_ENABLED MAKE_E_HC(0x564eL) // 0x8923564e +#define E_PF_MATCHMAKING_PLAYER_ATTRIBUTES_TOO_LARGE MAKE_E_HC(0x564fL) // 0x8923564f +#define E_PF_MATCHMAKING_NUMBER_OF_PLAYERS_IN_TICKET_TOO_LARGE MAKE_E_HC(0x5650L) // 0x89235650 +#define E_PF_MATCHMAKING_ATTRIBUTE_INVALID MAKE_E_HC(0x5651L) // 0x89235651 +#define E_PF_MATCHMAKING_PLAYER_HAS_NOT_JOINED_TICKET MAKE_E_HC(0x5652L) // 0x89235652 +#define E_PF_MATCHMAKING_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x5653L) // 0x89235653 +#define E_PF_MATCHMAKING_TICKET_MEMBERSHIP_LIMIT_EXCEEDED MAKE_E_HC(0x5654L) // 0x89235654 +#define E_PF_MATCHMAKING_UNAUTHORIZED MAKE_E_HC(0x5655L) // 0x89235655 +#define E_PF_MATCHMAKING_QUEUE_LIMIT_EXCEEDED MAKE_E_HC(0x5656L) // 0x89235656 +#define E_PF_MATCHMAKING_REQUEST_TYPE_MISMATCH MAKE_E_HC(0x5657L) // 0x89235657 +#define E_PF_MATCHMAKING_BAD_REQUEST MAKE_E_HC(0x5658L) // 0x89235658 +#define E_PF_PUB_SUB_FEATURE_NOT_ENABLED_FOR_TITLE MAKE_E_HC(0x5659L) // 0x89235659 +#define E_PF_PUB_SUB_TOO_MANY_REQUESTS MAKE_E_HC(0x565aL) // 0x8923565a +#define E_PF_PUB_SUB_CONNECTION_NOT_FOUND_FOR_ENTITY MAKE_E_HC(0x565bL) // 0x8923565b +#define E_PF_PUB_SUB_CONNECTION_HANDLE_INVALID MAKE_E_HC(0x565cL) // 0x8923565c +#define E_PF_PUB_SUB_SUBSCRIPTION_LIMIT_EXCEEDED MAKE_E_HC(0x565dL) // 0x8923565d +#define E_PF_TITLE_CONFIG_NOT_FOUND MAKE_E_HC(0x565eL) // 0x8923565e +#define E_PF_TITLE_CONFIG_UPDATE_CONFLICT MAKE_E_HC(0x565fL) // 0x8923565f +#define E_PF_TITLE_CONFIG_SERIALIZATION_ERROR MAKE_E_HC(0x5660L) // 0x89235660 +#define E_PF_CATALOG_API_NOT_IMPLEMENTED MAKE_E_HC(0x5661L) // 0x89235661 +#define E_PF_CATALOG_ENTITY_INVALID MAKE_E_HC(0x5662L) // 0x89235662 +#define E_PF_CATALOG_TITLE_ID_MISSING MAKE_E_HC(0x5663L) // 0x89235663 +#define E_PF_CATALOG_PLAYER_ID_MISSING MAKE_E_HC(0x5664L) // 0x89235664 +#define E_PF_CATALOG_CLIENT_IDENTITY_INVALID MAKE_E_HC(0x5665L) // 0x89235665 +#define E_PF_CATALOG_ONE_OR_MORE_FILES_INVALID MAKE_E_HC(0x5666L) // 0x89235666 +#define E_PF_CATALOG_ITEM_METADATA_INVALID MAKE_E_HC(0x5667L) // 0x89235667 +#define E_PF_CATALOG_ITEM_ID_INVALID MAKE_E_HC(0x5668L) // 0x89235668 +#define E_PF_CATALOG_SEARCH_PARAMETER_INVALID MAKE_E_HC(0x5669L) // 0x89235669 +#define E_PF_CATALOG_FEATURE_DISABLED MAKE_E_HC(0x566aL) // 0x8923566a +#define E_PF_CATALOG_CONFIG_INVALID MAKE_E_HC(0x566bL) // 0x8923566b +#define E_PF_CATALOG_ITEM_TYPE_INVALID MAKE_E_HC(0x566cL) // 0x8923566c +#define E_PF_CATALOG_BAD_REQUEST MAKE_E_HC(0x566dL) // 0x8923566d +#define E_PF_CATALOG_TOO_MANY_REQUESTS MAKE_E_HC(0x566eL) // 0x8923566e +#define E_PF_EXPORT_INVALID_STATUS_UPDATE MAKE_E_HC(0x566fL) // 0x8923566f +#define E_PF_EXPORT_INVALID_PREFIX MAKE_E_HC(0x5670L) // 0x89235670 +#define E_PF_EXPORT_BLOB_CONTAINER_DOES_NOT_EXIST MAKE_E_HC(0x5671L) // 0x89235671 +#define E_PF_EXPORT_NOT_FOUND MAKE_E_HC(0x5672L) // 0x89235672 +#define E_PF_EXPORT_COULD_NOT_UPDATE MAKE_E_HC(0x5673L) // 0x89235673 +#define E_PF_EXPORT_INVALID_STORAGE_TYPE MAKE_E_HC(0x5674L) // 0x89235674 +#define E_PF_EXPORT_AMAZON_BUCKET_DOES_NOT_EXIST MAKE_E_HC(0x5675L) // 0x89235675 +#define E_PF_EXPORT_INVALID_BLOB_STORAGE MAKE_E_HC(0x5676L) // 0x89235676 +#define E_PF_EXPORT_KUSTO_EXCEPTION MAKE_E_HC(0x5677L) // 0x89235677 +#define E_PF_EXPORT_KUSTO_CONNECTION_FAILED MAKE_E_HC(0x5678L) // 0x89235678 +#define E_PF_EXPORT_UNKNOWN_ERROR MAKE_E_HC(0x5679L) // 0x89235679 +#define E_PF_EXPORT_CANT_EDIT_PENDING_EXPORT MAKE_E_HC(0x567aL) // 0x8923567a +#define E_PF_EXPORT_LIMIT_EXPORTS MAKE_E_HC(0x567bL) // 0x8923567b +#define E_PF_EXPORT_LIMIT_EVENTS MAKE_E_HC(0x567cL) // 0x8923567c +#define E_PF_EXPORT_INVALID_PARTITION_STATUS_MODIFICATION MAKE_E_HC(0x567dL) // 0x8923567d +#define E_PF_EXPORT_COULD_NOT_CREATE MAKE_E_HC(0x567eL) // 0x8923567e +#define E_PF_EXPORT_NO_BACKING_DATABASE_FOUND MAKE_E_HC(0x567fL) // 0x8923567f +#define E_PF_EXPORT_COULD_NOT_DELETE MAKE_E_HC(0x5680L) // 0x89235680 +#define E_PF_EXPORT_CANNOT_DETERMINE_EVENT_QUERY MAKE_E_HC(0x5681L) // 0x89235681 +#define E_PF_EXPORT_INVALID_QUERY_SCHEMA_MODIFICATION MAKE_E_HC(0x5682L) // 0x89235682 +#define E_PF_EXPORT_QUERY_SCHEMA_MISSING_REQUIRED_COLUMNS MAKE_E_HC(0x5683L) // 0x89235683 +#define E_PF_EXPORT_CANNOT_PARSE_QUERY MAKE_E_HC(0x5684L) // 0x89235684 +#define E_PF_EXPORT_CONTROL_COMMANDS_NOT_ALLOWED MAKE_E_HC(0x5685L) // 0x89235685 +#define E_PF_EXPORT_QUERY_MISSING_TABLE_REFERENCE MAKE_E_HC(0x5686L) // 0x89235686 +#define E_PF_EXPORT_INSIGHTS_V_1_DEPRECATED MAKE_E_HC(0x5687L) // 0x89235687 +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_NAME MAKE_E_HC(0x5688L) // 0x89235688 +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_DESCRIPTION MAKE_E_HC(0x5689L) // 0x89235689 +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_CONDITIONS MAKE_E_HC(0x568aL) // 0x8923568a +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_START_DATE MAKE_E_HC(0x568bL) // 0x8923568b +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_END_DATE MAKE_E_HC(0x568cL) // 0x8923568c +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_GROUP_BY MAKE_E_HC(0x568dL) // 0x8923568d +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_AGGREGATE_TYPE MAKE_E_HC(0x568eL) // 0x8923568e +#define E_PF_EXPLORER_BASIC_INVALID_QUERY_AGGREGATE_PROPERTY MAKE_E_HC(0x568fL) // 0x8923568f +#define E_PF_EXPLORER_BASIC_LOAD_QUERIES_ERROR MAKE_E_HC(0x5690L) // 0x89235690 +#define E_PF_EXPLORER_BASIC_LOAD_QUERY_ERROR MAKE_E_HC(0x5691L) // 0x89235691 +#define E_PF_EXPLORER_BASIC_CREATE_QUERY_ERROR MAKE_E_HC(0x5692L) // 0x89235692 +#define E_PF_EXPLORER_BASIC_DELETE_QUERY_ERROR MAKE_E_HC(0x5693L) // 0x89235693 +#define E_PF_EXPLORER_BASIC_UPDATE_QUERY_ERROR MAKE_E_HC(0x5694L) // 0x89235694 +#define E_PF_EXPLORER_BASIC_SAVED_QUERIES_LIMIT MAKE_E_HC(0x5695L) // 0x89235695 +#define E_PF_EXPLORER_BASIC_SAVED_QUERY_NOT_FOUND MAKE_E_HC(0x5696L) // 0x89235696 +#define E_PF_TENANT_SHARD_MAPPER_SHARD_NOT_FOUND MAKE_E_HC(0x5697L) // 0x89235697 +#define E_PF_TITLE_NOT_ENABLED_FOR_PARTY MAKE_E_HC(0x5698L) // 0x89235698 +#define E_PF_PARTY_VERSION_NOT_FOUND MAKE_E_HC(0x5699L) // 0x89235699 +#define E_PF_MULTIPLAYER_SERVER_BUILD_REFERENCED_BY_MATCHMAKING_QUEUE MAKE_E_HC(0x569aL) // 0x8923569a +#define E_PF_MULTIPLAYER_SERVER_BUILD_REFERENCED_BY_BUILD_ALIAS MAKE_E_HC(0x569bL) // 0x8923569b +#define E_PF_MULTIPLAYER_SERVER_BUILD_ALIAS_REFERENCED_BY_MATCHMAKING_QUEUE MAKE_E_HC(0x569cL) // 0x8923569c +#define E_PF_PARTY_SERIALIZATION_ERROR MAKE_E_HC(0x569dL) // 0x8923569d +#define E_PF_EXPERIMENTATION_EXPERIMENT_STOPPED MAKE_E_HC(0x569eL) // 0x8923569e +#define E_PF_EXPERIMENTATION_EXPERIMENT_RUNNING MAKE_E_HC(0x569fL) // 0x8923569f +#define E_PF_EXPERIMENTATION_EXPERIMENT_NOT_FOUND MAKE_E_HC(0x56a0L) // 0x892356a0 +#define E_PF_EXPERIMENTATION_EXPERIMENT_NEVER_STARTED MAKE_E_HC(0x56a1L) // 0x892356a1 +#define E_PF_EXPERIMENTATION_EXPERIMENT_DELETED MAKE_E_HC(0x56a2L) // 0x892356a2 +#define E_PF_EXPERIMENTATION_CLIENT_TIMEOUT MAKE_E_HC(0x56a3L) // 0x892356a3 +#define E_PF_EXPERIMENTATION_INVALID_VARIANT_CONFIGURATION MAKE_E_HC(0x56a4L) // 0x892356a4 +#define E_PF_EXPERIMENTATION_INVALID_VARIABLE_CONFIGURATION MAKE_E_HC(0x56a5L) // 0x892356a5 +#define E_PF_EXPERIMENT_INVALID_ID MAKE_E_HC(0x56a6L) // 0x892356a6 +#define E_PF_EXPERIMENTATION_NO_SCORECARD MAKE_E_HC(0x56a7L) // 0x892356a7 +#define E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_FAILED MAKE_E_HC(0x56a8L) // 0x892356a8 +#define E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_DISABLED MAKE_E_HC(0x56a9L) // 0x892356a9 +#define E_PF_EXPERIMENTATION_INVALID_DURATION MAKE_E_HC(0x56aaL) // 0x892356aa +#define E_PF_EXPERIMENTATION_MAX_EXPERIMENTS_REACHED MAKE_E_HC(0x56abL) // 0x892356ab +#define E_PF_EXPERIMENTATION_EXPERIMENT_SCHEDULING_IN_PROGRESS MAKE_E_HC(0x56acL) // 0x892356ac +#define E_PF_EXPERIMENTATION_INVALID_END_DATE MAKE_E_HC(0x56adL) // 0x892356ad +#define E_PF_EXPERIMENTATION_INVALID_START_DATE MAKE_E_HC(0x56aeL) // 0x892356ae +#define E_PF_EXPERIMENTATION_MAX_DURATION_EXCEEDED MAKE_E_HC(0x56afL) // 0x892356af +#define E_PF_EXPERIMENTATION_EXCLUSION_GROUP_NOT_FOUND MAKE_E_HC(0x56b0L) // 0x892356b0 +#define E_PF_EXPERIMENTATION_EXCLUSION_GROUP_INSUFFICIENT_CAPACITY MAKE_E_HC(0x56b1L) // 0x892356b1 +#define E_PF_EXPERIMENTATION_EXCLUSION_GROUP_CANNOT_DELETE MAKE_E_HC(0x56b2L) // 0x892356b2 +#define E_PF_EXPERIMENTATION_EXCLUSION_GROUP_INVALID_TRAFFIC_ALLOCATION MAKE_E_HC(0x56b3L) // 0x892356b3 +#define E_PF_EXPERIMENTATION_EXCLUSION_GROUP_INVALID_NAME MAKE_E_HC(0x56b4L) // 0x892356b4 +#define E_PF_MAX_ACTION_DEPTH_EXCEEDED MAKE_E_HC(0x56b5L) // 0x892356b5 +#define E_PF_TITLE_NOT_ON_UPDATED_PRICING_PLAN MAKE_E_HC(0x56b6L) // 0x892356b6 +#define E_PF_SEGMENT_MANAGEMENT_TITLE_NOT_IN_FLIGHT MAKE_E_HC(0x56b7L) // 0x892356b7 +#define E_PF_SEGMENT_MANAGEMENT_NO_EXPRESSION_TREE MAKE_E_HC(0x56b8L) // 0x892356b8 +#define E_PF_SEGMENT_MANAGEMENT_TRIGGER_ACTION_COUNT_OVER_LIMIT MAKE_E_HC(0x56b9L) // 0x892356b9 +#define E_PF_SEGMENT_MANAGEMENT_SEGMENT_COUNT_OVER_LIMIT MAKE_E_HC(0x56baL) // 0x892356ba +#define E_PF_SEGMENT_MANAGEMENT_INVALID_SEGMENT_ID MAKE_E_HC(0x56bbL) // 0x892356bb +#define E_PF_SEGMENT_MANAGEMENT_INVALID_INPUT MAKE_E_HC(0x56bcL) // 0x892356bc +#define E_PF_SEGMENT_MANAGEMENT_INVALID_SEGMENT_NAME MAKE_E_HC(0x56bdL) // 0x892356bd +#define E_PF_DELETE_SEGMENT_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x56beL) // 0x892356be +#define E_PF_CREATE_SEGMENT_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x56bfL) // 0x892356bf +#define E_PF_UPDATE_SEGMENT_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x56c0L) // 0x892356c0 +#define E_PF_GET_SEGMENTS_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x56c1L) // 0x892356c1 +#define E_PF_ASYNC_EXPORT_NOT_IN_FLIGHT MAKE_E_HC(0x56c2L) // 0x892356c2 +#define E_PF_ASYNC_EXPORT_NOT_FOUND MAKE_E_HC(0x56c3L) // 0x892356c3 +#define E_PF_ASYNC_EXPORT_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x56c4L) // 0x892356c4 +#define E_PF_ANALYTICS_SEGMENT_COUNT_OVER_LIMIT MAKE_E_HC(0x56c5L) // 0x892356c5 +#define E_PF_SNAPSHOT_NOT_FOUND MAKE_E_HC(0x56c6L) // 0x892356c6 +#define E_PF_INVENTORY_API_NOT_IMPLEMENTED MAKE_E_HC(0x56c7L) // 0x892356c7 +#define E_PF_LOBBY_DOES_NOT_EXIST MAKE_E_HC(0x56c8L) // 0x892356c8 +#define E_PF_LOBBY_RATE_LIMIT_EXCEEDED MAKE_E_HC(0x56c9L) // 0x892356c9 +#define E_PF_LOBBY_PLAYER_ALREADY_JOINED MAKE_E_HC(0x56caL) // 0x892356ca +#define E_PF_LOBBY_NOT_JOINABLE MAKE_E_HC(0x56cbL) // 0x892356cb +#define E_PF_LOBBY_MEMBER_CANNOT_REJOIN MAKE_E_HC(0x56ccL) // 0x892356cc +#define E_PF_LOBBY_CURRENT_PLAYERS_MORE_THAN_MAX_PLAYERS MAKE_E_HC(0x56cdL) // 0x892356cd +#define E_PF_LOBBY_PLAYER_NOT_PRESENT MAKE_E_HC(0x56ceL) // 0x892356ce +#define E_PF_LOBBY_BAD_REQUEST MAKE_E_HC(0x56cfL) // 0x892356cf +#define E_PF_LOBBY_PLAYER_MAX_LOBBY_LIMIT_EXCEEDED MAKE_E_HC(0x56d0L) // 0x892356d0 +#define E_PF_LOBBY_NEW_OWNER_MUST_BE_CONNECTED MAKE_E_HC(0x56d1L) // 0x892356d1 +#define E_PF_LOBBY_CURRENT_OWNER_STILL_CONNECTED MAKE_E_HC(0x56d2L) // 0x892356d2 +#define E_PF_LOBBY_MEMBER_IS_NOT_OWNER MAKE_E_HC(0x56d3L) // 0x892356d3 +#define E_PF_EVENT_SAMPLING_INVALID_RATIO MAKE_E_HC(0x56d4L) // 0x892356d4 +#define E_PF_EVENT_SAMPLING_INVALID_EVENT_NAMESPACE MAKE_E_HC(0x56d5L) // 0x892356d5 +#define E_PF_EVENT_SAMPLING_INVALID_EVENT_NAME MAKE_E_HC(0x56d6L) // 0x892356d6 +#define E_PF_EVENT_SAMPLING_RATIO_NOT_FOUND MAKE_E_HC(0x56d7L) // 0x892356d7 +#define E_PF_TELEMETRY_KEY_NOT_FOUND MAKE_E_HC(0x56d8L) // 0x892356d8 +#define E_PF_TELEMETRY_KEY_INVALID_NAME MAKE_E_HC(0x56d9L) // 0x892356d9 +#define E_PF_TELEMETRY_KEY_ALREADY_EXISTS MAKE_E_HC(0x56daL) // 0x892356da +#define E_PF_TELEMETRY_KEY_INVALID MAKE_E_HC(0x56dbL) // 0x892356db +#define E_PF_TELEMETRY_KEY_COUNT_OVER_LIMIT MAKE_E_HC(0x56dcL) // 0x892356dc +#define E_PF_TELEMETRY_KEY_DEACTIVATED MAKE_E_HC(0x56ddL) // 0x892356dd +#define E_PF_TELEMETRY_KEY_LONG_INSIGHTS_RETENTION_NOT_ALLOWED MAKE_E_HC(0x56deL) // 0x892356de +#define E_PF_EVENT_SINK_CONNECTION_INVALID MAKE_E_HC(0x56dfL) // 0x892356df +#define E_PF_EVENT_SINK_CONNECTION_UNAUTHORIZED MAKE_E_HC(0x56e0L) // 0x892356e0 +#define E_PF_EVENT_SINK_REGION_INVALID MAKE_E_HC(0x56e1L) // 0x892356e1 +#define E_PF_EVENT_SINK_LIMIT_EXCEEDED MAKE_E_HC(0x56e2L) // 0x892356e2 +#define E_PF_EVENT_SINK_SAS_TOKEN_INVALID MAKE_E_HC(0x56e3L) // 0x892356e3 +#define E_PF_EVENT_SINK_NOT_FOUND MAKE_E_HC(0x56e4L) // 0x892356e4 +#define E_PF_EVENT_SINK_NAME_INVALID MAKE_E_HC(0x56e5L) // 0x892356e5 +#define E_PF_EVENT_SINK_SAS_TOKEN_PERMISSION_INVALID MAKE_E_HC(0x56e6L) // 0x892356e6 +#define E_PF_EVENT_SINK_SECRET_INVALID MAKE_E_HC(0x56e7L) // 0x892356e7 +#define E_PF_EVENT_SINK_TENANT_NOT_FOUND MAKE_E_HC(0x56e8L) // 0x892356e8 +#define E_PF_EVENT_SINK_AAD_NOT_FOUND MAKE_E_HC(0x56e9L) // 0x892356e9 +#define E_PF_EVENT_SINK_DATABASE_NOT_FOUND MAKE_E_HC(0x56eaL) // 0x892356ea +#define E_PF_OPERATION_CANCELED MAKE_E_HC(0x56ebL) // 0x892356eb +#define E_PF_INVALID_DISPLAY_NAME_RANDOM_SUFFIX_LENGTH MAKE_E_HC(0x56ecL) // 0x892356ec +#define E_PF_ALLOW_NON_UNIQUE_PLAYER_DISPLAY_NAMES_DISABLE_NOT_ALLOWED MAKE_E_HC(0x56edL) // 0x892356ed +#define E_PF_PARTITIONED_EVENT_INVALID MAKE_E_HC(0x56eeL) // 0x892356ee +#define E_PF_PARTITIONED_EVENT_COUNT_OVER_LIMIT MAKE_E_HC(0x56efL) // 0x892356ef +#define E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_NAME_TOO_LONG MAKE_E_HC(0x56f0L) // 0x892356f0 +#define E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_NAME_IS_INVALID MAKE_E_HC(0x56f1L) // 0x892356f1 +#define E_PF_PLAYER_CUSTOM_PROPERTIES_STRING_PROPERTY_VALUE_TOO_LONG MAKE_E_HC(0x56f2L) // 0x892356f2 +#define E_PF_PLAYER_CUSTOM_PROPERTIES_VALUE_IS_INVALID_TYPE MAKE_E_HC(0x56f3L) // 0x892356f3 +#define E_PF_PLAYER_CUSTOM_PROPERTIES_VERSION_MISMATCH MAKE_E_HC(0x56f4L) // 0x892356f4 +#define E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_COUNT_TOO_HIGH MAKE_E_HC(0x56f5L) // 0x892356f5 +#define E_PF_PLAYER_CUSTOM_PROPERTIES_DUPLICATE_PROPERTY_NAME MAKE_E_HC(0x56f6L) // 0x892356f6 +#define E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_DOES_NOT_EXIST MAKE_E_HC(0x56f7L) // 0x892356f7 +#define E_PF_ADDON_ALREADY_EXISTS MAKE_E_HC(0x56f8L) // 0x892356f8 +#define E_PF_ADDON_DOESNT_EXIST MAKE_E_HC(0x56f9L) // 0x892356f9 + +} diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/PFEvents.h b/Source/PlayFabCore/Include/Generated/playfab/core/PFEvents.h new file mode 100644 index 0000000..4bed425 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/PFEvents.h @@ -0,0 +1,393 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Creates a new telemetry key for the title. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32, Nintendo Switch, and Sony PlayStation®. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFEventsCreateTelemetryKeyAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFEventsCreateTelemetryKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a CreateTelemetryKey call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_TELEMETRY_KEY_ALREADY_EXISTS, +/// E_PF_TELEMETRY_KEY_INVALID_NAME, E_PF_TELEMETRY_KEY_LONG_INSIGHTS_RETENTION_NOT_ALLOWED or any of +/// the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFEventsCreateTelemetryKeyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFEventsCreateTelemetryKeyAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEventsCreateTelemetryKeyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsCreateTelemetryKeyResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Deletes a telemetry key configured for the title. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32, Nintendo Switch, and Sony PlayStation®. +/// When the asynchronous task is complete, call to +/// get the result. +/// +PF_API PFEventsDeleteTelemetryKeyAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFEventsDeleteTelemetryKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFEventsDeleteTelemetryKeyAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFEventsDeleteTelemetryKeyResponse object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFEventsDeleteTelemetryKeyGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEventsDeleteTelemetryKeyResponse* result +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Gets information about a telemetry key configured for the title. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32, Nintendo Switch, and Sony PlayStation®. +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFEventsGetTelemetryKeyAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFEventsGetTelemetryKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetTelemetryKey call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_TELEMETRY_KEY_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFEventsGetTelemetryKeyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFEventsGetTelemetryKeyAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEventsGetTelemetryKeyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsGetTelemetryKeyResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Lists all telemetry keys configured for the title. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32, Nintendo Switch, and Sony PlayStation®. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFEventsListTelemetryKeysAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFEventsListTelemetryKeysRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListTelemetryKeys call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFEventsListTelemetryKeysGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFEventsListTelemetryKeysAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEventsListTelemetryKeysGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsListTelemetryKeysResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Sets a telemetry key to the active or deactivated state. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32, Nintendo Switch, and Sony PlayStation®. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFEventsSetTelemetryKeyActiveAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFEventsSetTelemetryKeyActiveRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a SetTelemetryKeyActive call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_TELEMETRY_KEY_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFEventsSetTelemetryKeyActiveGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFEventsSetTelemetryKeyActiveAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEventsSetTelemetryKeyActiveGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsSetTelemetryKeyActiveResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#endif + +/// +/// Write batches of entity based events to PlayStream. The namespace of the Event must be 'custom' or +/// start with 'custom.'. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFEventsWriteEventsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFEventsWriteEventsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a WriteEvents call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_BROKEN, +/// E_PF_EVENT_ENTITY_NOT_ALLOWED, E_PF_EVENT_NAMESPACE_NOT_ALLOWED, E_PF_INVALID_EVENT_CONTENTS, E_PF_INVALID_JSON_CONTENT, +/// E_PF_PER_ENTITY_EVENT_RATE_LIMIT_EXCEEDED or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFEventsWriteEventsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFEventsWriteEventsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEventsWriteEventsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsWriteEventsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +/// +/// Write batches of entity based events to as Telemetry events (bypass PlayStream). The namespace must +/// be 'custom' or start with 'custom.' +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This API must be called with either X-EntityToken or X-TelemetryKey headers. If sending X-EntityToken +/// the value must be a valid EntityToken for your title. If using X-TelemetryKey the value must be a +/// Telemetry Key configured for your title set to 'Active'. If both are provided, X-TelemetryKey will +/// be ignored. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFEventsWriteTelemetryEventsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFEventsWriteEventsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a WriteTelemetryEvents call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENCRYPTION_KEY_BROKEN, +/// E_PF_EVENT_ENTITY_NOT_ALLOWED, E_PF_EVENT_NAMESPACE_NOT_ALLOWED, E_PF_INVALID_JSON_CONTENT, E_PF_PER_ENTITY_EVENT_RATE_LIMIT_EXCEEDED, +/// E_PF_TELEMETRY_KEY_DEACTIVATED, E_PF_TELEMETRY_KEY_INVALID or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFEventsWriteTelemetryEventsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFEventsWriteTelemetryEventsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// Result code for this API operation. +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFEventsWriteTelemetryEventsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsWriteEventsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/PFEventsTypes.h b/Source/PlayFabCore/Include/Generated/playfab/core/PFEventsTypes.h new file mode 100644 index 0000000..e66a2e2 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/PFEventsTypes.h @@ -0,0 +1,374 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFEventsCreateTelemetryKeyRequest data model. +/// +typedef struct PFEventsCreateTelemetryKeyRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The name of the new key. Telemetry key names must be unique within the scope of the title. + /// + _Null_terminated_ const char* keyName; + +} PFEventsCreateTelemetryKeyRequest; + +/// +/// PFEventsTelemetryKeyDetails data model. +/// +typedef struct PFEventsTelemetryKeyDetails +{ + /// + /// When the key was created. + /// + time_t createTime; + + /// + /// Whether or not the key is currently active. Deactivated keys cannot be used for telemetry ingestion. + /// + bool isActive; + + /// + /// (Optional) The key that can be distributed to clients for use during telemetry ingestion. + /// + _Maybenull_ _Null_terminated_ const char* keyValue; + + /// + /// When the key was last updated. + /// + time_t lastUpdateTime; + + /// + /// (Optional) The name of the key. Telemetry key names are unique within the scope of the title. + /// + _Maybenull_ _Null_terminated_ const char* name; + +} PFEventsTelemetryKeyDetails; + +/// +/// PFEventsCreateTelemetryKeyResponse data model. +/// +typedef struct PFEventsCreateTelemetryKeyResponse +{ + /// + /// (Optional) Details about the newly created telemetry key. + /// + _Maybenull_ PFEventsTelemetryKeyDetails const* newKeyDetails; + +} PFEventsCreateTelemetryKeyResponse; + +/// +/// PFEventsDeleteTelemetryKeyRequest data model. +/// +typedef struct PFEventsDeleteTelemetryKeyRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The name of the key to delete. + /// + _Null_terminated_ const char* keyName; + +} PFEventsDeleteTelemetryKeyRequest; + +/// +/// PFEventsDeleteTelemetryKeyResponse data model. +/// +typedef struct PFEventsDeleteTelemetryKeyResponse +{ + /// + /// Indicates whether or not the key was deleted. If false, no key with that name existed. + /// + bool wasKeyDeleted; + +} PFEventsDeleteTelemetryKeyResponse; + +/// +/// PFEventsGetTelemetryKeyRequest data model. +/// +typedef struct PFEventsGetTelemetryKeyRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The name of the key to retrieve. + /// + _Null_terminated_ const char* keyName; + +} PFEventsGetTelemetryKeyRequest; + +/// +/// PFEventsGetTelemetryKeyResponse data model. +/// +typedef struct PFEventsGetTelemetryKeyResponse +{ + /// + /// (Optional) Details about the requested telemetry key. + /// + _Maybenull_ PFEventsTelemetryKeyDetails const* keyDetails; + +} PFEventsGetTelemetryKeyResponse; + +/// +/// PFEventsListTelemetryKeysRequest data model. +/// +typedef struct PFEventsListTelemetryKeysRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFEventsListTelemetryKeysRequest; + +/// +/// PFEventsListTelemetryKeysResponse data model. +/// +typedef struct PFEventsListTelemetryKeysResponse +{ + /// + /// (Optional) The telemetry keys configured for the title. + /// + _Maybenull_ _Field_size_(keyDetailsCount) PFEventsTelemetryKeyDetails const* const* keyDetails; + + /// + /// Count of keyDetails + /// + uint32_t keyDetailsCount; + +} PFEventsListTelemetryKeysResponse; + +/// +/// PFEventsSetTelemetryKeyActiveRequest data model. +/// +typedef struct PFEventsSetTelemetryKeyActiveRequest +{ + /// + /// Whether to set the key to active (true) or deactivated (false). + /// + bool active; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The name of the key to update. + /// + _Null_terminated_ const char* keyName; + +} PFEventsSetTelemetryKeyActiveRequest; + +/// +/// PFEventsSetTelemetryKeyActiveResponse data model. +/// +typedef struct PFEventsSetTelemetryKeyActiveResponse +{ + /// + /// (Optional) The most current details about the telemetry key that was to be updated. + /// + _Maybenull_ PFEventsTelemetryKeyDetails const* keyDetails; + + /// + /// Indicates whether or not the key was updated. If false, the key was already in the desired state. + /// + bool wasKeyUpdated; + +} PFEventsSetTelemetryKeyActiveResponse; + +/// +/// PFEventsEventContents data model. +/// +typedef struct PFEventsEventContents +{ + /// + /// (Optional) The optional custom tags associated with the event (e.g. build number, external trace + /// identifiers, etc.). Before an event is written, this collection and the base request custom tags + /// will be merged, but not overriden. This enables the caller to specify static tags and per event + /// tags. + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Entity associated with the event. If null, the event will apply to the calling entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The namespace in which the event is defined. Allowed namespaces can vary by API. + /// + _Null_terminated_ const char* eventNamespace; + + /// + /// The name of this event. + /// + _Null_terminated_ const char* name; + + /// + /// (Optional) The original unique identifier associated with this event before it was posted to + /// PlayFab. The value might differ from the EventId value, which is assigned when the event is received + /// by the server. + /// + _Maybenull_ _Null_terminated_ const char* originalId; + + /// + /// (Optional) The time (in UTC) associated with this event when it occurred. If specified, this + /// value is stored in the OriginalTimestamp property of the PlayStream event. + /// + _Maybenull_ time_t const* originalTimestamp; + + /// + /// (Optional) Arbitrary data associated with the event. Only one of Payload or PayloadJSON is allowed. + /// + PFJsonObject payload; + + /// + /// (Optional) Arbitrary data associated with the event, represented as a JSON serialized string. + /// Only one of Payload or PayloadJSON is allowed. + /// + _Maybenull_ _Null_terminated_ const char* payloadJSON; + +} PFEventsEventContents; + +/// +/// PFEventsWriteEventsRequest data model. +/// +typedef struct PFEventsWriteEventsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The collection of events to write. Up to 200 events can be written per request. + /// + _Field_size_(eventsCount) PFEventsEventContents const* const* events; + + /// + /// Count of events + /// + uint32_t eventsCount; + +} PFEventsWriteEventsRequest; + +/// +/// PFEventsWriteEventsResponse data model. +/// +typedef struct PFEventsWriteEventsResponse +{ + /// + /// (Optional) The unique identifiers assigned by the server to the events, in the same order as + /// the events in the request. Only returned if FlushToPlayStream option is true. + /// + _Maybenull_ _Field_size_(assignedEventIdsCount) const char* const* assignedEventIds; + + /// + /// Count of assignedEventIds + /// + uint32_t assignedEventIdsCount; + +} PFEventsWriteEventsResponse; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/PFTypes.h b/Source/PlayFabCore/Include/Generated/playfab/core/PFTypes.h new file mode 100644 index 0000000..b81f198 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/PFTypes.h @@ -0,0 +1,2189 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// TitleActivationStatus enum. +/// +enum class PFTitleActivationStatus : uint32_t +{ + None, + ActivatedTitleKey, + PendingSteam, + ActivatedSteam, + RevokedSteam +}; + +/// +/// Currency enum. +/// +enum class PFCurrency : uint32_t +{ + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD +}; + +/// +/// UserOrigination enum. +/// +enum class PFUserOrigination : uint32_t +{ + Organic, + Steam, + Google, + Amazon, + Facebook, + Kongregate, + GamersFirst, + Unknown, + IOS, + LoadTest, + Android, + PSN, + GameCenter, + CustomId, + XboxLive, + Parse, + Twitch, + ServerCustomId, + NintendoSwitchDeviceId, + FacebookInstantGamesId, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames +}; + +/// +/// EmailVerificationStatus enum. +/// +enum class PFEmailVerificationStatus : uint32_t +{ + Unverified, + Pending, + Confirmed +}; + +/// +/// LoginIdentityProvider enum. +/// +enum class PFLoginIdentityProvider : uint32_t +{ + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames +}; + +/// +/// ContinentCode enum. +/// +enum class PFContinentCode : uint32_t +{ + AF, + AN, + AS, + EU, + NA, + OC, + SA +}; + +/// +/// CountryCode enum. +/// +enum class PFCountryCode : uint32_t +{ + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW +}; + +/// +/// SubscriptionProviderStatus enum. +/// +enum class PFSubscriptionProviderStatus : uint32_t +{ + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending +}; + +/// +/// PushNotificationPlatform enum. +/// +enum class PFPushNotificationPlatform : uint32_t +{ + ApplePushNotificationService, + GoogleCloudMessaging +}; + +/// +/// UserDataPermission enum. +/// +enum class PFUserDataPermission : uint32_t +{ + Private, + Public +}; + +/// +/// A token returned when registering a callback to identify the registration. This token is later used +/// to unregister the callback. +/// +typedef uint64_t PFRegistrationToken; + +/// +/// String representation of a Json Object +/// +typedef struct PFJsonObject +{ + _Maybenull_ _Null_terminated_ const char* stringValue; +} PFJsonObject; + +/// +/// PFPlayerProfileViewConstraints data model. +/// +typedef struct PFPlayerProfileViewConstraints +{ + /// + /// Whether to show player's avatar URL. Defaults to false. + /// + bool showAvatarUrl; + + /// + /// Whether to show the banned until time. Defaults to false. + /// + bool showBannedUntil; + + /// + /// Whether to show campaign attributions. Defaults to false. + /// + bool showCampaignAttributions; + + /// + /// Whether to show contact email addresses. Defaults to false. + /// + bool showContactEmailAddresses; + + /// + /// Whether to show the created date. Defaults to false. + /// + bool showCreated; + + /// + /// Whether to show the display name. Defaults to false. + /// + bool showDisplayName; + + /// + /// Whether to show player's experiment variants. Defaults to false. + /// + bool showExperimentVariants; + + /// + /// Whether to show the last login time. Defaults to false. + /// + bool showLastLogin; + + /// + /// Whether to show the linked accounts. Defaults to false. + /// + bool showLinkedAccounts; + + /// + /// Whether to show player's locations. Defaults to false. + /// + bool showLocations; + + /// + /// Whether to show player's membership information. Defaults to false. + /// + bool showMemberships; + + /// + /// Whether to show origination. Defaults to false. + /// + bool showOrigination; + + /// + /// Whether to show push notification registrations. Defaults to false. + /// + bool showPushNotificationRegistrations; + + /// + /// Reserved for future development. + /// + bool showStatistics; + + /// + /// Whether to show tags. Defaults to false. + /// + bool showTags; + + /// + /// Whether to show the total value to date in usd. Defaults to false. + /// + bool showTotalValueToDateInUsd; + + /// + /// Whether to show the values to date. Defaults to false. + /// + bool showValuesToDate; + +} PFPlayerProfileViewConstraints; + +/// +/// PFGetPlayerCombinedInfoRequestParams data model. +/// +typedef struct PFGetPlayerCombinedInfoRequestParams +{ + /// + /// Whether to get character inventories. Defaults to false. + /// + bool getCharacterInventories; + + /// + /// Whether to get the list of characters. Defaults to false. + /// + bool getCharacterList; + + /// + /// Whether to get player profile. Defaults to false. Has no effect for a new player. + /// + bool getPlayerProfile; + + /// + /// Whether to get player statistics. Defaults to false. + /// + bool getPlayerStatistics; + + /// + /// Whether to get title data. Defaults to false. + /// + bool getTitleData; + + /// + /// Whether to get the player's account Info. Defaults to false. + /// + bool getUserAccountInfo; + + /// + /// Whether to get the player's custom data. Defaults to false. + /// + bool getUserData; + + /// + /// Whether to get the player's inventory. Defaults to false. + /// + bool getUserInventory; + + /// + /// Whether to get the player's read only data. Defaults to false. + /// + bool getUserReadOnlyData; + + /// + /// Whether to get the player's virtual currency balances. Defaults to false. + /// + bool getUserVirtualCurrency; + + /// + /// (Optional) Specific statistics to retrieve. Leave null to get all keys. Has no effect if GetPlayerStatistics + /// is false. + /// + _Maybenull_ _Field_size_(playerStatisticNamesCount) const char* const* playerStatisticNames; + + /// + /// Count of playerStatisticNames + /// + uint32_t playerStatisticNamesCount; + + /// + /// (Optional) Specifies the properties to return from the player profile. Defaults to returning + /// the player's display name. + /// + _Maybenull_ PFPlayerProfileViewConstraints const* profileConstraints; + + /// + /// (Optional) Specific keys to search for in the custom data. Leave null to get all keys. Has no + /// effect if GetTitleData is false. + /// + _Maybenull_ _Field_size_(titleDataKeysCount) const char* const* titleDataKeys; + + /// + /// Count of titleDataKeys + /// + uint32_t titleDataKeysCount; + + /// + /// (Optional) Specific keys to search for in the custom data. Leave null to get all keys. Has no + /// effect if GetUserData is false. + /// + _Maybenull_ _Field_size_(userDataKeysCount) const char* const* userDataKeys; + + /// + /// Count of userDataKeys + /// + uint32_t userDataKeysCount; + + /// + /// (Optional) Specific keys to search for in the custom data. Leave null to get all keys. Has no + /// effect if GetUserReadOnlyData is false. + /// + _Maybenull_ _Field_size_(userReadOnlyDataKeysCount) const char* const* userReadOnlyDataKeys; + + /// + /// Count of userReadOnlyDataKeys + /// + uint32_t userReadOnlyDataKeysCount; + +} PFGetPlayerCombinedInfoRequestParams; + +/// +/// PFUserAndroidDeviceInfo data model. +/// +typedef struct PFUserAndroidDeviceInfo +{ + /// + /// (Optional) Android device ID. + /// + _Maybenull_ _Null_terminated_ const char* androidDeviceId; + +} PFUserAndroidDeviceInfo; + +/// +/// PFUserAppleIdInfo data model. +/// +typedef struct PFUserAppleIdInfo +{ + /// + /// (Optional) Apple subject ID. + /// + _Maybenull_ _Null_terminated_ const char* appleSubjectId; + +} PFUserAppleIdInfo; + +/// +/// PFUserCustomIdInfo data model. +/// +typedef struct PFUserCustomIdInfo +{ + /// + /// (Optional) Custom ID. + /// + _Maybenull_ _Null_terminated_ const char* customId; + +} PFUserCustomIdInfo; + +/// +/// PFUserFacebookInfo data model. +/// +typedef struct PFUserFacebookInfo +{ + /// + /// (Optional) Facebook identifier. + /// + _Maybenull_ _Null_terminated_ const char* facebookId; + + /// + /// (Optional) Facebook full name. + /// + _Maybenull_ _Null_terminated_ const char* fullName; + +} PFUserFacebookInfo; + +/// +/// PFUserFacebookInstantGamesIdInfo data model. +/// +typedef struct PFUserFacebookInstantGamesIdInfo +{ + /// + /// (Optional) Facebook Instant Games ID. + /// + _Maybenull_ _Null_terminated_ const char* facebookInstantGamesId; + +} PFUserFacebookInstantGamesIdInfo; + +/// +/// PFUserGameCenterInfo data model. +/// +typedef struct PFUserGameCenterInfo +{ + /// + /// (Optional) Gamecenter identifier. + /// + _Maybenull_ _Null_terminated_ const char* gameCenterId; + +} PFUserGameCenterInfo; + +/// +/// PFUserGoogleInfo data model. +/// +typedef struct PFUserGoogleInfo +{ + /// + /// (Optional) Email address of the Google account. + /// + _Maybenull_ _Null_terminated_ const char* googleEmail; + + /// + /// (Optional) Gender information of the Google account. + /// + _Maybenull_ _Null_terminated_ const char* googleGender; + + /// + /// (Optional) Google ID. + /// + _Maybenull_ _Null_terminated_ const char* googleId; + + /// + /// (Optional) Locale of the Google account. + /// + _Maybenull_ _Null_terminated_ const char* googleLocale; + + /// + /// (Optional) Name of the Google account user. + /// + _Maybenull_ _Null_terminated_ const char* googleName; + +} PFUserGoogleInfo; + +/// +/// PFUserGooglePlayGamesInfo data model. +/// +typedef struct PFUserGooglePlayGamesInfo +{ + /// + /// (Optional) Avatar image url of the Google Play Games player. + /// + _Maybenull_ _Null_terminated_ const char* googlePlayGamesPlayerAvatarImageUrl; + + /// + /// (Optional) Display name of the Google Play Games player. + /// + _Maybenull_ _Null_terminated_ const char* googlePlayGamesPlayerDisplayName; + + /// + /// (Optional) Google Play Games player ID. + /// + _Maybenull_ _Null_terminated_ const char* googlePlayGamesPlayerId; + +} PFUserGooglePlayGamesInfo; + +/// +/// PFUserIosDeviceInfo data model. +/// +typedef struct PFUserIosDeviceInfo +{ + /// + /// (Optional) IOS device ID. + /// + _Maybenull_ _Null_terminated_ const char* iosDeviceId; + +} PFUserIosDeviceInfo; + +/// +/// PFUserKongregateInfo data model. +/// +typedef struct PFUserKongregateInfo +{ + /// + /// (Optional) Kongregate ID. + /// + _Maybenull_ _Null_terminated_ const char* kongregateId; + + /// + /// (Optional) Kongregate Username. + /// + _Maybenull_ _Null_terminated_ const char* kongregateName; + +} PFUserKongregateInfo; + +/// +/// PFUserNintendoSwitchAccountIdInfo data model. +/// +typedef struct PFUserNintendoSwitchAccountIdInfo +{ + /// + /// (Optional) Nintendo Switch account subject ID. + /// + _Maybenull_ _Null_terminated_ const char* nintendoSwitchAccountSubjectId; + +} PFUserNintendoSwitchAccountIdInfo; + +/// +/// PFUserNintendoSwitchDeviceIdInfo data model. +/// +typedef struct PFUserNintendoSwitchDeviceIdInfo +{ + /// + /// (Optional) Nintendo Switch Device ID. + /// + _Maybenull_ _Null_terminated_ const char* nintendoSwitchDeviceId; + +} PFUserNintendoSwitchDeviceIdInfo; + +/// +/// PFUserOpenIdInfo data model. +/// +typedef struct PFUserOpenIdInfo +{ + /// + /// (Optional) OpenID Connection ID. + /// + _Maybenull_ _Null_terminated_ const char* connectionId; + + /// + /// (Optional) OpenID Issuer. + /// + _Maybenull_ _Null_terminated_ const char* issuer; + + /// + /// (Optional) OpenID Subject. + /// + _Maybenull_ _Null_terminated_ const char* subject; + +} PFUserOpenIdInfo; + +/// +/// PFUserPrivateAccountInfo data model. +/// +typedef struct PFUserPrivateAccountInfo +{ + /// + /// (Optional) User email address. + /// + _Maybenull_ _Null_terminated_ const char* email; + +} PFUserPrivateAccountInfo; + +/// +/// PFUserPsnInfo data model. +/// +typedef struct PFUserPsnInfo +{ + /// + /// (Optional) PlayStation :tm: Network account ID. + /// + _Maybenull_ _Null_terminated_ const char* psnAccountId; + + /// + /// (Optional) PlayStation :tm: Network online ID. + /// + _Maybenull_ _Null_terminated_ const char* psnOnlineId; + +} PFUserPsnInfo; + +/// +/// PFUserSteamInfo data model. +/// +typedef struct PFUserSteamInfo +{ + /// + /// (Optional) What stage of game ownership the user is listed as being in, from Steam. + /// + _Maybenull_ PFTitleActivationStatus const* steamActivationStatus; + + /// + /// (Optional) The country in which the player resides, from Steam data. + /// + _Maybenull_ _Null_terminated_ const char* steamCountry; + + /// + /// (Optional) Currency type set in the user Steam account. + /// + _Maybenull_ PFCurrency const* steamCurrency; + + /// + /// (Optional) Steam identifier. + /// + _Maybenull_ _Null_terminated_ const char* steamId; + + /// + /// (Optional) Steam display name. + /// + _Maybenull_ _Null_terminated_ const char* steamName; + +} PFUserSteamInfo; + +#ifndef PF_ENTITY_KEY_DEFINED +#define PF_ENTITY_KEY_DEFINED +/// +/// PFEntityKey data model. Combined entity type and ID structure which uniquely identifies a single +/// entity. +/// +typedef struct PFEntityKey +{ + /// + /// Unique ID of the entity. + /// + _Null_terminated_ const char* id; + + /// + /// (Optional) Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types. + /// + _Maybenull_ _Null_terminated_ const char* type; + +} PFEntityKey; +#endif // PF_ENTITY_KEY_DEFINED + +/// +/// PFUserTitleInfo data model. +/// +typedef struct PFUserTitleInfo +{ + /// + /// (Optional) URL to the player's avatar. + /// + _Maybenull_ _Null_terminated_ const char* avatarUrl; + + /// + /// Timestamp indicating when the user was first associated with this game (this can differ significantly + /// from when the user first registered with PlayFab). + /// + time_t created; + + /// + /// (Optional) Name of the user, as it is displayed in-game. + /// + _Maybenull_ _Null_terminated_ const char* displayName; + + /// + /// (Optional) Timestamp indicating when the user first signed into this game (this can differ from + /// the Created timestamp, as other events, such as issuing a beta key to the user, can associate + /// the title to the user). + /// + _Maybenull_ time_t const* firstLogin; + + /// + /// (Optional) Boolean indicating whether or not the user is currently banned for a title. + /// + _Maybenull_ bool const* isBanned; + + /// + /// (Optional) Timestamp for the last user login for this title. + /// + _Maybenull_ time_t const* lastLogin; + + /// + /// (Optional) Source by which the user first joined the game, if known. + /// + _Maybenull_ PFUserOrigination const* origination; + + /// + /// (Optional) Title player account entity for this user. + /// + _Maybenull_ PFEntityKey const* titlePlayerAccount; + +} PFUserTitleInfo; + +/// +/// PFUserTwitchInfo data model. +/// +typedef struct PFUserTwitchInfo +{ + /// + /// (Optional) Twitch ID. + /// + _Maybenull_ _Null_terminated_ const char* twitchId; + + /// + /// (Optional) Twitch Username. + /// + _Maybenull_ _Null_terminated_ const char* twitchUserName; + +} PFUserTwitchInfo; + +/// +/// PFUserXboxInfo data model. +/// +typedef struct PFUserXboxInfo +{ + /// + /// (Optional) XBox user ID. + /// + _Maybenull_ _Null_terminated_ const char* xboxUserId; + + /// + /// (Optional) XBox user sandbox. + /// + _Maybenull_ _Null_terminated_ const char* xboxUserSandbox; + +} PFUserXboxInfo; + +/// +/// PFUserAccountInfo data model. +/// +typedef struct PFUserAccountInfo +{ + /// + /// (Optional) User Android device information, if an Android device has been linked. + /// + _Maybenull_ PFUserAndroidDeviceInfo const* androidDeviceInfo; + + /// + /// (Optional) Sign in with Apple account information, if an Apple account has been linked. + /// + _Maybenull_ PFUserAppleIdInfo const* appleAccountInfo; + + /// + /// Timestamp indicating when the user account was created. + /// + time_t created; + + /// + /// (Optional) Custom ID information, if a custom ID has been assigned. + /// + _Maybenull_ PFUserCustomIdInfo const* customIdInfo; + + /// + /// (Optional) User Facebook information, if a Facebook account has been linked. + /// + _Maybenull_ PFUserFacebookInfo const* facebookInfo; + + /// + /// (Optional) Facebook Instant Games account information, if a Facebook Instant Games account has + /// been linked. + /// + _Maybenull_ PFUserFacebookInstantGamesIdInfo const* facebookInstantGamesIdInfo; + + /// + /// (Optional) User Gamecenter information, if a Gamecenter account has been linked. + /// + _Maybenull_ PFUserGameCenterInfo const* gameCenterInfo; + + /// + /// (Optional) User Google account information, if a Google account has been linked. + /// + _Maybenull_ PFUserGoogleInfo const* googleInfo; + + /// + /// (Optional) User Google Play Games account information, if a Google Play Games account has been + /// linked. + /// + _Maybenull_ PFUserGooglePlayGamesInfo const* googlePlayGamesInfo; + + /// + /// (Optional) User iOS device information, if an iOS device has been linked. + /// + _Maybenull_ PFUserIosDeviceInfo const* iosDeviceInfo; + + /// + /// (Optional) User Kongregate account information, if a Kongregate account has been linked. + /// + _Maybenull_ PFUserKongregateInfo const* kongregateInfo; + + /// + /// (Optional) Nintendo Switch account information, if a Nintendo Switch account has been linked. + /// + _Maybenull_ PFUserNintendoSwitchAccountIdInfo const* nintendoSwitchAccountInfo; + + /// + /// (Optional) Nintendo Switch device information, if a Nintendo Switch device has been linked. + /// + _Maybenull_ PFUserNintendoSwitchDeviceIdInfo const* nintendoSwitchDeviceIdInfo; + + /// + /// (Optional) OpenID Connect information, if any OpenID Connect accounts have been linked. + /// + _Maybenull_ _Field_size_(openIdInfoCount) PFUserOpenIdInfo const* const* openIdInfo; + + /// + /// Count of openIdInfo + /// + uint32_t openIdInfoCount; + + /// + /// (Optional) Unique identifier for the user account. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Personal information for the user which is considered more sensitive. + /// + _Maybenull_ PFUserPrivateAccountInfo const* privateInfo; + + /// + /// (Optional) User PlayStation :tm: Network account information, if a PlayStation :tm: Network account + /// has been linked. + /// + _Maybenull_ PFUserPsnInfo const* psnInfo; + + /// + /// (Optional) User Steam information, if a Steam account has been linked. + /// + _Maybenull_ PFUserSteamInfo const* steamInfo; + + /// + /// (Optional) Title-specific information for the user account. + /// + _Maybenull_ PFUserTitleInfo const* titleInfo; + + /// + /// (Optional) User Twitch account information, if a Twitch account has been linked. + /// + _Maybenull_ PFUserTwitchInfo const* twitchInfo; + + /// + /// (Optional) User account name in the PlayFab service. + /// + _Maybenull_ _Null_terminated_ const char* username; + + /// + /// (Optional) User XBox account information, if a XBox account has been linked. + /// + _Maybenull_ PFUserXboxInfo const* xboxInfo; + +} PFUserAccountInfo; + +/// +/// PFItemInstance data model. A unique instance of an item in a user's inventory. Note, to retrieve +/// additional information for an item such as Tags, Description that are the same across all instances +/// of the item, a call to GetCatalogItems is required. The ItemID of can be matched to a catalog entry, +/// which contains the additional information. Also note that Custom Data is only set when the User's +/// specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other +/// fields such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. +/// +typedef struct PFItemInstance +{ + /// + /// (Optional) Game specific comment associated with this instance when it was added to the user + /// inventory. + /// + _Maybenull_ _Null_terminated_ const char* annotation; + + /// + /// (Optional) Array of unique items that were awarded when this catalog item was purchased. + /// + _Maybenull_ _Field_size_(bundleContentsCount) const char* const* bundleContents; + + /// + /// Count of bundleContents + /// + uint32_t bundleContentsCount; + + /// + /// (Optional) Unique identifier for the parent inventory item, as defined in the catalog, for object + /// which were added from a bundle or container. + /// + _Maybenull_ _Null_terminated_ const char* bundleParent; + + /// + /// (Optional) Catalog version for the inventory item, when this instance was created. + /// + _Maybenull_ _Null_terminated_ const char* catalogVersion; + + /// + /// (Optional) A set of custom key-value pairs on the instance of the inventory item, which is not + /// to be confused with the catalog item's custom data. + /// + _Maybenull_ _Field_size_(customDataCount) struct PFStringDictionaryEntry const* customData; + + /// + /// Count of customData + /// + uint32_t customDataCount; + + /// + /// (Optional) CatalogItem.DisplayName at the time this item was purchased. + /// + _Maybenull_ _Null_terminated_ const char* displayName; + + /// + /// (Optional) Timestamp for when this instance will expire. + /// + _Maybenull_ time_t const* expiration; + + /// + /// (Optional) Class name for the inventory item, as defined in the catalog. + /// + _Maybenull_ _Null_terminated_ const char* itemClass; + + /// + /// (Optional) Unique identifier for the inventory item, as defined in the catalog. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) Unique item identifier for this specific instance of the item. + /// + _Maybenull_ _Null_terminated_ const char* itemInstanceId; + + /// + /// (Optional) Timestamp for when this instance was purchased. + /// + _Maybenull_ time_t const* purchaseDate; + + /// + /// (Optional) Total number of remaining uses, if this is a consumable item. + /// + _Maybenull_ int32_t const* remainingUses; + + /// + /// (Optional) Currency type for the cost of the catalog item. Not available when granting items. + /// + _Maybenull_ _Null_terminated_ const char* unitCurrency; + + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + uint32_t unitPrice; + + /// + /// (Optional) The number of uses that were added or removed to this item in this call. + /// + _Maybenull_ int32_t const* usesIncrementedBy; + +} PFItemInstance; + +/// +/// PFCharacterInventory data model. +/// +typedef struct PFCharacterInventory +{ + /// + /// (Optional) The id of this character. + /// + _Maybenull_ _Null_terminated_ const char* characterId; + + /// + /// (Optional) The inventory of this character. + /// + _Maybenull_ _Field_size_(inventoryCount) PFItemInstance const* const* inventory; + + /// + /// Count of inventory + /// + uint32_t inventoryCount; + +} PFCharacterInventory; + +/// +/// PFCharacterResult data model. +/// +typedef struct PFCharacterResult +{ + /// + /// (Optional) The id for this character on this player. + /// + _Maybenull_ _Null_terminated_ const char* characterId; + + /// + /// (Optional) The name of this character. + /// + _Maybenull_ _Null_terminated_ const char* characterName; + + /// + /// (Optional) The type-string that was given to this character on creation. + /// + _Maybenull_ _Null_terminated_ const char* characterType; + +} PFCharacterResult; + +/// +/// PFAdCampaignAttributionModel data model. +/// +typedef struct PFAdCampaignAttributionModel +{ + /// + /// UTC time stamp of attribution. + /// + time_t attributedAt; + + /// + /// (Optional) Attribution campaign identifier. + /// + _Maybenull_ _Null_terminated_ const char* campaignId; + + /// + /// (Optional) Attribution network name. + /// + _Maybenull_ _Null_terminated_ const char* platform; + +} PFAdCampaignAttributionModel; + +/// +/// PFContactEmailInfoModel data model. +/// +typedef struct PFContactEmailInfoModel +{ + /// + /// (Optional) The email address. + /// + _Maybenull_ _Null_terminated_ const char* emailAddress; + + /// + /// (Optional) The name of the email info data. + /// + _Maybenull_ _Null_terminated_ const char* name; + + /// + /// (Optional) The verification status of the email. + /// + _Maybenull_ PFEmailVerificationStatus const* verificationStatus; + +} PFContactEmailInfoModel; + +/// +/// PFLinkedPlatformAccountModel data model. +/// +typedef struct PFLinkedPlatformAccountModel +{ + /// + /// (Optional) Linked account email of the user on the platform, if available. + /// + _Maybenull_ _Null_terminated_ const char* email; + + /// + /// (Optional) Authentication platform. + /// + _Maybenull_ PFLoginIdentityProvider const* platform; + + /// + /// (Optional) Unique account identifier of the user on the platform. + /// + _Maybenull_ _Null_terminated_ const char* platformUserId; + + /// + /// (Optional) Linked account username of the user on the platform, if available. + /// + _Maybenull_ _Null_terminated_ const char* username; + +} PFLinkedPlatformAccountModel; + +/// +/// PFLocationModel data model. +/// +typedef struct PFLocationModel +{ + /// + /// (Optional) City name. + /// + _Maybenull_ _Null_terminated_ const char* city; + + /// + /// (Optional) The two-character continent code for this location. + /// + _Maybenull_ PFContinentCode const* continentCode; + + /// + /// (Optional) The two-character ISO 3166-1 country code for the country associated with the location. + /// + _Maybenull_ PFCountryCode const* countryCode; + + /// + /// (Optional) Latitude coordinate of the geographic location. + /// + _Maybenull_ double const* latitude; + + /// + /// (Optional) Longitude coordinate of the geographic location. + /// + _Maybenull_ double const* longitude; + +} PFLocationModel; + +/// +/// PFSubscriptionModel data model. +/// +typedef struct PFSubscriptionModel +{ + /// + /// When this subscription expires. + /// + time_t expiration; + + /// + /// The time the subscription was orignially purchased. + /// + time_t initialSubscriptionTime; + + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + bool isActive; + + /// + /// (Optional) The status of this subscription, according to the subscription provider. + /// + _Maybenull_ PFSubscriptionProviderStatus const* status; + + /// + /// (Optional) The id for this subscription. + /// + _Maybenull_ _Null_terminated_ const char* subscriptionId; + + /// + /// (Optional) The item id for this subscription from the primary catalog. + /// + _Maybenull_ _Null_terminated_ const char* subscriptionItemId; + + /// + /// (Optional) The provider for this subscription. Apple or Google Play are supported today. + /// + _Maybenull_ _Null_terminated_ const char* subscriptionProvider; + +} PFSubscriptionModel; + +/// +/// PFMembershipModel data model. +/// +typedef struct PFMembershipModel +{ + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + bool isActive; + + /// + /// The time this membership expires. + /// + time_t membershipExpiration; + + /// + /// (Optional) The id of the membership. + /// + _Maybenull_ _Null_terminated_ const char* membershipId; + + /// + /// (Optional) Membership expirations can be explicitly overridden (via game manager or the admin + /// api). If this membership has been overridden, this will be the new expiration time. + /// + _Maybenull_ time_t const* overrideExpiration; + + /// + /// (Optional) The list of subscriptions that this player has for this membership. + /// + _Maybenull_ _Field_size_(subscriptionsCount) PFSubscriptionModel const* const* subscriptions; + + /// + /// Count of subscriptions + /// + uint32_t subscriptionsCount; + +} PFMembershipModel; + +/// +/// PFPushNotificationRegistrationModel data model. +/// +typedef struct PFPushNotificationRegistrationModel +{ + /// + /// (Optional) Notification configured endpoint. + /// + _Maybenull_ _Null_terminated_ const char* notificationEndpointARN; + + /// + /// (Optional) Push notification platform. + /// + _Maybenull_ PFPushNotificationPlatform const* platform; + +} PFPushNotificationRegistrationModel; + +/// +/// PFStatisticModel data model. +/// +typedef struct PFStatisticModel +{ + /// + /// (Optional) Statistic name. + /// + _Maybenull_ _Null_terminated_ const char* name; + + /// + /// Statistic value. + /// + int32_t value; + + /// + /// Statistic version (0 if not a versioned statistic). + /// + int32_t version; + +} PFStatisticModel; + +/// +/// PFTagModel data model. +/// +typedef struct PFTagModel +{ + /// + /// (Optional) Full value of the tag, including namespace. + /// + _Maybenull_ _Null_terminated_ const char* tagValue; + +} PFTagModel; + +/// +/// PFValueToDateModel data model. +/// +typedef struct PFValueToDateModel +{ + /// + /// (Optional) ISO 4217 code of the currency used in the purchases. + /// + _Maybenull_ _Null_terminated_ const char* currency; + + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates + /// nine dollars and ninety-nine cents when Currency is 'USD'). + /// + uint32_t totalValue; + + /// + /// (Optional) Total value of the purchases in a string representation of decimal monetary units. + /// For example, '9.99' indicates nine dollars and ninety-nine cents when Currency is 'USD'. + /// + _Maybenull_ _Null_terminated_ const char* totalValueAsDecimal; + +} PFValueToDateModel; + +/// +/// PFPlayerProfileModel data model. +/// +typedef struct PFPlayerProfileModel +{ + /// + /// (Optional) List of advertising campaigns the player has been attributed to. + /// + _Maybenull_ _Field_size_(adCampaignAttributionsCount) PFAdCampaignAttributionModel const* const* adCampaignAttributions; + + /// + /// Count of adCampaignAttributions + /// + uint32_t adCampaignAttributionsCount; + + /// + /// (Optional) URL of the player's avatar image. + /// + _Maybenull_ _Null_terminated_ const char* avatarUrl; + + /// + /// (Optional) If the player is currently banned, the UTC Date when the ban expires. + /// + _Maybenull_ time_t const* bannedUntil; + + /// + /// (Optional) List of all contact email info associated with the player account. + /// + _Maybenull_ _Field_size_(contactEmailAddressesCount) PFContactEmailInfoModel const* const* contactEmailAddresses; + + /// + /// Count of contactEmailAddresses + /// + uint32_t contactEmailAddressesCount; + + /// + /// (Optional) Player record created. + /// + _Maybenull_ time_t const* created; + + /// + /// (Optional) Player display name. + /// + _Maybenull_ _Null_terminated_ const char* displayName; + + /// + /// (Optional) List of experiment variants for the player. Note that these variants are not guaranteed + /// to be up-to-date when returned during login because the player profile is updated only after login. + /// Instead, use the LoginResult.TreatmentAssignment property during login to get the correct variants + /// and variables. + /// + _Maybenull_ _Field_size_(experimentVariantsCount) const char* const* experimentVariants; + + /// + /// Count of experimentVariants + /// + uint32_t experimentVariantsCount; + + /// + /// (Optional) UTC time when the player most recently logged in to the title. + /// + _Maybenull_ time_t const* lastLogin; + + /// + /// (Optional) List of all authentication systems linked to this player account. + /// + _Maybenull_ _Field_size_(linkedAccountsCount) PFLinkedPlatformAccountModel const* const* linkedAccounts; + + /// + /// Count of linkedAccounts + /// + uint32_t linkedAccountsCount; + + /// + /// (Optional) List of geographic locations from which the player has logged in to the title. + /// + _Maybenull_ _Field_size_(locationsCount) PFLocationModel const* const* locations; + + /// + /// Count of locations + /// + uint32_t locationsCount; + + /// + /// (Optional) List of memberships for the player, along with whether are expired. + /// + _Maybenull_ _Field_size_(membershipsCount) PFMembershipModel const* const* memberships; + + /// + /// Count of memberships + /// + uint32_t membershipsCount; + + /// + /// (Optional) Player account origination. + /// + _Maybenull_ PFLoginIdentityProvider const* origination; + + /// + /// (Optional) PlayFab player account unique identifier. + /// + _Maybenull_ _Null_terminated_ const char* playerId; + + /// + /// (Optional) Publisher this player belongs to. + /// + _Maybenull_ _Null_terminated_ const char* publisherId; + + /// + /// (Optional) List of configured end points registered for sending the player push notifications. + /// + _Maybenull_ _Field_size_(pushNotificationRegistrationsCount) PFPushNotificationRegistrationModel const* const* pushNotificationRegistrations; + + /// + /// Count of pushNotificationRegistrations + /// + uint32_t pushNotificationRegistrationsCount; + + /// + /// (Optional) List of leaderboard statistic values for the player. + /// + _Maybenull_ _Field_size_(statisticsCount) PFStatisticModel const* const* statistics; + + /// + /// Count of statistics + /// + uint32_t statisticsCount; + + /// + /// (Optional) List of player's tags for segmentation. + /// + _Maybenull_ _Field_size_(tagsCount) PFTagModel const* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + + /// + /// (Optional) Title ID this player profile applies to. + /// + _Maybenull_ _Null_terminated_ const char* titleId; + + /// + /// (Optional) Sum of the player's purchases made with real-money currencies, converted to US dollars + /// equivalent and represented as a whole number of cents (1/100 USD). For example, 999 indicates + /// nine dollars and ninety-nine cents. + /// + _Maybenull_ uint32_t const* totalValueToDateInUSD; + + /// + /// (Optional) List of the player's lifetime purchase totals, summed by real-money currency. + /// + _Maybenull_ _Field_size_(valuesToDateCount) PFValueToDateModel const* const* valuesToDate; + + /// + /// Count of valuesToDate + /// + uint32_t valuesToDateCount; + +} PFPlayerProfileModel; + +/// +/// PFStatisticValue data model. +/// +typedef struct PFStatisticValue +{ + /// + /// (Optional) Unique name of the statistic. + /// + _Maybenull_ _Null_terminated_ const char* statisticName; + + /// + /// Statistic value for the player. + /// + int32_t value; + + /// + /// For updates to an existing statistic value for a player, the version of the statistic when it + /// was loaded. + /// + uint32_t version; + +} PFStatisticValue; + +/// +/// PFUserDataRecord data model. +/// +typedef struct PFUserDataRecord +{ + /// + /// Timestamp for when this data was last updated. + /// + time_t lastUpdated; + + /// + /// (Optional) Indicates whether this data can be read by all users (public) or only the user (private). + /// This is used for GetUserData requests being made by one player about another player. + /// + _Maybenull_ PFUserDataPermission const* permission; + + /// + /// (Optional) Data stored for the specified user data key. + /// + _Maybenull_ _Null_terminated_ const char* value; + +} PFUserDataRecord; + +/// +/// PFVirtualCurrencyRechargeTime data model. +/// +typedef struct PFVirtualCurrencyRechargeTime +{ + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can + /// exceed this value through use of the AddUserVirtualCurrency API call. However, it will not regenerate + /// automatically until it has fallen below this value. + /// + int32_t rechargeMax; + + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + time_t rechargeTime; + + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + int32_t secondsToRecharge; + +} PFVirtualCurrencyRechargeTime; + +/// +/// PFGetPlayerCombinedInfoResultPayload data model. +/// +typedef struct PFGetPlayerCombinedInfoResultPayload +{ + /// + /// (Optional) Account information for the user. This is always retrieved. + /// + _Maybenull_ PFUserAccountInfo const* accountInfo; + + /// + /// (Optional) Inventories for each character for the user. + /// + _Maybenull_ _Field_size_(characterInventoriesCount) PFCharacterInventory const* const* characterInventories; + + /// + /// Count of characterInventories + /// + uint32_t characterInventoriesCount; + + /// + /// (Optional) List of characters for the user. + /// + _Maybenull_ _Field_size_(characterListCount) PFCharacterResult const* const* characterList; + + /// + /// Count of characterList + /// + uint32_t characterListCount; + + /// + /// (Optional) The profile of the players. This profile is not guaranteed to be up-to-date. For a + /// new player, this profile will not exist. + /// + _Maybenull_ PFPlayerProfileModel const* playerProfile; + + /// + /// (Optional) List of statistics for this player. + /// + _Maybenull_ _Field_size_(playerStatisticsCount) PFStatisticValue const* const* playerStatistics; + + /// + /// Count of playerStatistics + /// + uint32_t playerStatisticsCount; + + /// + /// (Optional) Title data for this title. + /// + _Maybenull_ _Field_size_(titleDataCount) struct PFStringDictionaryEntry const* titleData; + + /// + /// Count of titleData + /// + uint32_t titleDataCount; + + /// + /// (Optional) User specific custom data. + /// + _Maybenull_ _Field_size_(userDataCount) struct PFUserDataRecordDictionaryEntry const* userData; + + /// + /// Count of userData + /// + uint32_t userDataCount; + + /// + /// The version of the UserData that was returned. + /// + uint32_t userDataVersion; + + /// + /// (Optional) Array of inventory items in the user's current inventory. + /// + _Maybenull_ _Field_size_(userInventoryCount) PFItemInstance const* const* userInventory; + + /// + /// Count of userInventory + /// + uint32_t userInventoryCount; + + /// + /// (Optional) User specific read-only data. + /// + _Maybenull_ _Field_size_(userReadOnlyDataCount) struct PFUserDataRecordDictionaryEntry const* userReadOnlyData; + + /// + /// Count of userReadOnlyData + /// + uint32_t userReadOnlyDataCount; + + /// + /// The version of the Read-Only UserData that was returned. + /// + uint32_t userReadOnlyDataVersion; + + /// + /// (Optional) Dictionary of virtual currency balance(s) belonging to the user. + /// + _Maybenull_ _Field_size_(userVirtualCurrencyCount) struct PFInt32DictionaryEntry const* userVirtualCurrency; + + /// + /// Count of userVirtualCurrency + /// + uint32_t userVirtualCurrencyCount; + + /// + /// (Optional) Dictionary of remaining times and timestamps for virtual currencies. + /// + _Maybenull_ _Field_size_(userVirtualCurrencyRechargeTimesCount) struct PFVirtualCurrencyRechargeTimeDictionaryEntry const* userVirtualCurrencyRechargeTimes; + + /// + /// Count of userVirtualCurrencyRechargeTimes + /// + uint32_t userVirtualCurrencyRechargeTimesCount; + +} PFGetPlayerCombinedInfoResultPayload; + +/// +/// PFVariable data model. +/// +typedef struct PFVariable +{ + /// + /// Name of the variable. + /// + _Null_terminated_ const char* name; + + /// + /// (Optional) Value of the variable. + /// + _Maybenull_ _Null_terminated_ const char* value; + +} PFVariable; + +/// +/// PFTreatmentAssignment data model. +/// +typedef struct PFTreatmentAssignment +{ + /// + /// (Optional) List of the experiment variables. + /// + _Maybenull_ _Field_size_(variablesCount) PFVariable const* const* variables; + + /// + /// Count of variables + /// + uint32_t variablesCount; + + /// + /// (Optional) List of the experiment variants. + /// + _Maybenull_ _Field_size_(variantsCount) const char* const* variants; + + /// + /// Count of variants + /// + uint32_t variantsCount; + +} PFTreatmentAssignment; + +/// +/// PFEntityLineage data model. +/// +typedef struct PFEntityLineage +{ + /// + /// (Optional) The Character Id of the associated entity. + /// + _Maybenull_ _Null_terminated_ const char* characterId; + + /// + /// (Optional) The Group Id of the associated entity. + /// + _Maybenull_ _Null_terminated_ const char* groupId; + + /// + /// (Optional) The Master Player Account Id of the associated entity. + /// + _Maybenull_ _Null_terminated_ const char* masterPlayerAccountId; + + /// + /// (Optional) The Namespace Id of the associated entity. + /// + _Maybenull_ _Null_terminated_ const char* namespaceId; + + /// + /// (Optional) The Title Id of the associated entity. + /// + _Maybenull_ _Null_terminated_ const char* titleId; + + /// + /// (Optional) The Title Player Account Id of the associated entity. + /// + _Maybenull_ _Null_terminated_ const char* titlePlayerAccountId; + +} PFEntityLineage; + +/// +/// Dictionary entry for an associative array with string values. +/// +typedef struct PFStringDictionaryEntry +{ + _Null_terminated_ const char* key; + _Null_terminated_ const char* value; +} PFStringDictionaryEntry; + +/// +/// Dictionary entry for an associative array with int32_t values. +/// +typedef struct PFInt32DictionaryEntry +{ + _Null_terminated_ const char* key; + int32_t value; +} PFInt32DictionaryEntry; + +/// +/// Dictionary entry for an associative array with uint32_t values. +/// +typedef struct PFUint32DictionaryEntry +{ + _Null_terminated_ const char* key; + uint32_t value; +} PFUint32DictionaryEntry; + +/// +/// Dictionary entry for an associative array with time_t values. +/// +typedef struct PFDateTimeDictionaryEntry +{ + _Null_terminated_ const char* key; + time_t value; +} PFDateTimeDictionaryEntry; + +/// +/// Dictionary entry for an associative array with PFUserDataRecord values. +/// +typedef struct PFUserDataRecordDictionaryEntry +{ + _Null_terminated_ const char* key; + PFUserDataRecord const* value; +} PFUserDataRecordDictionaryEntry; + +/// +/// Dictionary entry for an associative array with PFVirtualCurrencyRechargeTime values. +/// +typedef struct PFVirtualCurrencyRechargeTimeDictionaryEntry +{ + _Null_terminated_ const char* key; + PFVirtualCurrencyRechargeTime const* value; +} PFVirtualCurrencyRechargeTimeDictionaryEntry; + +/// +/// Dictionary entry for an associative array with PFEntityKey values. +/// +typedef struct PFEntityKeyDictionaryEntry +{ + _Null_terminated_ const char* key; + PFEntityKey const* value; +} PFEntityKeyDictionaryEntry; + +/// +/// Dictionary entry for an associative array with PFEntityLineage values. +/// +typedef struct PFEntityLineageDictionaryEntry +{ + _Null_terminated_ const char* key; + PFEntityLineage const* value; +} PFEntityLineageDictionaryEntry; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/cpp/AuthenticationTypeWrappers.h b/Source/PlayFabCore/Include/Generated/playfab/core/cpp/AuthenticationTypeWrappers.h new file mode 100644 index 0000000..77211b1 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/cpp/AuthenticationTypeWrappers.h @@ -0,0 +1,3708 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationGetPhotonAuthenticationTokenRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper() = default; + + PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper(const PFAuthenticationGetPhotonAuthenticationTokenRequest& model) : + ModelWrapper{ model }, + m_photonApplicationId{ SafeString(model.photonApplicationId) } + { + SetModelPointers(); + } + + PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper(const PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper& src) : + PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper{ src.Model() } + { + } + + PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper(PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper&& src) : + PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper& operator=(PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper() = default; + + friend void swap(PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper& lhs, PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_photonApplicationId, rhs.m_photonApplicationId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPhotonApplicationId(String value) + { + m_photonApplicationId = std::move(value); + this->m_model.photonApplicationId = m_photonApplicationId.empty() ? nullptr : m_photonApplicationId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.photonApplicationId = m_photonApplicationId.empty() ? nullptr : m_photonApplicationId.data(); + } + + String m_photonApplicationId; +}; + +template class Alloc = std::allocator> +class PFAuthenticationGetPhotonAuthenticationTokenResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationGetPhotonAuthenticationTokenResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationGetPhotonAuthenticationTokenResultWrapper() = default; + + PFAuthenticationGetPhotonAuthenticationTokenResultWrapper(const PFAuthenticationGetPhotonAuthenticationTokenResult& model) : + ModelWrapper{ model }, + m_photonCustomAuthenticationToken{ SafeString(model.photonCustomAuthenticationToken) } + { + SetModelPointers(); + } + + PFAuthenticationGetPhotonAuthenticationTokenResultWrapper(const PFAuthenticationGetPhotonAuthenticationTokenResultWrapper& src) : + PFAuthenticationGetPhotonAuthenticationTokenResultWrapper{ src.Model() } + { + } + + PFAuthenticationGetPhotonAuthenticationTokenResultWrapper(PFAuthenticationGetPhotonAuthenticationTokenResultWrapper&& src) : + PFAuthenticationGetPhotonAuthenticationTokenResultWrapper{} + { + swap(*this, src); + } + + PFAuthenticationGetPhotonAuthenticationTokenResultWrapper& operator=(PFAuthenticationGetPhotonAuthenticationTokenResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationGetPhotonAuthenticationTokenResultWrapper() = default; + + friend void swap(PFAuthenticationGetPhotonAuthenticationTokenResultWrapper& lhs, PFAuthenticationGetPhotonAuthenticationTokenResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_photonCustomAuthenticationToken, rhs.m_photonCustomAuthenticationToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPhotonCustomAuthenticationToken(String value) + { + m_photonCustomAuthenticationToken = std::move(value); + this->m_model.photonCustomAuthenticationToken = m_photonCustomAuthenticationToken.empty() ? nullptr : m_photonCustomAuthenticationToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.photonCustomAuthenticationToken = m_photonCustomAuthenticationToken.empty() ? nullptr : m_photonCustomAuthenticationToken.data(); + } + + String m_photonCustomAuthenticationToken; +}; + +template class Alloc = std::allocator> +class PFAuthenticationGetTitlePublicKeyRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationGetTitlePublicKeyRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationGetTitlePublicKeyRequestWrapper() = default; + + PFAuthenticationGetTitlePublicKeyRequestWrapper(const PFAuthenticationGetTitlePublicKeyRequest& model) : + ModelWrapper{ model }, + m_titleId{ SafeString(model.titleId) }, + m_titleSharedSecret{ SafeString(model.titleSharedSecret) } + { + SetModelPointers(); + } + + PFAuthenticationGetTitlePublicKeyRequestWrapper(const PFAuthenticationGetTitlePublicKeyRequestWrapper& src) : + PFAuthenticationGetTitlePublicKeyRequestWrapper{ src.Model() } + { + } + + PFAuthenticationGetTitlePublicKeyRequestWrapper(PFAuthenticationGetTitlePublicKeyRequestWrapper&& src) : + PFAuthenticationGetTitlePublicKeyRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationGetTitlePublicKeyRequestWrapper& operator=(PFAuthenticationGetTitlePublicKeyRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationGetTitlePublicKeyRequestWrapper() = default; + + friend void swap(PFAuthenticationGetTitlePublicKeyRequestWrapper& lhs, PFAuthenticationGetTitlePublicKeyRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_titleId, rhs.m_titleId); + swap(lhs.m_titleSharedSecret, rhs.m_titleSharedSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + void SetTitleSharedSecret(String value) + { + m_titleSharedSecret = std::move(value); + this->m_model.titleSharedSecret = m_titleSharedSecret.empty() ? nullptr : m_titleSharedSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + this->m_model.titleSharedSecret = m_titleSharedSecret.empty() ? nullptr : m_titleSharedSecret.data(); + } + + String m_titleId; + String m_titleSharedSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationGetTitlePublicKeyResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationGetTitlePublicKeyResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationGetTitlePublicKeyResultWrapper() = default; + + PFAuthenticationGetTitlePublicKeyResultWrapper(const PFAuthenticationGetTitlePublicKeyResult& model) : + ModelWrapper{ model }, + m_RSAPublicKey{ SafeString(model.RSAPublicKey) } + { + SetModelPointers(); + } + + PFAuthenticationGetTitlePublicKeyResultWrapper(const PFAuthenticationGetTitlePublicKeyResultWrapper& src) : + PFAuthenticationGetTitlePublicKeyResultWrapper{ src.Model() } + { + } + + PFAuthenticationGetTitlePublicKeyResultWrapper(PFAuthenticationGetTitlePublicKeyResultWrapper&& src) : + PFAuthenticationGetTitlePublicKeyResultWrapper{} + { + swap(*this, src); + } + + PFAuthenticationGetTitlePublicKeyResultWrapper& operator=(PFAuthenticationGetTitlePublicKeyResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationGetTitlePublicKeyResultWrapper() = default; + + friend void swap(PFAuthenticationGetTitlePublicKeyResultWrapper& lhs, PFAuthenticationGetTitlePublicKeyResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_RSAPublicKey, rhs.m_RSAPublicKey); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetRSAPublicKey(String value) + { + m_RSAPublicKey = std::move(value); + this->m_model.RSAPublicKey = m_RSAPublicKey.empty() ? nullptr : m_RSAPublicKey.data(); + } + +private: + void SetModelPointers() + { + this->m_model.RSAPublicKey = m_RSAPublicKey.empty() ? nullptr : m_RSAPublicKey.data(); + } + + String m_RSAPublicKey; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithAndroidDeviceIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper() = default; + + PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper(const PFAuthenticationLoginWithAndroidDeviceIDRequest& model) : + ModelWrapper{ model }, + m_androidDevice{ SafeString(model.androidDevice) }, + m_androidDeviceId{ SafeString(model.androidDeviceId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_OS{ SafeString(model.OS) }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper(const PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper& src) : + PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper(PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper&& src) : + PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper& operator=(PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper& lhs, PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_androidDevice, rhs.m_androidDevice); + swap(lhs.m_androidDeviceId, rhs.m_androidDeviceId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_OS, rhs.m_OS); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAndroidDevice(String value) + { + m_androidDevice = std::move(value); + this->m_model.androidDevice = m_androidDevice.empty() ? nullptr : m_androidDevice.data(); + } + + void SetAndroidDeviceId(String value) + { + m_androidDeviceId = std::move(value); + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetOS(String value) + { + m_OS = std::move(value); + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.androidDevice = m_androidDevice.empty() ? nullptr : m_androidDevice.data(); + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + String m_androidDevice; + String m_androidDeviceId; + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_OS; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationUserSettingsWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationUserSettings; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetGatherDeviceInfo(bool value) + { + this->m_model.gatherDeviceInfo = value; + } + + void SetGatherFocusInfo(bool value) + { + this->m_model.gatherFocusInfo = value; + } + + void SetNeedsAttribution(bool value) + { + this->m_model.needsAttribution = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginResultWrapper() = default; + + PFAuthenticationLoginResultWrapper(const PFAuthenticationLoginResult& model) : + ModelWrapper{ model }, + m_infoResultPayload{ model.infoResultPayload ? std::optional>{ *model.infoResultPayload } : std::nullopt }, + m_lastLoginTime{ model.lastLoginTime ? std::optional{ *model.lastLoginTime } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) }, + m_settingsForUser{ model.settingsForUser ? std::optional>{ *model.settingsForUser } : std::nullopt }, + m_treatmentAssignment{ model.treatmentAssignment ? std::optional>{ *model.treatmentAssignment } : std::nullopt } + { + SetModelPointers(); + } + + PFAuthenticationLoginResultWrapper(const PFAuthenticationLoginResultWrapper& src) : + PFAuthenticationLoginResultWrapper{ src.Model() } + { + } + + PFAuthenticationLoginResultWrapper(PFAuthenticationLoginResultWrapper&& src) : + PFAuthenticationLoginResultWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginResultWrapper& operator=(PFAuthenticationLoginResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginResultWrapper() = default; + + friend void swap(PFAuthenticationLoginResultWrapper& lhs, PFAuthenticationLoginResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_infoResultPayload, rhs.m_infoResultPayload); + swap(lhs.m_lastLoginTime, rhs.m_lastLoginTime); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_settingsForUser, rhs.m_settingsForUser); + swap(lhs.m_treatmentAssignment, rhs.m_treatmentAssignment); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetInfoResultPayload(std::optional> value) + { + m_infoResultPayload = std::move(value); + this->m_model.infoResultPayload = m_infoResultPayload ? &m_infoResultPayload->Model() : nullptr; + } + + void SetLastLoginTime(std::optional value) + { + m_lastLoginTime = std::move(value); + this->m_model.lastLoginTime = m_lastLoginTime ? m_lastLoginTime.operator->() : nullptr; + } + + void SetNewlyCreated(bool value) + { + this->m_model.newlyCreated = value; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetSettingsForUser(std::optional> value) + { + m_settingsForUser = std::move(value); + this->m_model.settingsForUser = m_settingsForUser ? &m_settingsForUser->Model() : nullptr; + } + + void SetTreatmentAssignment(std::optional> value) + { + m_treatmentAssignment = std::move(value); + this->m_model.treatmentAssignment = m_treatmentAssignment ? &m_treatmentAssignment->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.infoResultPayload = m_infoResultPayload ? &m_infoResultPayload->Model() : nullptr; + this->m_model.lastLoginTime = m_lastLoginTime ? m_lastLoginTime.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.settingsForUser = m_settingsForUser ? &m_settingsForUser->Model() : nullptr; + this->m_model.treatmentAssignment = m_treatmentAssignment ? &m_treatmentAssignment->Model() : nullptr; + } + + std::optional> m_infoResultPayload; + std::optional m_lastLoginTime; + String m_playFabId; + std::optional> m_settingsForUser; + std::optional> m_treatmentAssignment; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithAppleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithAppleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithAppleRequestWrapper() = default; + + PFAuthenticationLoginWithAppleRequestWrapper(const PFAuthenticationLoginWithAppleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_identityToken{ SafeString(model.identityToken) }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithAppleRequestWrapper(const PFAuthenticationLoginWithAppleRequestWrapper& src) : + PFAuthenticationLoginWithAppleRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithAppleRequestWrapper(PFAuthenticationLoginWithAppleRequestWrapper&& src) : + PFAuthenticationLoginWithAppleRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithAppleRequestWrapper& operator=(PFAuthenticationLoginWithAppleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithAppleRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithAppleRequestWrapper& lhs, PFAuthenticationLoginWithAppleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_identityToken, rhs.m_identityToken); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetIdentityToken(String value) + { + m_identityToken = std::move(value); + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_identityToken; + std::optional> m_infoRequestParameters; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithCustomIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithCustomIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithCustomIDRequestWrapper() = default; + + PFAuthenticationLoginWithCustomIDRequestWrapper(const PFAuthenticationLoginWithCustomIDRequest& model) : + ModelWrapper{ model }, + m_customId{ SafeString(model.customId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithCustomIDRequestWrapper(const PFAuthenticationLoginWithCustomIDRequestWrapper& src) : + PFAuthenticationLoginWithCustomIDRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithCustomIDRequestWrapper(PFAuthenticationLoginWithCustomIDRequestWrapper&& src) : + PFAuthenticationLoginWithCustomIDRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithCustomIDRequestWrapper& operator=(PFAuthenticationLoginWithCustomIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithCustomIDRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithCustomIDRequestWrapper& lhs, PFAuthenticationLoginWithCustomIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customId, rhs.m_customId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomId(String value) + { + m_customId = std::move(value); + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + String m_customId; + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithEmailAddressRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithEmailAddressRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithEmailAddressRequestWrapper() = default; + + PFAuthenticationLoginWithEmailAddressRequestWrapper(const PFAuthenticationLoginWithEmailAddressRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_email{ SafeString(model.email) }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_password{ SafeString(model.password) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithEmailAddressRequestWrapper(const PFAuthenticationLoginWithEmailAddressRequestWrapper& src) : + PFAuthenticationLoginWithEmailAddressRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithEmailAddressRequestWrapper(PFAuthenticationLoginWithEmailAddressRequestWrapper&& src) : + PFAuthenticationLoginWithEmailAddressRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithEmailAddressRequestWrapper& operator=(PFAuthenticationLoginWithEmailAddressRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithEmailAddressRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithEmailAddressRequestWrapper& lhs, PFAuthenticationLoginWithEmailAddressRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_password, rhs.m_password); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPassword(String value) + { + m_password = std::move(value); + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_email; + std::optional> m_infoRequestParameters; + String m_password; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithFacebookRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithFacebookRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithFacebookRequestWrapper() = default; + + PFAuthenticationLoginWithFacebookRequestWrapper(const PFAuthenticationLoginWithFacebookRequest& model) : + ModelWrapper{ model }, + m_accessToken{ SafeString(model.accessToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithFacebookRequestWrapper(const PFAuthenticationLoginWithFacebookRequestWrapper& src) : + PFAuthenticationLoginWithFacebookRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithFacebookRequestWrapper(PFAuthenticationLoginWithFacebookRequestWrapper&& src) : + PFAuthenticationLoginWithFacebookRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithFacebookRequestWrapper& operator=(PFAuthenticationLoginWithFacebookRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithFacebookRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithFacebookRequestWrapper& lhs, PFAuthenticationLoginWithFacebookRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_accessToken, rhs.m_accessToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAccessToken(String value) + { + m_accessToken = std::move(value); + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + String m_accessToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithFacebookInstantGamesIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper() = default; + + PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper(const PFAuthenticationLoginWithFacebookInstantGamesIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_facebookInstantGamesSignature{ SafeString(model.facebookInstantGamesSignature) }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper(const PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper& src) : + PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper(PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper&& src) : + PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper& operator=(PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper& lhs, PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_facebookInstantGamesSignature, rhs.m_facebookInstantGamesSignature); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetFacebookInstantGamesSignature(String value) + { + m_facebookInstantGamesSignature = std::move(value); + this->m_model.facebookInstantGamesSignature = m_facebookInstantGamesSignature.empty() ? nullptr : m_facebookInstantGamesSignature.data(); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.facebookInstantGamesSignature = m_facebookInstantGamesSignature.empty() ? nullptr : m_facebookInstantGamesSignature.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_facebookInstantGamesSignature; + std::optional> m_infoRequestParameters; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithGameCenterRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithGameCenterRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithGameCenterRequestWrapper() = default; + + PFAuthenticationLoginWithGameCenterRequestWrapper(const PFAuthenticationLoginWithGameCenterRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerId{ SafeString(model.playerId) }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_publicKeyUrl{ SafeString(model.publicKeyUrl) }, + m_salt{ SafeString(model.salt) }, + m_signature{ SafeString(model.signature) }, + m_timestamp{ SafeString(model.timestamp) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithGameCenterRequestWrapper(const PFAuthenticationLoginWithGameCenterRequestWrapper& src) : + PFAuthenticationLoginWithGameCenterRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithGameCenterRequestWrapper(PFAuthenticationLoginWithGameCenterRequestWrapper&& src) : + PFAuthenticationLoginWithGameCenterRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithGameCenterRequestWrapper& operator=(PFAuthenticationLoginWithGameCenterRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithGameCenterRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithGameCenterRequestWrapper& lhs, PFAuthenticationLoginWithGameCenterRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerId, rhs.m_playerId); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_publicKeyUrl, rhs.m_publicKeyUrl); + swap(lhs.m_salt, rhs.m_salt); + swap(lhs.m_signature, rhs.m_signature); + swap(lhs.m_timestamp, rhs.m_timestamp); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerId(String value) + { + m_playerId = std::move(value); + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetPublicKeyUrl(String value) + { + m_publicKeyUrl = std::move(value); + this->m_model.publicKeyUrl = m_publicKeyUrl.empty() ? nullptr : m_publicKeyUrl.data(); + } + + void SetSalt(String value) + { + m_salt = std::move(value); + this->m_model.salt = m_salt.empty() ? nullptr : m_salt.data(); + } + + void SetSignature(String value) + { + m_signature = std::move(value); + this->m_model.signature = m_signature.empty() ? nullptr : m_signature.data(); + } + + void SetTimestamp(String value) + { + m_timestamp = std::move(value); + this->m_model.timestamp = m_timestamp.empty() ? nullptr : m_timestamp.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.publicKeyUrl = m_publicKeyUrl.empty() ? nullptr : m_publicKeyUrl.data(); + this->m_model.salt = m_salt.empty() ? nullptr : m_salt.data(); + this->m_model.signature = m_signature.empty() ? nullptr : m_signature.data(); + this->m_model.timestamp = m_timestamp.empty() ? nullptr : m_timestamp.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerId; + String m_playerSecret; + String m_publicKeyUrl; + String m_salt; + String m_signature; + String m_timestamp; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithGoogleAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithGoogleAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithGoogleAccountRequestWrapper() = default; + + PFAuthenticationLoginWithGoogleAccountRequestWrapper(const PFAuthenticationLoginWithGoogleAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_serverAuthCode{ SafeString(model.serverAuthCode) }, + m_setEmail{ model.setEmail ? std::optional{ *model.setEmail } : std::nullopt } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithGoogleAccountRequestWrapper(const PFAuthenticationLoginWithGoogleAccountRequestWrapper& src) : + PFAuthenticationLoginWithGoogleAccountRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithGoogleAccountRequestWrapper(PFAuthenticationLoginWithGoogleAccountRequestWrapper&& src) : + PFAuthenticationLoginWithGoogleAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithGoogleAccountRequestWrapper& operator=(PFAuthenticationLoginWithGoogleAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithGoogleAccountRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithGoogleAccountRequestWrapper& lhs, PFAuthenticationLoginWithGoogleAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_serverAuthCode, rhs.m_serverAuthCode); + swap(lhs.m_setEmail, rhs.m_setEmail); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetServerAuthCode(String value) + { + m_serverAuthCode = std::move(value); + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + } + + void SetSetEmail(std::optional value) + { + m_setEmail = std::move(value); + this->m_model.setEmail = m_setEmail ? m_setEmail.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + this->m_model.setEmail = m_setEmail ? m_setEmail.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; + String m_serverAuthCode; + std::optional m_setEmail; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithGooglePlayGamesServicesRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper() = default; + + PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper(const PFAuthenticationLoginWithGooglePlayGamesServicesRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_serverAuthCode{ SafeString(model.serverAuthCode) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper(const PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper& src) : + PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper(PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper&& src) : + PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper& operator=(PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper& lhs, PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_serverAuthCode, rhs.m_serverAuthCode); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetServerAuthCode(String value) + { + m_serverAuthCode = std::move(value); + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; + String m_serverAuthCode; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithIOSDeviceIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithIOSDeviceIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithIOSDeviceIDRequestWrapper() = default; + + PFAuthenticationLoginWithIOSDeviceIDRequestWrapper(const PFAuthenticationLoginWithIOSDeviceIDRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_deviceId{ SafeString(model.deviceId) }, + m_deviceModel{ SafeString(model.deviceModel) }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_OS{ SafeString(model.OS) }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithIOSDeviceIDRequestWrapper(const PFAuthenticationLoginWithIOSDeviceIDRequestWrapper& src) : + PFAuthenticationLoginWithIOSDeviceIDRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithIOSDeviceIDRequestWrapper(PFAuthenticationLoginWithIOSDeviceIDRequestWrapper&& src) : + PFAuthenticationLoginWithIOSDeviceIDRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithIOSDeviceIDRequestWrapper& operator=(PFAuthenticationLoginWithIOSDeviceIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithIOSDeviceIDRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithIOSDeviceIDRequestWrapper& lhs, PFAuthenticationLoginWithIOSDeviceIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_deviceId, rhs.m_deviceId); + swap(lhs.m_deviceModel, rhs.m_deviceModel); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_OS, rhs.m_OS); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDeviceId(String value) + { + m_deviceId = std::move(value); + this->m_model.deviceId = m_deviceId.empty() ? nullptr : m_deviceId.data(); + } + + void SetDeviceModel(String value) + { + m_deviceModel = std::move(value); + this->m_model.deviceModel = m_deviceModel.empty() ? nullptr : m_deviceModel.data(); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetOS(String value) + { + m_OS = std::move(value); + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.deviceId = m_deviceId.empty() ? nullptr : m_deviceId.data(); + this->m_model.deviceModel = m_deviceModel.empty() ? nullptr : m_deviceModel.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_deviceId; + String m_deviceModel; + std::optional> m_infoRequestParameters; + String m_OS; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithKongregateRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithKongregateRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithKongregateRequestWrapper() = default; + + PFAuthenticationLoginWithKongregateRequestWrapper(const PFAuthenticationLoginWithKongregateRequest& model) : + ModelWrapper{ model }, + m_authTicket{ SafeString(model.authTicket) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_kongregateId{ SafeString(model.kongregateId) }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithKongregateRequestWrapper(const PFAuthenticationLoginWithKongregateRequestWrapper& src) : + PFAuthenticationLoginWithKongregateRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithKongregateRequestWrapper(PFAuthenticationLoginWithKongregateRequestWrapper&& src) : + PFAuthenticationLoginWithKongregateRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithKongregateRequestWrapper& operator=(PFAuthenticationLoginWithKongregateRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithKongregateRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithKongregateRequestWrapper& lhs, PFAuthenticationLoginWithKongregateRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_authTicket, rhs.m_authTicket); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_kongregateId, rhs.m_kongregateId); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAuthTicket(String value) + { + m_authTicket = std::move(value); + this->m_model.authTicket = m_authTicket.empty() ? nullptr : m_authTicket.data(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetKongregateId(String value) + { + m_kongregateId = std::move(value); + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.authTicket = m_authTicket.empty() ? nullptr : m_authTicket.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + String m_authTicket; + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_kongregateId; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithNintendoServiceAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper() = default; + + PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper(const PFAuthenticationLoginWithNintendoServiceAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_identityToken{ SafeString(model.identityToken) }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper(const PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper& src) : + PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper(PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper&& src) : + PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper& operator=(PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper& lhs, PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_identityToken, rhs.m_identityToken); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetIdentityToken(String value) + { + m_identityToken = std::move(value); + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_identityToken; + std::optional> m_infoRequestParameters; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper() = default; + + PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper(const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_nintendoSwitchDeviceId{ SafeString(model.nintendoSwitchDeviceId) }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper(const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper& src) : + PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper(PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper&& src) : + PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper& operator=(PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper& lhs, PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_nintendoSwitchDeviceId, rhs.m_nintendoSwitchDeviceId); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetNintendoSwitchDeviceId(String value) + { + m_nintendoSwitchDeviceId = std::move(value); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_nintendoSwitchDeviceId; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithOpenIdConnectRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithOpenIdConnectRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithOpenIdConnectRequestWrapper() = default; + + PFAuthenticationLoginWithOpenIdConnectRequestWrapper(const PFAuthenticationLoginWithOpenIdConnectRequest& model) : + ModelWrapper{ model }, + m_connectionId{ SafeString(model.connectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_idToken{ SafeString(model.idToken) }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithOpenIdConnectRequestWrapper(const PFAuthenticationLoginWithOpenIdConnectRequestWrapper& src) : + PFAuthenticationLoginWithOpenIdConnectRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithOpenIdConnectRequestWrapper(PFAuthenticationLoginWithOpenIdConnectRequestWrapper&& src) : + PFAuthenticationLoginWithOpenIdConnectRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithOpenIdConnectRequestWrapper& operator=(PFAuthenticationLoginWithOpenIdConnectRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithOpenIdConnectRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithOpenIdConnectRequestWrapper& lhs, PFAuthenticationLoginWithOpenIdConnectRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_connectionId, rhs.m_connectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_idToken, rhs.m_idToken); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConnectionId(String value) + { + m_connectionId = std::move(value); + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetIdToken(String value) + { + m_idToken = std::move(value); + this->m_model.idToken = m_idToken.empty() ? nullptr : m_idToken.data(); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.idToken = m_idToken.empty() ? nullptr : m_idToken.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + String m_connectionId; + StringDictionaryEntryVector m_customTags; + String m_idToken; + std::optional> m_infoRequestParameters; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithPlayFabRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithPlayFabRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithPlayFabRequestWrapper() = default; + + PFAuthenticationLoginWithPlayFabRequestWrapper(const PFAuthenticationLoginWithPlayFabRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_password{ SafeString(model.password) }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithPlayFabRequestWrapper(const PFAuthenticationLoginWithPlayFabRequestWrapper& src) : + PFAuthenticationLoginWithPlayFabRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithPlayFabRequestWrapper(PFAuthenticationLoginWithPlayFabRequestWrapper&& src) : + PFAuthenticationLoginWithPlayFabRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithPlayFabRequestWrapper& operator=(PFAuthenticationLoginWithPlayFabRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithPlayFabRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithPlayFabRequestWrapper& lhs, PFAuthenticationLoginWithPlayFabRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_password, rhs.m_password); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPassword(String value) + { + m_password = std::move(value); + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_password; + String m_username; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithPSNRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithPSNRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithPSNRequestWrapper() = default; + + PFAuthenticationLoginWithPSNRequestWrapper(const PFAuthenticationLoginWithPSNRequest& model) : + ModelWrapper{ model }, + m_authCode{ SafeString(model.authCode) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_issuerId{ model.issuerId ? std::optional{ *model.issuerId } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_redirectUri{ SafeString(model.redirectUri) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithPSNRequestWrapper(const PFAuthenticationLoginWithPSNRequestWrapper& src) : + PFAuthenticationLoginWithPSNRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithPSNRequestWrapper(PFAuthenticationLoginWithPSNRequestWrapper&& src) : + PFAuthenticationLoginWithPSNRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithPSNRequestWrapper& operator=(PFAuthenticationLoginWithPSNRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithPSNRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithPSNRequestWrapper& lhs, PFAuthenticationLoginWithPSNRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_authCode, rhs.m_authCode); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_issuerId, rhs.m_issuerId); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_redirectUri, rhs.m_redirectUri); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAuthCode(String value) + { + m_authCode = std::move(value); + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetIssuerId(std::optional value) + { + m_issuerId = std::move(value); + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetRedirectUri(String value) + { + m_redirectUri = std::move(value); + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + +private: + void SetModelPointers() + { + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + + String m_authCode; + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + std::optional m_issuerId; + String m_playerSecret; + String m_redirectUri; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithSteamRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithSteamRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithSteamRequestWrapper() = default; + + PFAuthenticationLoginWithSteamRequestWrapper(const PFAuthenticationLoginWithSteamRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_steamTicket{ SafeString(model.steamTicket) }, + m_ticketIsServiceSpecific{ model.ticketIsServiceSpecific ? std::optional{ *model.ticketIsServiceSpecific } : std::nullopt } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithSteamRequestWrapper(const PFAuthenticationLoginWithSteamRequestWrapper& src) : + PFAuthenticationLoginWithSteamRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithSteamRequestWrapper(PFAuthenticationLoginWithSteamRequestWrapper&& src) : + PFAuthenticationLoginWithSteamRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithSteamRequestWrapper& operator=(PFAuthenticationLoginWithSteamRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithSteamRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithSteamRequestWrapper& lhs, PFAuthenticationLoginWithSteamRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_steamTicket, rhs.m_steamTicket); + swap(lhs.m_ticketIsServiceSpecific, rhs.m_ticketIsServiceSpecific); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetSteamTicket(String value) + { + m_steamTicket = std::move(value); + this->m_model.steamTicket = m_steamTicket.empty() ? nullptr : m_steamTicket.data(); + } + + void SetTicketIsServiceSpecific(std::optional value) + { + m_ticketIsServiceSpecific = std::move(value); + this->m_model.ticketIsServiceSpecific = m_ticketIsServiceSpecific ? m_ticketIsServiceSpecific.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.steamTicket = m_steamTicket.empty() ? nullptr : m_steamTicket.data(); + this->m_model.ticketIsServiceSpecific = m_ticketIsServiceSpecific ? m_ticketIsServiceSpecific.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; + String m_steamTicket; + std::optional m_ticketIsServiceSpecific; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithTwitchRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithTwitchRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithTwitchRequestWrapper() = default; + + PFAuthenticationLoginWithTwitchRequestWrapper(const PFAuthenticationLoginWithTwitchRequest& model) : + ModelWrapper{ model }, + m_accessToken{ SafeString(model.accessToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithTwitchRequestWrapper(const PFAuthenticationLoginWithTwitchRequestWrapper& src) : + PFAuthenticationLoginWithTwitchRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithTwitchRequestWrapper(PFAuthenticationLoginWithTwitchRequestWrapper&& src) : + PFAuthenticationLoginWithTwitchRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithTwitchRequestWrapper& operator=(PFAuthenticationLoginWithTwitchRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithTwitchRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithTwitchRequestWrapper& lhs, PFAuthenticationLoginWithTwitchRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_accessToken, rhs.m_accessToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAccessToken(String value) + { + m_accessToken = std::move(value); + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + String m_accessToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithXboxRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithXboxRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithXboxRequestWrapper() = default; + + PFAuthenticationLoginWithXboxRequestWrapper(const PFAuthenticationLoginWithXboxRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_xboxToken{ SafeString(model.xboxToken) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithXboxRequestWrapper(const PFAuthenticationLoginWithXboxRequestWrapper& src) : + PFAuthenticationLoginWithXboxRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithXboxRequestWrapper(PFAuthenticationLoginWithXboxRequestWrapper&& src) : + PFAuthenticationLoginWithXboxRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithXboxRequestWrapper& operator=(PFAuthenticationLoginWithXboxRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithXboxRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithXboxRequestWrapper& lhs, PFAuthenticationLoginWithXboxRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_xboxToken, rhs.m_xboxToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetXboxToken(String value) + { + m_xboxToken = std::move(value); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; + String m_xboxToken; +}; + +#if HC_PLATFORM == HC_PLATFORM_GDK +class XUser +{ +public: + static XUser Wrap(XUserHandle handle) + { + return XUser{ handle }; + } + + static XUser Duplicate(XUserHandle handle) + { + XUserHandle duplicatedHandle; + THROW_IF_FAILED(XUserDuplicateHandle(handle, &duplicatedHandle)); + return XUser{ duplicatedHandle }; + } + + XUser(XUser const& other) + { + THROW_IF_FAILED(XUserDuplicateHandle(other.m_handle, &m_handle)); + } + + XUser(XUser&& other) + { + std::swap(other.m_handle, m_handle); + } + + XUser& operator=(XUser other) + { + std::swap(m_handle, other.m_handle); + return *this; + } + + ~XUser() + { + if (m_handle) + { + XUserCloseHandle(m_handle); + } + } + + XUserHandle Handle() const noexcept + { + return m_handle; + } + +private: + XUser(XUserHandle handle) : m_handle{ handle } + { + } + + XUserHandle m_handle{ nullptr }; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithXUserRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithXUserRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithXUserRequestWrapper(XUser user) + : m_user{ std::move(user) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithXUserRequestWrapper(const PFAuthenticationLoginWithXUserRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_user{ XUser::Duplicate(model.user) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithXUserRequestWrapper(const PFAuthenticationLoginWithXUserRequestWrapper& src) : + PFAuthenticationLoginWithXUserRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithXUserRequestWrapper(PFAuthenticationLoginWithXUserRequestWrapper&& src) : + m_user{ XUser::Wrap(nullptr) } + { + swap(*this, src); + } + + PFAuthenticationLoginWithXUserRequestWrapper& operator=(PFAuthenticationLoginWithXUserRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithXUserRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithXUserRequestWrapper& lhs, PFAuthenticationLoginWithXUserRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_user, rhs.m_user); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetUser(XUser value) + { + m_user = std::move(value); + this->m_model.user = m_user.Handle(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.user = m_user.Handle(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; + XUser m_user; +}; +#endif + +template class Alloc = std::allocator> +class PFAuthenticationRegisterPlayFabUserRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationRegisterPlayFabUserRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationRegisterPlayFabUserRequestWrapper() = default; + + PFAuthenticationRegisterPlayFabUserRequestWrapper(const PFAuthenticationRegisterPlayFabUserRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_displayName{ SafeString(model.displayName) }, + m_email{ SafeString(model.email) }, + m_encryptedRequest{ SafeString(model.encryptedRequest) }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_password{ SafeString(model.password) }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_requireBothUsernameAndEmail{ model.requireBothUsernameAndEmail ? std::optional{ *model.requireBothUsernameAndEmail } : std::nullopt }, + m_titleId{ SafeString(model.titleId) }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFAuthenticationRegisterPlayFabUserRequestWrapper(const PFAuthenticationRegisterPlayFabUserRequestWrapper& src) : + PFAuthenticationRegisterPlayFabUserRequestWrapper{ src.Model() } + { + } + + PFAuthenticationRegisterPlayFabUserRequestWrapper(PFAuthenticationRegisterPlayFabUserRequestWrapper&& src) : + PFAuthenticationRegisterPlayFabUserRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationRegisterPlayFabUserRequestWrapper& operator=(PFAuthenticationRegisterPlayFabUserRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationRegisterPlayFabUserRequestWrapper() = default; + + friend void swap(PFAuthenticationRegisterPlayFabUserRequestWrapper& lhs, PFAuthenticationRegisterPlayFabUserRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_displayName, rhs.m_displayName); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_encryptedRequest, rhs.m_encryptedRequest); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_password, rhs.m_password); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_requireBothUsernameAndEmail, rhs.m_requireBothUsernameAndEmail); + swap(lhs.m_titleId, rhs.m_titleId); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetEncryptedRequest(String value) + { + m_encryptedRequest = std::move(value); + this->m_model.encryptedRequest = m_encryptedRequest.empty() ? nullptr : m_encryptedRequest.data(); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPassword(String value) + { + m_password = std::move(value); + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetRequireBothUsernameAndEmail(std::optional value) + { + m_requireBothUsernameAndEmail = std::move(value); + this->m_model.requireBothUsernameAndEmail = m_requireBothUsernameAndEmail ? m_requireBothUsernameAndEmail.operator->() : nullptr; + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.encryptedRequest = m_encryptedRequest.empty() ? nullptr : m_encryptedRequest.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.requireBothUsernameAndEmail = m_requireBothUsernameAndEmail ? m_requireBothUsernameAndEmail.operator->() : nullptr; + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_displayName; + String m_email; + String m_encryptedRequest; + std::optional> m_infoRequestParameters; + String m_password; + String m_playerSecret; + std::optional m_requireBothUsernameAndEmail; + String m_titleId; + String m_username; +}; + +template class Alloc = std::allocator> +class PFAuthenticationRegisterPlayFabUserResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationRegisterPlayFabUserResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationRegisterPlayFabUserResultWrapper() = default; + + PFAuthenticationRegisterPlayFabUserResultWrapper(const PFAuthenticationRegisterPlayFabUserResult& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) }, + m_settingsForUser{ model.settingsForUser ? std::optional>{ *model.settingsForUser } : std::nullopt }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFAuthenticationRegisterPlayFabUserResultWrapper(const PFAuthenticationRegisterPlayFabUserResultWrapper& src) : + PFAuthenticationRegisterPlayFabUserResultWrapper{ src.Model() } + { + } + + PFAuthenticationRegisterPlayFabUserResultWrapper(PFAuthenticationRegisterPlayFabUserResultWrapper&& src) : + PFAuthenticationRegisterPlayFabUserResultWrapper{} + { + swap(*this, src); + } + + PFAuthenticationRegisterPlayFabUserResultWrapper& operator=(PFAuthenticationRegisterPlayFabUserResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationRegisterPlayFabUserResultWrapper() = default; + + friend void swap(PFAuthenticationRegisterPlayFabUserResultWrapper& lhs, PFAuthenticationRegisterPlayFabUserResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_settingsForUser, rhs.m_settingsForUser); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetSettingsForUser(std::optional> value) + { + m_settingsForUser = std::move(value); + this->m_model.settingsForUser = m_settingsForUser ? &m_settingsForUser->Model() : nullptr; + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.settingsForUser = m_settingsForUser ? &m_settingsForUser->Model() : nullptr; + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + String m_playFabId; + std::optional> m_settingsForUser; + String m_username; +}; + +template class Alloc = std::allocator> +class PFAuthenticationSetPlayerSecretRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationSetPlayerSecretRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationSetPlayerSecretRequestWrapper() = default; + + PFAuthenticationSetPlayerSecretRequestWrapper(const PFAuthenticationSetPlayerSecretRequest& model) : + ModelWrapper{ model }, + m_encryptedRequest{ SafeString(model.encryptedRequest) }, + m_playerSecret{ SafeString(model.playerSecret) } + { + SetModelPointers(); + } + + PFAuthenticationSetPlayerSecretRequestWrapper(const PFAuthenticationSetPlayerSecretRequestWrapper& src) : + PFAuthenticationSetPlayerSecretRequestWrapper{ src.Model() } + { + } + + PFAuthenticationSetPlayerSecretRequestWrapper(PFAuthenticationSetPlayerSecretRequestWrapper&& src) : + PFAuthenticationSetPlayerSecretRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationSetPlayerSecretRequestWrapper& operator=(PFAuthenticationSetPlayerSecretRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationSetPlayerSecretRequestWrapper() = default; + + friend void swap(PFAuthenticationSetPlayerSecretRequestWrapper& lhs, PFAuthenticationSetPlayerSecretRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_encryptedRequest, rhs.m_encryptedRequest); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEncryptedRequest(String value) + { + m_encryptedRequest = std::move(value); + this->m_model.encryptedRequest = m_encryptedRequest.empty() ? nullptr : m_encryptedRequest.data(); + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + +private: + void SetModelPointers() + { + this->m_model.encryptedRequest = m_encryptedRequest.empty() ? nullptr : m_encryptedRequest.data(); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + String m_encryptedRequest; + String m_playerSecret; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithServerCustomIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithServerCustomIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithServerCustomIdRequestWrapper() = default; + + PFAuthenticationLoginWithServerCustomIdRequestWrapper(const PFAuthenticationLoginWithServerCustomIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_playerSecret{ SafeString(model.playerSecret) }, + m_serverCustomId{ SafeString(model.serverCustomId) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithServerCustomIdRequestWrapper(const PFAuthenticationLoginWithServerCustomIdRequestWrapper& src) : + PFAuthenticationLoginWithServerCustomIdRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithServerCustomIdRequestWrapper(PFAuthenticationLoginWithServerCustomIdRequestWrapper&& src) : + PFAuthenticationLoginWithServerCustomIdRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithServerCustomIdRequestWrapper& operator=(PFAuthenticationLoginWithServerCustomIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithServerCustomIdRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithServerCustomIdRequestWrapper& lhs, PFAuthenticationLoginWithServerCustomIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playerSecret, rhs.m_playerSecret); + swap(lhs.m_serverCustomId, rhs.m_serverCustomId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetPlayerSecret(String value) + { + m_playerSecret = std::move(value); + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + } + + void SetServerCustomId(String value) + { + m_serverCustomId = std::move(value); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.playerSecret = m_playerSecret.empty() ? nullptr : m_playerSecret.data(); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_playerSecret; + String m_serverCustomId; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithSteamIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithSteamIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithSteamIdRequestWrapper() = default; + + PFAuthenticationLoginWithSteamIdRequestWrapper(const PFAuthenticationLoginWithSteamIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_steamId{ SafeString(model.steamId) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithSteamIdRequestWrapper(const PFAuthenticationLoginWithSteamIdRequestWrapper& src) : + PFAuthenticationLoginWithSteamIdRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithSteamIdRequestWrapper(PFAuthenticationLoginWithSteamIdRequestWrapper&& src) : + PFAuthenticationLoginWithSteamIdRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithSteamIdRequestWrapper& operator=(PFAuthenticationLoginWithSteamIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithSteamIdRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithSteamIdRequestWrapper& lhs, PFAuthenticationLoginWithSteamIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_steamId, rhs.m_steamId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetSteamId(String value) + { + m_steamId = std::move(value); + this->m_model.steamId = m_steamId.empty() ? nullptr : m_steamId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.steamId = m_steamId.empty() ? nullptr : m_steamId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_steamId; +}; + +template class Alloc = std::allocator> +class PFAuthenticationServerLoginWithXboxRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationServerLoginWithXboxRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationServerLoginWithXboxRequestWrapper() = default; + + PFAuthenticationServerLoginWithXboxRequestWrapper(const PFAuthenticationServerLoginWithXboxRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_xboxToken{ SafeString(model.xboxToken) } + { + SetModelPointers(); + } + + PFAuthenticationServerLoginWithXboxRequestWrapper(const PFAuthenticationServerLoginWithXboxRequestWrapper& src) : + PFAuthenticationServerLoginWithXboxRequestWrapper{ src.Model() } + { + } + + PFAuthenticationServerLoginWithXboxRequestWrapper(PFAuthenticationServerLoginWithXboxRequestWrapper&& src) : + PFAuthenticationServerLoginWithXboxRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationServerLoginWithXboxRequestWrapper& operator=(PFAuthenticationServerLoginWithXboxRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationServerLoginWithXboxRequestWrapper() = default; + + friend void swap(PFAuthenticationServerLoginWithXboxRequestWrapper& lhs, PFAuthenticationServerLoginWithXboxRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_xboxToken, rhs.m_xboxToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetXboxToken(String value) + { + m_xboxToken = std::move(value); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_xboxToken; +}; + +template class Alloc = std::allocator> +class PFAuthenticationLoginWithXboxIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationLoginWithXboxIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationLoginWithXboxIdRequestWrapper() = default; + + PFAuthenticationLoginWithXboxIdRequestWrapper(const PFAuthenticationLoginWithXboxIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? std::optional>{ *model.infoRequestParameters } : std::nullopt }, + m_sandbox{ SafeString(model.sandbox) }, + m_xboxId{ SafeString(model.xboxId) } + { + SetModelPointers(); + } + + PFAuthenticationLoginWithXboxIdRequestWrapper(const PFAuthenticationLoginWithXboxIdRequestWrapper& src) : + PFAuthenticationLoginWithXboxIdRequestWrapper{ src.Model() } + { + } + + PFAuthenticationLoginWithXboxIdRequestWrapper(PFAuthenticationLoginWithXboxIdRequestWrapper&& src) : + PFAuthenticationLoginWithXboxIdRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationLoginWithXboxIdRequestWrapper& operator=(PFAuthenticationLoginWithXboxIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationLoginWithXboxIdRequestWrapper() = default; + + friend void swap(PFAuthenticationLoginWithXboxIdRequestWrapper& lhs, PFAuthenticationLoginWithXboxIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_sandbox, rhs.m_sandbox); + swap(lhs.m_xboxId, rhs.m_xboxId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateAccount(bool value) + { + this->m_model.createAccount = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(std::optional> value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + } + + void SetSandbox(String value) + { + m_sandbox = std::move(value); + this->m_model.sandbox = m_sandbox.empty() ? nullptr : m_sandbox.data(); + } + + void SetXboxId(String value) + { + m_xboxId = std::move(value); + this->m_model.xboxId = m_xboxId.empty() ? nullptr : m_xboxId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = m_infoRequestParameters ? &m_infoRequestParameters->Model() : nullptr; + this->m_model.sandbox = m_sandbox.empty() ? nullptr : m_sandbox.data(); + this->m_model.xboxId = m_xboxId.empty() ? nullptr : m_xboxId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_infoRequestParameters; + String m_sandbox; + String m_xboxId; +}; + +#if HC_PLATFORM != HC_PLATFORM_GDK +template class Alloc = std::allocator> +class PFAuthenticationAuthenticateCustomIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationAuthenticateCustomIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationAuthenticateCustomIdRequestWrapper() = default; + + PFAuthenticationAuthenticateCustomIdRequestWrapper(const PFAuthenticationAuthenticateCustomIdRequest& model) : + ModelWrapper{ model }, + m_customId{ SafeString(model.customId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAuthenticationAuthenticateCustomIdRequestWrapper(const PFAuthenticationAuthenticateCustomIdRequestWrapper& src) : + PFAuthenticationAuthenticateCustomIdRequestWrapper{ src.Model() } + { + } + + PFAuthenticationAuthenticateCustomIdRequestWrapper(PFAuthenticationAuthenticateCustomIdRequestWrapper&& src) : + PFAuthenticationAuthenticateCustomIdRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationAuthenticateCustomIdRequestWrapper& operator=(PFAuthenticationAuthenticateCustomIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationAuthenticateCustomIdRequestWrapper() = default; + + friend void swap(PFAuthenticationAuthenticateCustomIdRequestWrapper& lhs, PFAuthenticationAuthenticateCustomIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customId, rhs.m_customId); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomId(String value) + { + m_customId = std::move(value); + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + String m_customId; + StringDictionaryEntryVector m_customTags; +}; +#endif + +template class Alloc = std::allocator> +class PFAuthenticationEntityTokenResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationEntityTokenResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationEntityTokenResponseWrapper() = default; + + PFAuthenticationEntityTokenResponseWrapper(const PFAuthenticationEntityTokenResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_entityToken{ SafeString(model.entityToken) }, + m_tokenExpiration{ model.tokenExpiration ? std::optional{ *model.tokenExpiration } : std::nullopt } + { + SetModelPointers(); + } + + PFAuthenticationEntityTokenResponseWrapper(const PFAuthenticationEntityTokenResponseWrapper& src) : + PFAuthenticationEntityTokenResponseWrapper{ src.Model() } + { + } + + PFAuthenticationEntityTokenResponseWrapper(PFAuthenticationEntityTokenResponseWrapper&& src) : + PFAuthenticationEntityTokenResponseWrapper{} + { + swap(*this, src); + } + + PFAuthenticationEntityTokenResponseWrapper& operator=(PFAuthenticationEntityTokenResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationEntityTokenResponseWrapper() = default; + + friend void swap(PFAuthenticationEntityTokenResponseWrapper& lhs, PFAuthenticationEntityTokenResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_entityToken, rhs.m_entityToken); + swap(lhs.m_tokenExpiration, rhs.m_tokenExpiration); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetEntityToken(String value) + { + m_entityToken = std::move(value); + this->m_model.entityToken = m_entityToken.empty() ? nullptr : m_entityToken.data(); + } + + void SetTokenExpiration(std::optional value) + { + m_tokenExpiration = std::move(value); + this->m_model.tokenExpiration = m_tokenExpiration ? m_tokenExpiration.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.entityToken = m_entityToken.empty() ? nullptr : m_entityToken.data(); + this->m_model.tokenExpiration = m_tokenExpiration ? m_tokenExpiration.operator->() : nullptr; + } + + std::optional> m_entity; + String m_entityToken; + std::optional m_tokenExpiration; +}; + +#if HC_PLATFORM != HC_PLATFORM_GDK +template class Alloc = std::allocator> +class PFAuthenticationAuthenticateCustomIdResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationAuthenticateCustomIdResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationAuthenticateCustomIdResultWrapper() = default; + + PFAuthenticationAuthenticateCustomIdResultWrapper(const PFAuthenticationAuthenticateCustomIdResult& model) : + ModelWrapper{ model }, + m_entityToken{ model.entityToken ? std::optional>{ *model.entityToken } : std::nullopt } + { + SetModelPointers(); + } + + PFAuthenticationAuthenticateCustomIdResultWrapper(const PFAuthenticationAuthenticateCustomIdResultWrapper& src) : + PFAuthenticationAuthenticateCustomIdResultWrapper{ src.Model() } + { + } + + PFAuthenticationAuthenticateCustomIdResultWrapper(PFAuthenticationAuthenticateCustomIdResultWrapper&& src) : + PFAuthenticationAuthenticateCustomIdResultWrapper{} + { + swap(*this, src); + } + + PFAuthenticationAuthenticateCustomIdResultWrapper& operator=(PFAuthenticationAuthenticateCustomIdResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationAuthenticateCustomIdResultWrapper() = default; + + friend void swap(PFAuthenticationAuthenticateCustomIdResultWrapper& lhs, PFAuthenticationAuthenticateCustomIdResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entityToken, rhs.m_entityToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntityToken(std::optional> value) + { + m_entityToken = std::move(value); + this->m_model.entityToken = m_entityToken ? &m_entityToken->Model() : nullptr; + } + + void SetNewlyCreated(bool value) + { + this->m_model.newlyCreated = value; + } + +private: + void SetModelPointers() + { + this->m_model.entityToken = m_entityToken ? &m_entityToken->Model() : nullptr; + } + + std::optional> m_entityToken; +}; +#endif + +template class Alloc = std::allocator> +class PFAuthenticationDeleteRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationDeleteRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationDeleteRequestWrapper() = default; + + PFAuthenticationDeleteRequestWrapper(const PFAuthenticationDeleteRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} } + { + SetModelPointers(); + } + + PFAuthenticationDeleteRequestWrapper(const PFAuthenticationDeleteRequestWrapper& src) : + PFAuthenticationDeleteRequestWrapper{ src.Model() } + { + } + + PFAuthenticationDeleteRequestWrapper(PFAuthenticationDeleteRequestWrapper&& src) : + PFAuthenticationDeleteRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationDeleteRequestWrapper& operator=(PFAuthenticationDeleteRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationDeleteRequestWrapper() = default; + + friend void swap(PFAuthenticationDeleteRequestWrapper& lhs, PFAuthenticationDeleteRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; +}; + +template class Alloc = std::allocator> +class PFAuthenticationGetEntityRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationGetEntityRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationGetEntityRequestWrapper() = default; + + PFAuthenticationGetEntityRequestWrapper(const PFAuthenticationGetEntityRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFAuthenticationGetEntityRequestWrapper(const PFAuthenticationGetEntityRequestWrapper& src) : + PFAuthenticationGetEntityRequestWrapper{ src.Model() } + { + } + + PFAuthenticationGetEntityRequestWrapper(PFAuthenticationGetEntityRequestWrapper&& src) : + PFAuthenticationGetEntityRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationGetEntityRequestWrapper& operator=(PFAuthenticationGetEntityRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationGetEntityRequestWrapper() = default; + + friend void swap(PFAuthenticationGetEntityRequestWrapper& lhs, PFAuthenticationGetEntityRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFAuthenticationValidateEntityTokenRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationValidateEntityTokenRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationValidateEntityTokenRequestWrapper() = default; + + PFAuthenticationValidateEntityTokenRequestWrapper(const PFAuthenticationValidateEntityTokenRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entityToken{ SafeString(model.entityToken) } + { + SetModelPointers(); + } + + PFAuthenticationValidateEntityTokenRequestWrapper(const PFAuthenticationValidateEntityTokenRequestWrapper& src) : + PFAuthenticationValidateEntityTokenRequestWrapper{ src.Model() } + { + } + + PFAuthenticationValidateEntityTokenRequestWrapper(PFAuthenticationValidateEntityTokenRequestWrapper&& src) : + PFAuthenticationValidateEntityTokenRequestWrapper{} + { + swap(*this, src); + } + + PFAuthenticationValidateEntityTokenRequestWrapper& operator=(PFAuthenticationValidateEntityTokenRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationValidateEntityTokenRequestWrapper() = default; + + friend void swap(PFAuthenticationValidateEntityTokenRequestWrapper& lhs, PFAuthenticationValidateEntityTokenRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entityToken, rhs.m_entityToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntityToken(String value) + { + m_entityToken = std::move(value); + this->m_model.entityToken = m_entityToken.empty() ? nullptr : m_entityToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entityToken = m_entityToken.empty() ? nullptr : m_entityToken.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_entityToken; +}; + +template class Alloc = std::allocator> +class PFAuthenticationValidateEntityTokenResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFAuthenticationValidateEntityTokenResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAuthenticationValidateEntityTokenResponseWrapper() = default; + + PFAuthenticationValidateEntityTokenResponseWrapper(const PFAuthenticationValidateEntityTokenResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_identifiedDeviceType{ model.identifiedDeviceType ? std::optional{ *model.identifiedDeviceType } : std::nullopt }, + m_identityProvider{ model.identityProvider ? std::optional{ *model.identityProvider } : std::nullopt }, + m_identityProviderIssuedId{ SafeString(model.identityProviderIssuedId) }, + m_lineage{ model.lineage ? std::optional>{ *model.lineage } : std::nullopt } + { + SetModelPointers(); + } + + PFAuthenticationValidateEntityTokenResponseWrapper(const PFAuthenticationValidateEntityTokenResponseWrapper& src) : + PFAuthenticationValidateEntityTokenResponseWrapper{ src.Model() } + { + } + + PFAuthenticationValidateEntityTokenResponseWrapper(PFAuthenticationValidateEntityTokenResponseWrapper&& src) : + PFAuthenticationValidateEntityTokenResponseWrapper{} + { + swap(*this, src); + } + + PFAuthenticationValidateEntityTokenResponseWrapper& operator=(PFAuthenticationValidateEntityTokenResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAuthenticationValidateEntityTokenResponseWrapper() = default; + + friend void swap(PFAuthenticationValidateEntityTokenResponseWrapper& lhs, PFAuthenticationValidateEntityTokenResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_identifiedDeviceType, rhs.m_identifiedDeviceType); + swap(lhs.m_identityProvider, rhs.m_identityProvider); + swap(lhs.m_identityProviderIssuedId, rhs.m_identityProviderIssuedId); + swap(lhs.m_lineage, rhs.m_lineage); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetIdentifiedDeviceType(std::optional value) + { + m_identifiedDeviceType = std::move(value); + this->m_model.identifiedDeviceType = m_identifiedDeviceType ? m_identifiedDeviceType.operator->() : nullptr; + } + + void SetIdentityProvider(std::optional value) + { + m_identityProvider = std::move(value); + this->m_model.identityProvider = m_identityProvider ? m_identityProvider.operator->() : nullptr; + } + + void SetIdentityProviderIssuedId(String value) + { + m_identityProviderIssuedId = std::move(value); + this->m_model.identityProviderIssuedId = m_identityProviderIssuedId.empty() ? nullptr : m_identityProviderIssuedId.data(); + } + + void SetLineage(std::optional> value) + { + m_lineage = std::move(value); + this->m_model.lineage = m_lineage ? &m_lineage->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.identifiedDeviceType = m_identifiedDeviceType ? m_identifiedDeviceType.operator->() : nullptr; + this->m_model.identityProvider = m_identityProvider ? m_identityProvider.operator->() : nullptr; + this->m_model.identityProviderIssuedId = m_identityProviderIssuedId.empty() ? nullptr : m_identityProviderIssuedId.data(); + this->m_model.lineage = m_lineage ? &m_lineage->Model() : nullptr; + } + + std::optional> m_entity; + std::optional m_identifiedDeviceType; + std::optional m_identityProvider; + String m_identityProviderIssuedId; + std::optional> m_lineage; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/cpp/EventsTypeWrappers.h b/Source/PlayFabCore/Include/Generated/playfab/core/cpp/EventsTypeWrappers.h new file mode 100644 index 0000000..35b1f85 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/cpp/EventsTypeWrappers.h @@ -0,0 +1,1032 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFEventsCreateTelemetryKeyRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsCreateTelemetryKeyRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsCreateTelemetryKeyRequestWrapper() = default; + + PFEventsCreateTelemetryKeyRequestWrapper(const PFEventsCreateTelemetryKeyRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_keyName{ SafeString(model.keyName) } + { + SetModelPointers(); + } + + PFEventsCreateTelemetryKeyRequestWrapper(const PFEventsCreateTelemetryKeyRequestWrapper& src) : + PFEventsCreateTelemetryKeyRequestWrapper{ src.Model() } + { + } + + PFEventsCreateTelemetryKeyRequestWrapper(PFEventsCreateTelemetryKeyRequestWrapper&& src) : + PFEventsCreateTelemetryKeyRequestWrapper{} + { + swap(*this, src); + } + + PFEventsCreateTelemetryKeyRequestWrapper& operator=(PFEventsCreateTelemetryKeyRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsCreateTelemetryKeyRequestWrapper() = default; + + friend void swap(PFEventsCreateTelemetryKeyRequestWrapper& lhs, PFEventsCreateTelemetryKeyRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_keyName, rhs.m_keyName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetKeyName(String value) + { + m_keyName = std::move(value); + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_keyName; +}; + +template class Alloc = std::allocator> +class PFEventsTelemetryKeyDetailsWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsTelemetryKeyDetails; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsTelemetryKeyDetailsWrapper() = default; + + PFEventsTelemetryKeyDetailsWrapper(const PFEventsTelemetryKeyDetails& model) : + ModelWrapper{ model }, + m_keyValue{ SafeString(model.keyValue) }, + m_name{ SafeString(model.name) } + { + SetModelPointers(); + } + + PFEventsTelemetryKeyDetailsWrapper(const PFEventsTelemetryKeyDetailsWrapper& src) : + PFEventsTelemetryKeyDetailsWrapper{ src.Model() } + { + } + + PFEventsTelemetryKeyDetailsWrapper(PFEventsTelemetryKeyDetailsWrapper&& src) : + PFEventsTelemetryKeyDetailsWrapper{} + { + swap(*this, src); + } + + PFEventsTelemetryKeyDetailsWrapper& operator=(PFEventsTelemetryKeyDetailsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsTelemetryKeyDetailsWrapper() = default; + + friend void swap(PFEventsTelemetryKeyDetailsWrapper& lhs, PFEventsTelemetryKeyDetailsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_keyValue, rhs.m_keyValue); + swap(lhs.m_name, rhs.m_name); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCreateTime(time_t value) + { + this->m_model.createTime = value; + } + + void SetIsActive(bool value) + { + this->m_model.isActive = value; + } + + void SetKeyValue(String value) + { + m_keyValue = std::move(value); + this->m_model.keyValue = m_keyValue.empty() ? nullptr : m_keyValue.data(); + } + + void SetLastUpdateTime(time_t value) + { + this->m_model.lastUpdateTime = value; + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + +private: + void SetModelPointers() + { + this->m_model.keyValue = m_keyValue.empty() ? nullptr : m_keyValue.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + String m_keyValue; + String m_name; +}; + +template class Alloc = std::allocator> +class PFEventsCreateTelemetryKeyResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsCreateTelemetryKeyResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsCreateTelemetryKeyResponseWrapper() = default; + + PFEventsCreateTelemetryKeyResponseWrapper(const PFEventsCreateTelemetryKeyResponse& model) : + ModelWrapper{ model }, + m_newKeyDetails{ model.newKeyDetails ? std::optional>{ *model.newKeyDetails } : std::nullopt } + { + SetModelPointers(); + } + + PFEventsCreateTelemetryKeyResponseWrapper(const PFEventsCreateTelemetryKeyResponseWrapper& src) : + PFEventsCreateTelemetryKeyResponseWrapper{ src.Model() } + { + } + + PFEventsCreateTelemetryKeyResponseWrapper(PFEventsCreateTelemetryKeyResponseWrapper&& src) : + PFEventsCreateTelemetryKeyResponseWrapper{} + { + swap(*this, src); + } + + PFEventsCreateTelemetryKeyResponseWrapper& operator=(PFEventsCreateTelemetryKeyResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsCreateTelemetryKeyResponseWrapper() = default; + + friend void swap(PFEventsCreateTelemetryKeyResponseWrapper& lhs, PFEventsCreateTelemetryKeyResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_newKeyDetails, rhs.m_newKeyDetails); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNewKeyDetails(std::optional> value) + { + m_newKeyDetails = std::move(value); + this->m_model.newKeyDetails = m_newKeyDetails ? &m_newKeyDetails->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.newKeyDetails = m_newKeyDetails ? &m_newKeyDetails->Model() : nullptr; + } + + std::optional> m_newKeyDetails; +}; + +template class Alloc = std::allocator> +class PFEventsDeleteTelemetryKeyRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsDeleteTelemetryKeyRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsDeleteTelemetryKeyRequestWrapper() = default; + + PFEventsDeleteTelemetryKeyRequestWrapper(const PFEventsDeleteTelemetryKeyRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_keyName{ SafeString(model.keyName) } + { + SetModelPointers(); + } + + PFEventsDeleteTelemetryKeyRequestWrapper(const PFEventsDeleteTelemetryKeyRequestWrapper& src) : + PFEventsDeleteTelemetryKeyRequestWrapper{ src.Model() } + { + } + + PFEventsDeleteTelemetryKeyRequestWrapper(PFEventsDeleteTelemetryKeyRequestWrapper&& src) : + PFEventsDeleteTelemetryKeyRequestWrapper{} + { + swap(*this, src); + } + + PFEventsDeleteTelemetryKeyRequestWrapper& operator=(PFEventsDeleteTelemetryKeyRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsDeleteTelemetryKeyRequestWrapper() = default; + + friend void swap(PFEventsDeleteTelemetryKeyRequestWrapper& lhs, PFEventsDeleteTelemetryKeyRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_keyName, rhs.m_keyName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetKeyName(String value) + { + m_keyName = std::move(value); + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_keyName; +}; + +template class Alloc = std::allocator> +class PFEventsDeleteTelemetryKeyResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsDeleteTelemetryKeyResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetWasKeyDeleted(bool value) + { + this->m_model.wasKeyDeleted = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFEventsGetTelemetryKeyRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsGetTelemetryKeyRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsGetTelemetryKeyRequestWrapper() = default; + + PFEventsGetTelemetryKeyRequestWrapper(const PFEventsGetTelemetryKeyRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_keyName{ SafeString(model.keyName) } + { + SetModelPointers(); + } + + PFEventsGetTelemetryKeyRequestWrapper(const PFEventsGetTelemetryKeyRequestWrapper& src) : + PFEventsGetTelemetryKeyRequestWrapper{ src.Model() } + { + } + + PFEventsGetTelemetryKeyRequestWrapper(PFEventsGetTelemetryKeyRequestWrapper&& src) : + PFEventsGetTelemetryKeyRequestWrapper{} + { + swap(*this, src); + } + + PFEventsGetTelemetryKeyRequestWrapper& operator=(PFEventsGetTelemetryKeyRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsGetTelemetryKeyRequestWrapper() = default; + + friend void swap(PFEventsGetTelemetryKeyRequestWrapper& lhs, PFEventsGetTelemetryKeyRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_keyName, rhs.m_keyName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetKeyName(String value) + { + m_keyName = std::move(value); + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_keyName; +}; + +template class Alloc = std::allocator> +class PFEventsGetTelemetryKeyResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsGetTelemetryKeyResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsGetTelemetryKeyResponseWrapper() = default; + + PFEventsGetTelemetryKeyResponseWrapper(const PFEventsGetTelemetryKeyResponse& model) : + ModelWrapper{ model }, + m_keyDetails{ model.keyDetails ? std::optional>{ *model.keyDetails } : std::nullopt } + { + SetModelPointers(); + } + + PFEventsGetTelemetryKeyResponseWrapper(const PFEventsGetTelemetryKeyResponseWrapper& src) : + PFEventsGetTelemetryKeyResponseWrapper{ src.Model() } + { + } + + PFEventsGetTelemetryKeyResponseWrapper(PFEventsGetTelemetryKeyResponseWrapper&& src) : + PFEventsGetTelemetryKeyResponseWrapper{} + { + swap(*this, src); + } + + PFEventsGetTelemetryKeyResponseWrapper& operator=(PFEventsGetTelemetryKeyResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsGetTelemetryKeyResponseWrapper() = default; + + friend void swap(PFEventsGetTelemetryKeyResponseWrapper& lhs, PFEventsGetTelemetryKeyResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_keyDetails, rhs.m_keyDetails); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKeyDetails(std::optional> value) + { + m_keyDetails = std::move(value); + this->m_model.keyDetails = m_keyDetails ? &m_keyDetails->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.keyDetails = m_keyDetails ? &m_keyDetails->Model() : nullptr; + } + + std::optional> m_keyDetails; +}; + +template class Alloc = std::allocator> +class PFEventsListTelemetryKeysRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsListTelemetryKeysRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsListTelemetryKeysRequestWrapper() = default; + + PFEventsListTelemetryKeysRequestWrapper(const PFEventsListTelemetryKeysRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFEventsListTelemetryKeysRequestWrapper(const PFEventsListTelemetryKeysRequestWrapper& src) : + PFEventsListTelemetryKeysRequestWrapper{ src.Model() } + { + } + + PFEventsListTelemetryKeysRequestWrapper(PFEventsListTelemetryKeysRequestWrapper&& src) : + PFEventsListTelemetryKeysRequestWrapper{} + { + swap(*this, src); + } + + PFEventsListTelemetryKeysRequestWrapper& operator=(PFEventsListTelemetryKeysRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsListTelemetryKeysRequestWrapper() = default; + + friend void swap(PFEventsListTelemetryKeysRequestWrapper& lhs, PFEventsListTelemetryKeysRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFEventsListTelemetryKeysResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsListTelemetryKeysResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsListTelemetryKeysResponseWrapper() = default; + + PFEventsListTelemetryKeysResponseWrapper(const PFEventsListTelemetryKeysResponse& model) : + ModelWrapper{ model }, + m_keyDetails{ model.keyDetails, model.keyDetails + model.keyDetailsCount } + { + SetModelPointers(); + } + + PFEventsListTelemetryKeysResponseWrapper(const PFEventsListTelemetryKeysResponseWrapper& src) : + PFEventsListTelemetryKeysResponseWrapper{ src.Model() } + { + } + + PFEventsListTelemetryKeysResponseWrapper(PFEventsListTelemetryKeysResponseWrapper&& src) : + PFEventsListTelemetryKeysResponseWrapper{} + { + swap(*this, src); + } + + PFEventsListTelemetryKeysResponseWrapper& operator=(PFEventsListTelemetryKeysResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsListTelemetryKeysResponseWrapper() = default; + + friend void swap(PFEventsListTelemetryKeysResponseWrapper& lhs, PFEventsListTelemetryKeysResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_keyDetails, rhs.m_keyDetails); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKeyDetails(ModelVector, Alloc> value) + { + m_keyDetails = std::move(value); + this->m_model.keyDetails = m_keyDetails.empty() ? nullptr : m_keyDetails.data(); + this->m_model.keyDetailsCount = static_cast(m_keyDetails.size()); + } + +private: + void SetModelPointers() + { + this->m_model.keyDetails = m_keyDetails.empty() ? nullptr : m_keyDetails.data(); + } + + ModelVector, Alloc> m_keyDetails; +}; + +template class Alloc = std::allocator> +class PFEventsSetTelemetryKeyActiveRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsSetTelemetryKeyActiveRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsSetTelemetryKeyActiveRequestWrapper() = default; + + PFEventsSetTelemetryKeyActiveRequestWrapper(const PFEventsSetTelemetryKeyActiveRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_keyName{ SafeString(model.keyName) } + { + SetModelPointers(); + } + + PFEventsSetTelemetryKeyActiveRequestWrapper(const PFEventsSetTelemetryKeyActiveRequestWrapper& src) : + PFEventsSetTelemetryKeyActiveRequestWrapper{ src.Model() } + { + } + + PFEventsSetTelemetryKeyActiveRequestWrapper(PFEventsSetTelemetryKeyActiveRequestWrapper&& src) : + PFEventsSetTelemetryKeyActiveRequestWrapper{} + { + swap(*this, src); + } + + PFEventsSetTelemetryKeyActiveRequestWrapper& operator=(PFEventsSetTelemetryKeyActiveRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsSetTelemetryKeyActiveRequestWrapper() = default; + + friend void swap(PFEventsSetTelemetryKeyActiveRequestWrapper& lhs, PFEventsSetTelemetryKeyActiveRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_keyName, rhs.m_keyName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetActive(bool value) + { + this->m_model.active = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetKeyName(String value) + { + m_keyName = std::move(value); + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.keyName = m_keyName.empty() ? nullptr : m_keyName.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_keyName; +}; + +template class Alloc = std::allocator> +class PFEventsSetTelemetryKeyActiveResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsSetTelemetryKeyActiveResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsSetTelemetryKeyActiveResponseWrapper() = default; + + PFEventsSetTelemetryKeyActiveResponseWrapper(const PFEventsSetTelemetryKeyActiveResponse& model) : + ModelWrapper{ model }, + m_keyDetails{ model.keyDetails ? std::optional>{ *model.keyDetails } : std::nullopt } + { + SetModelPointers(); + } + + PFEventsSetTelemetryKeyActiveResponseWrapper(const PFEventsSetTelemetryKeyActiveResponseWrapper& src) : + PFEventsSetTelemetryKeyActiveResponseWrapper{ src.Model() } + { + } + + PFEventsSetTelemetryKeyActiveResponseWrapper(PFEventsSetTelemetryKeyActiveResponseWrapper&& src) : + PFEventsSetTelemetryKeyActiveResponseWrapper{} + { + swap(*this, src); + } + + PFEventsSetTelemetryKeyActiveResponseWrapper& operator=(PFEventsSetTelemetryKeyActiveResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsSetTelemetryKeyActiveResponseWrapper() = default; + + friend void swap(PFEventsSetTelemetryKeyActiveResponseWrapper& lhs, PFEventsSetTelemetryKeyActiveResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_keyDetails, rhs.m_keyDetails); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKeyDetails(std::optional> value) + { + m_keyDetails = std::move(value); + this->m_model.keyDetails = m_keyDetails ? &m_keyDetails->Model() : nullptr; + } + + void SetWasKeyUpdated(bool value) + { + this->m_model.wasKeyUpdated = value; + } + +private: + void SetModelPointers() + { + this->m_model.keyDetails = m_keyDetails ? &m_keyDetails->Model() : nullptr; + } + + std::optional> m_keyDetails; +}; + +template class Alloc = std::allocator> +class PFEventsEventContentsWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsEventContents; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsEventContentsWrapper() = default; + + PFEventsEventContentsWrapper(const PFEventsEventContents& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eventNamespace{ SafeString(model.eventNamespace) }, + m_name{ SafeString(model.name) }, + m_originalId{ SafeString(model.originalId) }, + m_originalTimestamp{ model.originalTimestamp ? std::optional{ *model.originalTimestamp } : std::nullopt }, + m_payload{ model.payload }, + m_payloadJSON{ SafeString(model.payloadJSON) } + { + SetModelPointers(); + } + + PFEventsEventContentsWrapper(const PFEventsEventContentsWrapper& src) : + PFEventsEventContentsWrapper{ src.Model() } + { + } + + PFEventsEventContentsWrapper(PFEventsEventContentsWrapper&& src) : + PFEventsEventContentsWrapper{} + { + swap(*this, src); + } + + PFEventsEventContentsWrapper& operator=(PFEventsEventContentsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsEventContentsWrapper() = default; + + friend void swap(PFEventsEventContentsWrapper& lhs, PFEventsEventContentsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eventNamespace, rhs.m_eventNamespace); + swap(lhs.m_name, rhs.m_name); + swap(lhs.m_originalId, rhs.m_originalId); + swap(lhs.m_originalTimestamp, rhs.m_originalTimestamp); + swap(lhs.m_payload, rhs.m_payload); + swap(lhs.m_payloadJSON, rhs.m_payloadJSON); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetEventNamespace(String value) + { + m_eventNamespace = std::move(value); + this->m_model.eventNamespace = m_eventNamespace.empty() ? nullptr : m_eventNamespace.data(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetOriginalId(String value) + { + m_originalId = std::move(value); + this->m_model.originalId = m_originalId.empty() ? nullptr : m_originalId.data(); + } + + void SetOriginalTimestamp(std::optional value) + { + m_originalTimestamp = std::move(value); + this->m_model.originalTimestamp = m_originalTimestamp ? m_originalTimestamp.operator->() : nullptr; + } + + void SetPayload(JsonObject value) + { + m_payload = std::move(value); + this->m_model.payload.stringValue = m_payload.stringValue.empty() ? nullptr : m_payload.stringValue.data(); + } + + void SetPayloadJSON(String value) + { + m_payloadJSON = std::move(value); + this->m_model.payloadJSON = m_payloadJSON.empty() ? nullptr : m_payloadJSON.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eventNamespace = m_eventNamespace.empty() ? nullptr : m_eventNamespace.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + this->m_model.originalId = m_originalId.empty() ? nullptr : m_originalId.data(); + this->m_model.originalTimestamp = m_originalTimestamp ? m_originalTimestamp.operator->() : nullptr; + this->m_model.payload.stringValue = m_payload.stringValue.empty() ? nullptr : m_payload.stringValue.data(); + this->m_model.payloadJSON = m_payloadJSON.empty() ? nullptr : m_payloadJSON.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_eventNamespace; + String m_name; + String m_originalId; + std::optional m_originalTimestamp; + JsonObject m_payload; + String m_payloadJSON; +}; + +template class Alloc = std::allocator> +class PFEventsWriteEventsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsWriteEventsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsWriteEventsRequestWrapper() = default; + + PFEventsWriteEventsRequestWrapper(const PFEventsWriteEventsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_events{ model.events, model.events + model.eventsCount } + { + SetModelPointers(); + } + + PFEventsWriteEventsRequestWrapper(const PFEventsWriteEventsRequestWrapper& src) : + PFEventsWriteEventsRequestWrapper{ src.Model() } + { + } + + PFEventsWriteEventsRequestWrapper(PFEventsWriteEventsRequestWrapper&& src) : + PFEventsWriteEventsRequestWrapper{} + { + swap(*this, src); + } + + PFEventsWriteEventsRequestWrapper& operator=(PFEventsWriteEventsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsWriteEventsRequestWrapper() = default; + + friend void swap(PFEventsWriteEventsRequestWrapper& lhs, PFEventsWriteEventsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_events, rhs.m_events); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEvents(ModelVector, Alloc> value) + { + m_events = std::move(value); + this->m_model.events = m_events.empty() ? nullptr : m_events.data(); + this->m_model.eventsCount = static_cast(m_events.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.events = m_events.empty() ? nullptr : m_events.data(); + } + + StringDictionaryEntryVector m_customTags; + ModelVector, Alloc> m_events; +}; + +template class Alloc = std::allocator> +class PFEventsWriteEventsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFEventsWriteEventsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEventsWriteEventsResponseWrapper() = default; + + PFEventsWriteEventsResponseWrapper(const PFEventsWriteEventsResponse& model) : + ModelWrapper{ model }, + m_assignedEventIds{ model.assignedEventIds, model.assignedEventIds + model.assignedEventIdsCount } + { + SetModelPointers(); + } + + PFEventsWriteEventsResponseWrapper(const PFEventsWriteEventsResponseWrapper& src) : + PFEventsWriteEventsResponseWrapper{ src.Model() } + { + } + + PFEventsWriteEventsResponseWrapper(PFEventsWriteEventsResponseWrapper&& src) : + PFEventsWriteEventsResponseWrapper{} + { + swap(*this, src); + } + + PFEventsWriteEventsResponseWrapper& operator=(PFEventsWriteEventsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEventsWriteEventsResponseWrapper() = default; + + friend void swap(PFEventsWriteEventsResponseWrapper& lhs, PFEventsWriteEventsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_assignedEventIds, rhs.m_assignedEventIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAssignedEventIds(CStringVector value) + { + m_assignedEventIds = std::move(value); + this->m_model.assignedEventIds = m_assignedEventIds.empty() ? nullptr : m_assignedEventIds.data(); + this->m_model.assignedEventIdsCount = static_cast(m_assignedEventIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.assignedEventIds = m_assignedEventIds.empty() ? nullptr : m_assignedEventIds.data(); + } + + CStringVector m_assignedEventIds; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabCore/Include/Generated/playfab/core/cpp/TypeWrappers.h b/Source/PlayFabCore/Include/Generated/playfab/core/cpp/TypeWrappers.h new file mode 100644 index 0000000..ef25226 --- /dev/null +++ b/Source/PlayFabCore/Include/Generated/playfab/core/cpp/TypeWrappers.h @@ -0,0 +1,4015 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFPlayerProfileViewConstraintsWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerProfileViewConstraints; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetShowAvatarUrl(bool value) + { + this->m_model.showAvatarUrl = value; + } + + void SetShowBannedUntil(bool value) + { + this->m_model.showBannedUntil = value; + } + + void SetShowCampaignAttributions(bool value) + { + this->m_model.showCampaignAttributions = value; + } + + void SetShowContactEmailAddresses(bool value) + { + this->m_model.showContactEmailAddresses = value; + } + + void SetShowCreated(bool value) + { + this->m_model.showCreated = value; + } + + void SetShowDisplayName(bool value) + { + this->m_model.showDisplayName = value; + } + + void SetShowExperimentVariants(bool value) + { + this->m_model.showExperimentVariants = value; + } + + void SetShowLastLogin(bool value) + { + this->m_model.showLastLogin = value; + } + + void SetShowLinkedAccounts(bool value) + { + this->m_model.showLinkedAccounts = value; + } + + void SetShowLocations(bool value) + { + this->m_model.showLocations = value; + } + + void SetShowMemberships(bool value) + { + this->m_model.showMemberships = value; + } + + void SetShowOrigination(bool value) + { + this->m_model.showOrigination = value; + } + + void SetShowPushNotificationRegistrations(bool value) + { + this->m_model.showPushNotificationRegistrations = value; + } + + void SetShowStatistics(bool value) + { + this->m_model.showStatistics = value; + } + + void SetShowTags(bool value) + { + this->m_model.showTags = value; + } + + void SetShowTotalValueToDateInUsd(bool value) + { + this->m_model.showTotalValueToDateInUsd = value; + } + + void SetShowValuesToDate(bool value) + { + this->m_model.showValuesToDate = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFGetPlayerCombinedInfoRequestParamsWrapper : public ModelWrapper +{ +public: + using ModelType = PFGetPlayerCombinedInfoRequestParams; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGetPlayerCombinedInfoRequestParamsWrapper() = default; + + PFGetPlayerCombinedInfoRequestParamsWrapper(const PFGetPlayerCombinedInfoRequestParams& model) : + ModelWrapper{ model }, + m_playerStatisticNames{ model.playerStatisticNames, model.playerStatisticNames + model.playerStatisticNamesCount }, + m_profileConstraints{ model.profileConstraints ? std::optional>{ *model.profileConstraints } : std::nullopt }, + m_titleDataKeys{ model.titleDataKeys, model.titleDataKeys + model.titleDataKeysCount }, + m_userDataKeys{ model.userDataKeys, model.userDataKeys + model.userDataKeysCount }, + m_userReadOnlyDataKeys{ model.userReadOnlyDataKeys, model.userReadOnlyDataKeys + model.userReadOnlyDataKeysCount } + { + SetModelPointers(); + } + + PFGetPlayerCombinedInfoRequestParamsWrapper(const PFGetPlayerCombinedInfoRequestParamsWrapper& src) : + PFGetPlayerCombinedInfoRequestParamsWrapper{ src.Model() } + { + } + + PFGetPlayerCombinedInfoRequestParamsWrapper(PFGetPlayerCombinedInfoRequestParamsWrapper&& src) : + PFGetPlayerCombinedInfoRequestParamsWrapper{} + { + swap(*this, src); + } + + PFGetPlayerCombinedInfoRequestParamsWrapper& operator=(PFGetPlayerCombinedInfoRequestParamsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGetPlayerCombinedInfoRequestParamsWrapper() = default; + + friend void swap(PFGetPlayerCombinedInfoRequestParamsWrapper& lhs, PFGetPlayerCombinedInfoRequestParamsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playerStatisticNames, rhs.m_playerStatisticNames); + swap(lhs.m_profileConstraints, rhs.m_profileConstraints); + swap(lhs.m_titleDataKeys, rhs.m_titleDataKeys); + swap(lhs.m_userDataKeys, rhs.m_userDataKeys); + swap(lhs.m_userReadOnlyDataKeys, rhs.m_userReadOnlyDataKeys); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGetCharacterInventories(bool value) + { + this->m_model.getCharacterInventories = value; + } + + void SetGetCharacterList(bool value) + { + this->m_model.getCharacterList = value; + } + + void SetGetPlayerProfile(bool value) + { + this->m_model.getPlayerProfile = value; + } + + void SetGetPlayerStatistics(bool value) + { + this->m_model.getPlayerStatistics = value; + } + + void SetGetTitleData(bool value) + { + this->m_model.getTitleData = value; + } + + void SetGetUserAccountInfo(bool value) + { + this->m_model.getUserAccountInfo = value; + } + + void SetGetUserData(bool value) + { + this->m_model.getUserData = value; + } + + void SetGetUserInventory(bool value) + { + this->m_model.getUserInventory = value; + } + + void SetGetUserReadOnlyData(bool value) + { + this->m_model.getUserReadOnlyData = value; + } + + void SetGetUserVirtualCurrency(bool value) + { + this->m_model.getUserVirtualCurrency = value; + } + + void SetPlayerStatisticNames(CStringVector value) + { + m_playerStatisticNames = std::move(value); + this->m_model.playerStatisticNames = m_playerStatisticNames.empty() ? nullptr : m_playerStatisticNames.data(); + this->m_model.playerStatisticNamesCount = static_cast(m_playerStatisticNames.size()); + } + + void SetProfileConstraints(std::optional> value) + { + m_profileConstraints = std::move(value); + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; + } + + void SetTitleDataKeys(CStringVector value) + { + m_titleDataKeys = std::move(value); + this->m_model.titleDataKeys = m_titleDataKeys.empty() ? nullptr : m_titleDataKeys.data(); + this->m_model.titleDataKeysCount = static_cast(m_titleDataKeys.size()); + } + + void SetUserDataKeys(CStringVector value) + { + m_userDataKeys = std::move(value); + this->m_model.userDataKeys = m_userDataKeys.empty() ? nullptr : m_userDataKeys.data(); + this->m_model.userDataKeysCount = static_cast(m_userDataKeys.size()); + } + + void SetUserReadOnlyDataKeys(CStringVector value) + { + m_userReadOnlyDataKeys = std::move(value); + this->m_model.userReadOnlyDataKeys = m_userReadOnlyDataKeys.empty() ? nullptr : m_userReadOnlyDataKeys.data(); + this->m_model.userReadOnlyDataKeysCount = static_cast(m_userReadOnlyDataKeys.size()); + } + +private: + void SetModelPointers() + { + this->m_model.playerStatisticNames = m_playerStatisticNames.empty() ? nullptr : m_playerStatisticNames.data(); + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; + this->m_model.titleDataKeys = m_titleDataKeys.empty() ? nullptr : m_titleDataKeys.data(); + this->m_model.userDataKeys = m_userDataKeys.empty() ? nullptr : m_userDataKeys.data(); + this->m_model.userReadOnlyDataKeys = m_userReadOnlyDataKeys.empty() ? nullptr : m_userReadOnlyDataKeys.data(); + } + + CStringVector m_playerStatisticNames; + std::optional> m_profileConstraints; + CStringVector m_titleDataKeys; + CStringVector m_userDataKeys; + CStringVector m_userReadOnlyDataKeys; +}; + +template class Alloc = std::allocator> +class PFUserAndroidDeviceInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserAndroidDeviceInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserAndroidDeviceInfoWrapper() = default; + + PFUserAndroidDeviceInfoWrapper(const PFUserAndroidDeviceInfo& model) : + ModelWrapper{ model }, + m_androidDeviceId{ SafeString(model.androidDeviceId) } + { + SetModelPointers(); + } + + PFUserAndroidDeviceInfoWrapper(const PFUserAndroidDeviceInfoWrapper& src) : + PFUserAndroidDeviceInfoWrapper{ src.Model() } + { + } + + PFUserAndroidDeviceInfoWrapper(PFUserAndroidDeviceInfoWrapper&& src) : + PFUserAndroidDeviceInfoWrapper{} + { + swap(*this, src); + } + + PFUserAndroidDeviceInfoWrapper& operator=(PFUserAndroidDeviceInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserAndroidDeviceInfoWrapper() = default; + + friend void swap(PFUserAndroidDeviceInfoWrapper& lhs, PFUserAndroidDeviceInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_androidDeviceId, rhs.m_androidDeviceId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAndroidDeviceId(String value) + { + m_androidDeviceId = std::move(value); + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + } + + String m_androidDeviceId; +}; + +template class Alloc = std::allocator> +class PFUserAppleIdInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserAppleIdInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserAppleIdInfoWrapper() = default; + + PFUserAppleIdInfoWrapper(const PFUserAppleIdInfo& model) : + ModelWrapper{ model }, + m_appleSubjectId{ SafeString(model.appleSubjectId) } + { + SetModelPointers(); + } + + PFUserAppleIdInfoWrapper(const PFUserAppleIdInfoWrapper& src) : + PFUserAppleIdInfoWrapper{ src.Model() } + { + } + + PFUserAppleIdInfoWrapper(PFUserAppleIdInfoWrapper&& src) : + PFUserAppleIdInfoWrapper{} + { + swap(*this, src); + } + + PFUserAppleIdInfoWrapper& operator=(PFUserAppleIdInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserAppleIdInfoWrapper() = default; + + friend void swap(PFUserAppleIdInfoWrapper& lhs, PFUserAppleIdInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_appleSubjectId, rhs.m_appleSubjectId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAppleSubjectId(String value) + { + m_appleSubjectId = std::move(value); + this->m_model.appleSubjectId = m_appleSubjectId.empty() ? nullptr : m_appleSubjectId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.appleSubjectId = m_appleSubjectId.empty() ? nullptr : m_appleSubjectId.data(); + } + + String m_appleSubjectId; +}; + +template class Alloc = std::allocator> +class PFUserCustomIdInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserCustomIdInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserCustomIdInfoWrapper() = default; + + PFUserCustomIdInfoWrapper(const PFUserCustomIdInfo& model) : + ModelWrapper{ model }, + m_customId{ SafeString(model.customId) } + { + SetModelPointers(); + } + + PFUserCustomIdInfoWrapper(const PFUserCustomIdInfoWrapper& src) : + PFUserCustomIdInfoWrapper{ src.Model() } + { + } + + PFUserCustomIdInfoWrapper(PFUserCustomIdInfoWrapper&& src) : + PFUserCustomIdInfoWrapper{} + { + swap(*this, src); + } + + PFUserCustomIdInfoWrapper& operator=(PFUserCustomIdInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserCustomIdInfoWrapper() = default; + + friend void swap(PFUserCustomIdInfoWrapper& lhs, PFUserCustomIdInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customId, rhs.m_customId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomId(String value) + { + m_customId = std::move(value); + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + } + + String m_customId; +}; + +template class Alloc = std::allocator> +class PFUserFacebookInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserFacebookInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserFacebookInfoWrapper() = default; + + PFUserFacebookInfoWrapper(const PFUserFacebookInfo& model) : + ModelWrapper{ model }, + m_facebookId{ SafeString(model.facebookId) }, + m_fullName{ SafeString(model.fullName) } + { + SetModelPointers(); + } + + PFUserFacebookInfoWrapper(const PFUserFacebookInfoWrapper& src) : + PFUserFacebookInfoWrapper{ src.Model() } + { + } + + PFUserFacebookInfoWrapper(PFUserFacebookInfoWrapper&& src) : + PFUserFacebookInfoWrapper{} + { + swap(*this, src); + } + + PFUserFacebookInfoWrapper& operator=(PFUserFacebookInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserFacebookInfoWrapper() = default; + + friend void swap(PFUserFacebookInfoWrapper& lhs, PFUserFacebookInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_facebookId, rhs.m_facebookId); + swap(lhs.m_fullName, rhs.m_fullName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFacebookId(String value) + { + m_facebookId = std::move(value); + this->m_model.facebookId = m_facebookId.empty() ? nullptr : m_facebookId.data(); + } + + void SetFullName(String value) + { + m_fullName = std::move(value); + this->m_model.fullName = m_fullName.empty() ? nullptr : m_fullName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.facebookId = m_facebookId.empty() ? nullptr : m_facebookId.data(); + this->m_model.fullName = m_fullName.empty() ? nullptr : m_fullName.data(); + } + + String m_facebookId; + String m_fullName; +}; + +template class Alloc = std::allocator> +class PFUserFacebookInstantGamesIdInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserFacebookInstantGamesIdInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserFacebookInstantGamesIdInfoWrapper() = default; + + PFUserFacebookInstantGamesIdInfoWrapper(const PFUserFacebookInstantGamesIdInfo& model) : + ModelWrapper{ model }, + m_facebookInstantGamesId{ SafeString(model.facebookInstantGamesId) } + { + SetModelPointers(); + } + + PFUserFacebookInstantGamesIdInfoWrapper(const PFUserFacebookInstantGamesIdInfoWrapper& src) : + PFUserFacebookInstantGamesIdInfoWrapper{ src.Model() } + { + } + + PFUserFacebookInstantGamesIdInfoWrapper(PFUserFacebookInstantGamesIdInfoWrapper&& src) : + PFUserFacebookInstantGamesIdInfoWrapper{} + { + swap(*this, src); + } + + PFUserFacebookInstantGamesIdInfoWrapper& operator=(PFUserFacebookInstantGamesIdInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserFacebookInstantGamesIdInfoWrapper() = default; + + friend void swap(PFUserFacebookInstantGamesIdInfoWrapper& lhs, PFUserFacebookInstantGamesIdInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_facebookInstantGamesId, rhs.m_facebookInstantGamesId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFacebookInstantGamesId(String value) + { + m_facebookInstantGamesId = std::move(value); + this->m_model.facebookInstantGamesId = m_facebookInstantGamesId.empty() ? nullptr : m_facebookInstantGamesId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.facebookInstantGamesId = m_facebookInstantGamesId.empty() ? nullptr : m_facebookInstantGamesId.data(); + } + + String m_facebookInstantGamesId; +}; + +template class Alloc = std::allocator> +class PFUserGameCenterInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserGameCenterInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserGameCenterInfoWrapper() = default; + + PFUserGameCenterInfoWrapper(const PFUserGameCenterInfo& model) : + ModelWrapper{ model }, + m_gameCenterId{ SafeString(model.gameCenterId) } + { + SetModelPointers(); + } + + PFUserGameCenterInfoWrapper(const PFUserGameCenterInfoWrapper& src) : + PFUserGameCenterInfoWrapper{ src.Model() } + { + } + + PFUserGameCenterInfoWrapper(PFUserGameCenterInfoWrapper&& src) : + PFUserGameCenterInfoWrapper{} + { + swap(*this, src); + } + + PFUserGameCenterInfoWrapper& operator=(PFUserGameCenterInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserGameCenterInfoWrapper() = default; + + friend void swap(PFUserGameCenterInfoWrapper& lhs, PFUserGameCenterInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_gameCenterId, rhs.m_gameCenterId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGameCenterId(String value) + { + m_gameCenterId = std::move(value); + this->m_model.gameCenterId = m_gameCenterId.empty() ? nullptr : m_gameCenterId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.gameCenterId = m_gameCenterId.empty() ? nullptr : m_gameCenterId.data(); + } + + String m_gameCenterId; +}; + +template class Alloc = std::allocator> +class PFUserGoogleInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserGoogleInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserGoogleInfoWrapper() = default; + + PFUserGoogleInfoWrapper(const PFUserGoogleInfo& model) : + ModelWrapper{ model }, + m_googleEmail{ SafeString(model.googleEmail) }, + m_googleGender{ SafeString(model.googleGender) }, + m_googleId{ SafeString(model.googleId) }, + m_googleLocale{ SafeString(model.googleLocale) }, + m_googleName{ SafeString(model.googleName) } + { + SetModelPointers(); + } + + PFUserGoogleInfoWrapper(const PFUserGoogleInfoWrapper& src) : + PFUserGoogleInfoWrapper{ src.Model() } + { + } + + PFUserGoogleInfoWrapper(PFUserGoogleInfoWrapper&& src) : + PFUserGoogleInfoWrapper{} + { + swap(*this, src); + } + + PFUserGoogleInfoWrapper& operator=(PFUserGoogleInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserGoogleInfoWrapper() = default; + + friend void swap(PFUserGoogleInfoWrapper& lhs, PFUserGoogleInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_googleEmail, rhs.m_googleEmail); + swap(lhs.m_googleGender, rhs.m_googleGender); + swap(lhs.m_googleId, rhs.m_googleId); + swap(lhs.m_googleLocale, rhs.m_googleLocale); + swap(lhs.m_googleName, rhs.m_googleName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGoogleEmail(String value) + { + m_googleEmail = std::move(value); + this->m_model.googleEmail = m_googleEmail.empty() ? nullptr : m_googleEmail.data(); + } + + void SetGoogleGender(String value) + { + m_googleGender = std::move(value); + this->m_model.googleGender = m_googleGender.empty() ? nullptr : m_googleGender.data(); + } + + void SetGoogleId(String value) + { + m_googleId = std::move(value); + this->m_model.googleId = m_googleId.empty() ? nullptr : m_googleId.data(); + } + + void SetGoogleLocale(String value) + { + m_googleLocale = std::move(value); + this->m_model.googleLocale = m_googleLocale.empty() ? nullptr : m_googleLocale.data(); + } + + void SetGoogleName(String value) + { + m_googleName = std::move(value); + this->m_model.googleName = m_googleName.empty() ? nullptr : m_googleName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.googleEmail = m_googleEmail.empty() ? nullptr : m_googleEmail.data(); + this->m_model.googleGender = m_googleGender.empty() ? nullptr : m_googleGender.data(); + this->m_model.googleId = m_googleId.empty() ? nullptr : m_googleId.data(); + this->m_model.googleLocale = m_googleLocale.empty() ? nullptr : m_googleLocale.data(); + this->m_model.googleName = m_googleName.empty() ? nullptr : m_googleName.data(); + } + + String m_googleEmail; + String m_googleGender; + String m_googleId; + String m_googleLocale; + String m_googleName; +}; + +template class Alloc = std::allocator> +class PFUserGooglePlayGamesInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserGooglePlayGamesInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserGooglePlayGamesInfoWrapper() = default; + + PFUserGooglePlayGamesInfoWrapper(const PFUserGooglePlayGamesInfo& model) : + ModelWrapper{ model }, + m_googlePlayGamesPlayerAvatarImageUrl{ SafeString(model.googlePlayGamesPlayerAvatarImageUrl) }, + m_googlePlayGamesPlayerDisplayName{ SafeString(model.googlePlayGamesPlayerDisplayName) }, + m_googlePlayGamesPlayerId{ SafeString(model.googlePlayGamesPlayerId) } + { + SetModelPointers(); + } + + PFUserGooglePlayGamesInfoWrapper(const PFUserGooglePlayGamesInfoWrapper& src) : + PFUserGooglePlayGamesInfoWrapper{ src.Model() } + { + } + + PFUserGooglePlayGamesInfoWrapper(PFUserGooglePlayGamesInfoWrapper&& src) : + PFUserGooglePlayGamesInfoWrapper{} + { + swap(*this, src); + } + + PFUserGooglePlayGamesInfoWrapper& operator=(PFUserGooglePlayGamesInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserGooglePlayGamesInfoWrapper() = default; + + friend void swap(PFUserGooglePlayGamesInfoWrapper& lhs, PFUserGooglePlayGamesInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_googlePlayGamesPlayerAvatarImageUrl, rhs.m_googlePlayGamesPlayerAvatarImageUrl); + swap(lhs.m_googlePlayGamesPlayerDisplayName, rhs.m_googlePlayGamesPlayerDisplayName); + swap(lhs.m_googlePlayGamesPlayerId, rhs.m_googlePlayGamesPlayerId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGooglePlayGamesPlayerAvatarImageUrl(String value) + { + m_googlePlayGamesPlayerAvatarImageUrl = std::move(value); + this->m_model.googlePlayGamesPlayerAvatarImageUrl = m_googlePlayGamesPlayerAvatarImageUrl.empty() ? nullptr : m_googlePlayGamesPlayerAvatarImageUrl.data(); + } + + void SetGooglePlayGamesPlayerDisplayName(String value) + { + m_googlePlayGamesPlayerDisplayName = std::move(value); + this->m_model.googlePlayGamesPlayerDisplayName = m_googlePlayGamesPlayerDisplayName.empty() ? nullptr : m_googlePlayGamesPlayerDisplayName.data(); + } + + void SetGooglePlayGamesPlayerId(String value) + { + m_googlePlayGamesPlayerId = std::move(value); + this->m_model.googlePlayGamesPlayerId = m_googlePlayGamesPlayerId.empty() ? nullptr : m_googlePlayGamesPlayerId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.googlePlayGamesPlayerAvatarImageUrl = m_googlePlayGamesPlayerAvatarImageUrl.empty() ? nullptr : m_googlePlayGamesPlayerAvatarImageUrl.data(); + this->m_model.googlePlayGamesPlayerDisplayName = m_googlePlayGamesPlayerDisplayName.empty() ? nullptr : m_googlePlayGamesPlayerDisplayName.data(); + this->m_model.googlePlayGamesPlayerId = m_googlePlayGamesPlayerId.empty() ? nullptr : m_googlePlayGamesPlayerId.data(); + } + + String m_googlePlayGamesPlayerAvatarImageUrl; + String m_googlePlayGamesPlayerDisplayName; + String m_googlePlayGamesPlayerId; +}; + +template class Alloc = std::allocator> +class PFUserIosDeviceInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserIosDeviceInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserIosDeviceInfoWrapper() = default; + + PFUserIosDeviceInfoWrapper(const PFUserIosDeviceInfo& model) : + ModelWrapper{ model }, + m_iosDeviceId{ SafeString(model.iosDeviceId) } + { + SetModelPointers(); + } + + PFUserIosDeviceInfoWrapper(const PFUserIosDeviceInfoWrapper& src) : + PFUserIosDeviceInfoWrapper{ src.Model() } + { + } + + PFUserIosDeviceInfoWrapper(PFUserIosDeviceInfoWrapper&& src) : + PFUserIosDeviceInfoWrapper{} + { + swap(*this, src); + } + + PFUserIosDeviceInfoWrapper& operator=(PFUserIosDeviceInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserIosDeviceInfoWrapper() = default; + + friend void swap(PFUserIosDeviceInfoWrapper& lhs, PFUserIosDeviceInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_iosDeviceId, rhs.m_iosDeviceId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetIosDeviceId(String value) + { + m_iosDeviceId = std::move(value); + this->m_model.iosDeviceId = m_iosDeviceId.empty() ? nullptr : m_iosDeviceId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.iosDeviceId = m_iosDeviceId.empty() ? nullptr : m_iosDeviceId.data(); + } + + String m_iosDeviceId; +}; + +template class Alloc = std::allocator> +class PFUserKongregateInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserKongregateInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserKongregateInfoWrapper() = default; + + PFUserKongregateInfoWrapper(const PFUserKongregateInfo& model) : + ModelWrapper{ model }, + m_kongregateId{ SafeString(model.kongregateId) }, + m_kongregateName{ SafeString(model.kongregateName) } + { + SetModelPointers(); + } + + PFUserKongregateInfoWrapper(const PFUserKongregateInfoWrapper& src) : + PFUserKongregateInfoWrapper{ src.Model() } + { + } + + PFUserKongregateInfoWrapper(PFUserKongregateInfoWrapper&& src) : + PFUserKongregateInfoWrapper{} + { + swap(*this, src); + } + + PFUserKongregateInfoWrapper& operator=(PFUserKongregateInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserKongregateInfoWrapper() = default; + + friend void swap(PFUserKongregateInfoWrapper& lhs, PFUserKongregateInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_kongregateId, rhs.m_kongregateId); + swap(lhs.m_kongregateName, rhs.m_kongregateName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKongregateId(String value) + { + m_kongregateId = std::move(value); + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + } + + void SetKongregateName(String value) + { + m_kongregateName = std::move(value); + this->m_model.kongregateName = m_kongregateName.empty() ? nullptr : m_kongregateName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + this->m_model.kongregateName = m_kongregateName.empty() ? nullptr : m_kongregateName.data(); + } + + String m_kongregateId; + String m_kongregateName; +}; + +template class Alloc = std::allocator> +class PFUserNintendoSwitchAccountIdInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserNintendoSwitchAccountIdInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserNintendoSwitchAccountIdInfoWrapper() = default; + + PFUserNintendoSwitchAccountIdInfoWrapper(const PFUserNintendoSwitchAccountIdInfo& model) : + ModelWrapper{ model }, + m_nintendoSwitchAccountSubjectId{ SafeString(model.nintendoSwitchAccountSubjectId) } + { + SetModelPointers(); + } + + PFUserNintendoSwitchAccountIdInfoWrapper(const PFUserNintendoSwitchAccountIdInfoWrapper& src) : + PFUserNintendoSwitchAccountIdInfoWrapper{ src.Model() } + { + } + + PFUserNintendoSwitchAccountIdInfoWrapper(PFUserNintendoSwitchAccountIdInfoWrapper&& src) : + PFUserNintendoSwitchAccountIdInfoWrapper{} + { + swap(*this, src); + } + + PFUserNintendoSwitchAccountIdInfoWrapper& operator=(PFUserNintendoSwitchAccountIdInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserNintendoSwitchAccountIdInfoWrapper() = default; + + friend void swap(PFUserNintendoSwitchAccountIdInfoWrapper& lhs, PFUserNintendoSwitchAccountIdInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_nintendoSwitchAccountSubjectId, rhs.m_nintendoSwitchAccountSubjectId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNintendoSwitchAccountSubjectId(String value) + { + m_nintendoSwitchAccountSubjectId = std::move(value); + this->m_model.nintendoSwitchAccountSubjectId = m_nintendoSwitchAccountSubjectId.empty() ? nullptr : m_nintendoSwitchAccountSubjectId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.nintendoSwitchAccountSubjectId = m_nintendoSwitchAccountSubjectId.empty() ? nullptr : m_nintendoSwitchAccountSubjectId.data(); + } + + String m_nintendoSwitchAccountSubjectId; +}; + +template class Alloc = std::allocator> +class PFUserNintendoSwitchDeviceIdInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserNintendoSwitchDeviceIdInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserNintendoSwitchDeviceIdInfoWrapper() = default; + + PFUserNintendoSwitchDeviceIdInfoWrapper(const PFUserNintendoSwitchDeviceIdInfo& model) : + ModelWrapper{ model }, + m_nintendoSwitchDeviceId{ SafeString(model.nintendoSwitchDeviceId) } + { + SetModelPointers(); + } + + PFUserNintendoSwitchDeviceIdInfoWrapper(const PFUserNintendoSwitchDeviceIdInfoWrapper& src) : + PFUserNintendoSwitchDeviceIdInfoWrapper{ src.Model() } + { + } + + PFUserNintendoSwitchDeviceIdInfoWrapper(PFUserNintendoSwitchDeviceIdInfoWrapper&& src) : + PFUserNintendoSwitchDeviceIdInfoWrapper{} + { + swap(*this, src); + } + + PFUserNintendoSwitchDeviceIdInfoWrapper& operator=(PFUserNintendoSwitchDeviceIdInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserNintendoSwitchDeviceIdInfoWrapper() = default; + + friend void swap(PFUserNintendoSwitchDeviceIdInfoWrapper& lhs, PFUserNintendoSwitchDeviceIdInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_nintendoSwitchDeviceId, rhs.m_nintendoSwitchDeviceId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNintendoSwitchDeviceId(String value) + { + m_nintendoSwitchDeviceId = std::move(value); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + + String m_nintendoSwitchDeviceId; +}; + +template class Alloc = std::allocator> +class PFUserOpenIdInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserOpenIdInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserOpenIdInfoWrapper() = default; + + PFUserOpenIdInfoWrapper(const PFUserOpenIdInfo& model) : + ModelWrapper{ model }, + m_connectionId{ SafeString(model.connectionId) }, + m_issuer{ SafeString(model.issuer) }, + m_subject{ SafeString(model.subject) } + { + SetModelPointers(); + } + + PFUserOpenIdInfoWrapper(const PFUserOpenIdInfoWrapper& src) : + PFUserOpenIdInfoWrapper{ src.Model() } + { + } + + PFUserOpenIdInfoWrapper(PFUserOpenIdInfoWrapper&& src) : + PFUserOpenIdInfoWrapper{} + { + swap(*this, src); + } + + PFUserOpenIdInfoWrapper& operator=(PFUserOpenIdInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserOpenIdInfoWrapper() = default; + + friend void swap(PFUserOpenIdInfoWrapper& lhs, PFUserOpenIdInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_connectionId, rhs.m_connectionId); + swap(lhs.m_issuer, rhs.m_issuer); + swap(lhs.m_subject, rhs.m_subject); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConnectionId(String value) + { + m_connectionId = std::move(value); + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + } + + void SetIssuer(String value) + { + m_issuer = std::move(value); + this->m_model.issuer = m_issuer.empty() ? nullptr : m_issuer.data(); + } + + void SetSubject(String value) + { + m_subject = std::move(value); + this->m_model.subject = m_subject.empty() ? nullptr : m_subject.data(); + } + +private: + void SetModelPointers() + { + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + this->m_model.issuer = m_issuer.empty() ? nullptr : m_issuer.data(); + this->m_model.subject = m_subject.empty() ? nullptr : m_subject.data(); + } + + String m_connectionId; + String m_issuer; + String m_subject; +}; + +template class Alloc = std::allocator> +class PFUserPrivateAccountInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserPrivateAccountInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserPrivateAccountInfoWrapper() = default; + + PFUserPrivateAccountInfoWrapper(const PFUserPrivateAccountInfo& model) : + ModelWrapper{ model }, + m_email{ SafeString(model.email) } + { + SetModelPointers(); + } + + PFUserPrivateAccountInfoWrapper(const PFUserPrivateAccountInfoWrapper& src) : + PFUserPrivateAccountInfoWrapper{ src.Model() } + { + } + + PFUserPrivateAccountInfoWrapper(PFUserPrivateAccountInfoWrapper&& src) : + PFUserPrivateAccountInfoWrapper{} + { + swap(*this, src); + } + + PFUserPrivateAccountInfoWrapper& operator=(PFUserPrivateAccountInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserPrivateAccountInfoWrapper() = default; + + friend void swap(PFUserPrivateAccountInfoWrapper& lhs, PFUserPrivateAccountInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_email, rhs.m_email); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + +private: + void SetModelPointers() + { + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + String m_email; +}; + +template class Alloc = std::allocator> +class PFUserPsnInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserPsnInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserPsnInfoWrapper() = default; + + PFUserPsnInfoWrapper(const PFUserPsnInfo& model) : + ModelWrapper{ model }, + m_psnAccountId{ SafeString(model.psnAccountId) }, + m_psnOnlineId{ SafeString(model.psnOnlineId) } + { + SetModelPointers(); + } + + PFUserPsnInfoWrapper(const PFUserPsnInfoWrapper& src) : + PFUserPsnInfoWrapper{ src.Model() } + { + } + + PFUserPsnInfoWrapper(PFUserPsnInfoWrapper&& src) : + PFUserPsnInfoWrapper{} + { + swap(*this, src); + } + + PFUserPsnInfoWrapper& operator=(PFUserPsnInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserPsnInfoWrapper() = default; + + friend void swap(PFUserPsnInfoWrapper& lhs, PFUserPsnInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_psnAccountId, rhs.m_psnAccountId); + swap(lhs.m_psnOnlineId, rhs.m_psnOnlineId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPsnAccountId(String value) + { + m_psnAccountId = std::move(value); + this->m_model.psnAccountId = m_psnAccountId.empty() ? nullptr : m_psnAccountId.data(); + } + + void SetPsnOnlineId(String value) + { + m_psnOnlineId = std::move(value); + this->m_model.psnOnlineId = m_psnOnlineId.empty() ? nullptr : m_psnOnlineId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.psnAccountId = m_psnAccountId.empty() ? nullptr : m_psnAccountId.data(); + this->m_model.psnOnlineId = m_psnOnlineId.empty() ? nullptr : m_psnOnlineId.data(); + } + + String m_psnAccountId; + String m_psnOnlineId; +}; + +template class Alloc = std::allocator> +class PFUserSteamInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserSteamInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserSteamInfoWrapper() = default; + + PFUserSteamInfoWrapper(const PFUserSteamInfo& model) : + ModelWrapper{ model }, + m_steamActivationStatus{ model.steamActivationStatus ? std::optional{ *model.steamActivationStatus } : std::nullopt }, + m_steamCountry{ SafeString(model.steamCountry) }, + m_steamCurrency{ model.steamCurrency ? std::optional{ *model.steamCurrency } : std::nullopt }, + m_steamId{ SafeString(model.steamId) }, + m_steamName{ SafeString(model.steamName) } + { + SetModelPointers(); + } + + PFUserSteamInfoWrapper(const PFUserSteamInfoWrapper& src) : + PFUserSteamInfoWrapper{ src.Model() } + { + } + + PFUserSteamInfoWrapper(PFUserSteamInfoWrapper&& src) : + PFUserSteamInfoWrapper{} + { + swap(*this, src); + } + + PFUserSteamInfoWrapper& operator=(PFUserSteamInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserSteamInfoWrapper() = default; + + friend void swap(PFUserSteamInfoWrapper& lhs, PFUserSteamInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_steamActivationStatus, rhs.m_steamActivationStatus); + swap(lhs.m_steamCountry, rhs.m_steamCountry); + swap(lhs.m_steamCurrency, rhs.m_steamCurrency); + swap(lhs.m_steamId, rhs.m_steamId); + swap(lhs.m_steamName, rhs.m_steamName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetSteamActivationStatus(std::optional value) + { + m_steamActivationStatus = std::move(value); + this->m_model.steamActivationStatus = m_steamActivationStatus ? m_steamActivationStatus.operator->() : nullptr; + } + + void SetSteamCountry(String value) + { + m_steamCountry = std::move(value); + this->m_model.steamCountry = m_steamCountry.empty() ? nullptr : m_steamCountry.data(); + } + + void SetSteamCurrency(std::optional value) + { + m_steamCurrency = std::move(value); + this->m_model.steamCurrency = m_steamCurrency ? m_steamCurrency.operator->() : nullptr; + } + + void SetSteamId(String value) + { + m_steamId = std::move(value); + this->m_model.steamId = m_steamId.empty() ? nullptr : m_steamId.data(); + } + + void SetSteamName(String value) + { + m_steamName = std::move(value); + this->m_model.steamName = m_steamName.empty() ? nullptr : m_steamName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.steamActivationStatus = m_steamActivationStatus ? m_steamActivationStatus.operator->() : nullptr; + this->m_model.steamCountry = m_steamCountry.empty() ? nullptr : m_steamCountry.data(); + this->m_model.steamCurrency = m_steamCurrency ? m_steamCurrency.operator->() : nullptr; + this->m_model.steamId = m_steamId.empty() ? nullptr : m_steamId.data(); + this->m_model.steamName = m_steamName.empty() ? nullptr : m_steamName.data(); + } + + std::optional m_steamActivationStatus; + String m_steamCountry; + std::optional m_steamCurrency; + String m_steamId; + String m_steamName; +}; + +template class Alloc = std::allocator> +class PFEntityKeyWrapper : public ModelWrapper +{ +public: + using ModelType = PFEntityKey; + using DictionaryEntryType = PFEntityKeyDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEntityKeyWrapper() = default; + + PFEntityKeyWrapper(const PFEntityKey& model) : + ModelWrapper{ model }, + m_id{ SafeString(model.id) }, + m_type{ SafeString(model.type) } + { + SetModelPointers(); + } + + PFEntityKeyWrapper(const PFEntityKeyWrapper& src) : + PFEntityKeyWrapper{ src.Model() } + { + } + + PFEntityKeyWrapper(PFEntityKeyWrapper&& src) : + PFEntityKeyWrapper{} + { + swap(*this, src); + } + + PFEntityKeyWrapper& operator=(PFEntityKeyWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEntityKeyWrapper() = default; + + friend void swap(PFEntityKeyWrapper& lhs, PFEntityKeyWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_type, rhs.m_type); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + +private: + void SetModelPointers() + { + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + String m_id; + String m_type; +}; + +template class Alloc = std::allocator> +class PFUserTitleInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserTitleInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserTitleInfoWrapper() = default; + + PFUserTitleInfoWrapper(const PFUserTitleInfo& model) : + ModelWrapper{ model }, + m_avatarUrl{ SafeString(model.avatarUrl) }, + m_displayName{ SafeString(model.displayName) }, + m_firstLogin{ model.firstLogin ? std::optional{ *model.firstLogin } : std::nullopt }, + m_isBanned{ model.isBanned ? std::optional{ *model.isBanned } : std::nullopt }, + m_lastLogin{ model.lastLogin ? std::optional{ *model.lastLogin } : std::nullopt }, + m_origination{ model.origination ? std::optional{ *model.origination } : std::nullopt }, + m_titlePlayerAccount{ model.titlePlayerAccount ? std::optional>{ *model.titlePlayerAccount } : std::nullopt } + { + SetModelPointers(); + } + + PFUserTitleInfoWrapper(const PFUserTitleInfoWrapper& src) : + PFUserTitleInfoWrapper{ src.Model() } + { + } + + PFUserTitleInfoWrapper(PFUserTitleInfoWrapper&& src) : + PFUserTitleInfoWrapper{} + { + swap(*this, src); + } + + PFUserTitleInfoWrapper& operator=(PFUserTitleInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserTitleInfoWrapper() = default; + + friend void swap(PFUserTitleInfoWrapper& lhs, PFUserTitleInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_avatarUrl, rhs.m_avatarUrl); + swap(lhs.m_displayName, rhs.m_displayName); + swap(lhs.m_firstLogin, rhs.m_firstLogin); + swap(lhs.m_isBanned, rhs.m_isBanned); + swap(lhs.m_lastLogin, rhs.m_lastLogin); + swap(lhs.m_origination, rhs.m_origination); + swap(lhs.m_titlePlayerAccount, rhs.m_titlePlayerAccount); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAvatarUrl(String value) + { + m_avatarUrl = std::move(value); + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + } + + void SetCreated(time_t value) + { + this->m_model.created = value; + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + void SetFirstLogin(std::optional value) + { + m_firstLogin = std::move(value); + this->m_model.firstLogin = m_firstLogin ? m_firstLogin.operator->() : nullptr; + } + + void SetisBanned(std::optional value) + { + m_isBanned = std::move(value); + this->m_model.isBanned = m_isBanned ? m_isBanned.operator->() : nullptr; + } + + void SetLastLogin(std::optional value) + { + m_lastLogin = std::move(value); + this->m_model.lastLogin = m_lastLogin ? m_lastLogin.operator->() : nullptr; + } + + void SetOrigination(std::optional value) + { + m_origination = std::move(value); + this->m_model.origination = m_origination ? m_origination.operator->() : nullptr; + } + + void SetTitlePlayerAccount(std::optional> value) + { + m_titlePlayerAccount = std::move(value); + this->m_model.titlePlayerAccount = m_titlePlayerAccount ? &m_titlePlayerAccount->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + this->m_model.firstLogin = m_firstLogin ? m_firstLogin.operator->() : nullptr; + this->m_model.isBanned = m_isBanned ? m_isBanned.operator->() : nullptr; + this->m_model.lastLogin = m_lastLogin ? m_lastLogin.operator->() : nullptr; + this->m_model.origination = m_origination ? m_origination.operator->() : nullptr; + this->m_model.titlePlayerAccount = m_titlePlayerAccount ? &m_titlePlayerAccount->Model() : nullptr; + } + + String m_avatarUrl; + String m_displayName; + std::optional m_firstLogin; + std::optional m_isBanned; + std::optional m_lastLogin; + std::optional m_origination; + std::optional> m_titlePlayerAccount; +}; + +template class Alloc = std::allocator> +class PFUserTwitchInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserTwitchInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserTwitchInfoWrapper() = default; + + PFUserTwitchInfoWrapper(const PFUserTwitchInfo& model) : + ModelWrapper{ model }, + m_twitchId{ SafeString(model.twitchId) }, + m_twitchUserName{ SafeString(model.twitchUserName) } + { + SetModelPointers(); + } + + PFUserTwitchInfoWrapper(const PFUserTwitchInfoWrapper& src) : + PFUserTwitchInfoWrapper{ src.Model() } + { + } + + PFUserTwitchInfoWrapper(PFUserTwitchInfoWrapper&& src) : + PFUserTwitchInfoWrapper{} + { + swap(*this, src); + } + + PFUserTwitchInfoWrapper& operator=(PFUserTwitchInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserTwitchInfoWrapper() = default; + + friend void swap(PFUserTwitchInfoWrapper& lhs, PFUserTwitchInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_twitchId, rhs.m_twitchId); + swap(lhs.m_twitchUserName, rhs.m_twitchUserName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTwitchId(String value) + { + m_twitchId = std::move(value); + this->m_model.twitchId = m_twitchId.empty() ? nullptr : m_twitchId.data(); + } + + void SetTwitchUserName(String value) + { + m_twitchUserName = std::move(value); + this->m_model.twitchUserName = m_twitchUserName.empty() ? nullptr : m_twitchUserName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.twitchId = m_twitchId.empty() ? nullptr : m_twitchId.data(); + this->m_model.twitchUserName = m_twitchUserName.empty() ? nullptr : m_twitchUserName.data(); + } + + String m_twitchId; + String m_twitchUserName; +}; + +template class Alloc = std::allocator> +class PFUserXboxInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserXboxInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserXboxInfoWrapper() = default; + + PFUserXboxInfoWrapper(const PFUserXboxInfo& model) : + ModelWrapper{ model }, + m_xboxUserId{ SafeString(model.xboxUserId) }, + m_xboxUserSandbox{ SafeString(model.xboxUserSandbox) } + { + SetModelPointers(); + } + + PFUserXboxInfoWrapper(const PFUserXboxInfoWrapper& src) : + PFUserXboxInfoWrapper{ src.Model() } + { + } + + PFUserXboxInfoWrapper(PFUserXboxInfoWrapper&& src) : + PFUserXboxInfoWrapper{} + { + swap(*this, src); + } + + PFUserXboxInfoWrapper& operator=(PFUserXboxInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserXboxInfoWrapper() = default; + + friend void swap(PFUserXboxInfoWrapper& lhs, PFUserXboxInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_xboxUserId, rhs.m_xboxUserId); + swap(lhs.m_xboxUserSandbox, rhs.m_xboxUserSandbox); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetXboxUserId(String value) + { + m_xboxUserId = std::move(value); + this->m_model.xboxUserId = m_xboxUserId.empty() ? nullptr : m_xboxUserId.data(); + } + + void SetXboxUserSandbox(String value) + { + m_xboxUserSandbox = std::move(value); + this->m_model.xboxUserSandbox = m_xboxUserSandbox.empty() ? nullptr : m_xboxUserSandbox.data(); + } + +private: + void SetModelPointers() + { + this->m_model.xboxUserId = m_xboxUserId.empty() ? nullptr : m_xboxUserId.data(); + this->m_model.xboxUserSandbox = m_xboxUserSandbox.empty() ? nullptr : m_xboxUserSandbox.data(); + } + + String m_xboxUserId; + String m_xboxUserSandbox; +}; + +template class Alloc = std::allocator> +class PFUserAccountInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserAccountInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserAccountInfoWrapper() = default; + + PFUserAccountInfoWrapper(const PFUserAccountInfo& model) : + ModelWrapper{ model }, + m_androidDeviceInfo{ model.androidDeviceInfo ? std::optional>{ *model.androidDeviceInfo } : std::nullopt }, + m_appleAccountInfo{ model.appleAccountInfo ? std::optional>{ *model.appleAccountInfo } : std::nullopt }, + m_customIdInfo{ model.customIdInfo ? std::optional>{ *model.customIdInfo } : std::nullopt }, + m_facebookInfo{ model.facebookInfo ? std::optional>{ *model.facebookInfo } : std::nullopt }, + m_facebookInstantGamesIdInfo{ model.facebookInstantGamesIdInfo ? std::optional>{ *model.facebookInstantGamesIdInfo } : std::nullopt }, + m_gameCenterInfo{ model.gameCenterInfo ? std::optional>{ *model.gameCenterInfo } : std::nullopt }, + m_googleInfo{ model.googleInfo ? std::optional>{ *model.googleInfo } : std::nullopt }, + m_googlePlayGamesInfo{ model.googlePlayGamesInfo ? std::optional>{ *model.googlePlayGamesInfo } : std::nullopt }, + m_iosDeviceInfo{ model.iosDeviceInfo ? std::optional>{ *model.iosDeviceInfo } : std::nullopt }, + m_kongregateInfo{ model.kongregateInfo ? std::optional>{ *model.kongregateInfo } : std::nullopt }, + m_nintendoSwitchAccountInfo{ model.nintendoSwitchAccountInfo ? std::optional>{ *model.nintendoSwitchAccountInfo } : std::nullopt }, + m_nintendoSwitchDeviceIdInfo{ model.nintendoSwitchDeviceIdInfo ? std::optional>{ *model.nintendoSwitchDeviceIdInfo } : std::nullopt }, + m_openIdInfo{ model.openIdInfo, model.openIdInfo + model.openIdInfoCount }, + m_playFabId{ SafeString(model.playFabId) }, + m_privateInfo{ model.privateInfo ? std::optional>{ *model.privateInfo } : std::nullopt }, + m_psnInfo{ model.psnInfo ? std::optional>{ *model.psnInfo } : std::nullopt }, + m_steamInfo{ model.steamInfo ? std::optional>{ *model.steamInfo } : std::nullopt }, + m_titleInfo{ model.titleInfo ? std::optional>{ *model.titleInfo } : std::nullopt }, + m_twitchInfo{ model.twitchInfo ? std::optional>{ *model.twitchInfo } : std::nullopt }, + m_username{ SafeString(model.username) }, + m_xboxInfo{ model.xboxInfo ? std::optional>{ *model.xboxInfo } : std::nullopt } + { + SetModelPointers(); + } + + PFUserAccountInfoWrapper(const PFUserAccountInfoWrapper& src) : + PFUserAccountInfoWrapper{ src.Model() } + { + } + + PFUserAccountInfoWrapper(PFUserAccountInfoWrapper&& src) : + PFUserAccountInfoWrapper{} + { + swap(*this, src); + } + + PFUserAccountInfoWrapper& operator=(PFUserAccountInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserAccountInfoWrapper() = default; + + friend void swap(PFUserAccountInfoWrapper& lhs, PFUserAccountInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_androidDeviceInfo, rhs.m_androidDeviceInfo); + swap(lhs.m_appleAccountInfo, rhs.m_appleAccountInfo); + swap(lhs.m_customIdInfo, rhs.m_customIdInfo); + swap(lhs.m_facebookInfo, rhs.m_facebookInfo); + swap(lhs.m_facebookInstantGamesIdInfo, rhs.m_facebookInstantGamesIdInfo); + swap(lhs.m_gameCenterInfo, rhs.m_gameCenterInfo); + swap(lhs.m_googleInfo, rhs.m_googleInfo); + swap(lhs.m_googlePlayGamesInfo, rhs.m_googlePlayGamesInfo); + swap(lhs.m_iosDeviceInfo, rhs.m_iosDeviceInfo); + swap(lhs.m_kongregateInfo, rhs.m_kongregateInfo); + swap(lhs.m_nintendoSwitchAccountInfo, rhs.m_nintendoSwitchAccountInfo); + swap(lhs.m_nintendoSwitchDeviceIdInfo, rhs.m_nintendoSwitchDeviceIdInfo); + swap(lhs.m_openIdInfo, rhs.m_openIdInfo); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_privateInfo, rhs.m_privateInfo); + swap(lhs.m_psnInfo, rhs.m_psnInfo); + swap(lhs.m_steamInfo, rhs.m_steamInfo); + swap(lhs.m_titleInfo, rhs.m_titleInfo); + swap(lhs.m_twitchInfo, rhs.m_twitchInfo); + swap(lhs.m_username, rhs.m_username); + swap(lhs.m_xboxInfo, rhs.m_xboxInfo); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAndroidDeviceInfo(std::optional> value) + { + m_androidDeviceInfo = std::move(value); + this->m_model.androidDeviceInfo = m_androidDeviceInfo ? &m_androidDeviceInfo->Model() : nullptr; + } + + void SetAppleAccountInfo(std::optional> value) + { + m_appleAccountInfo = std::move(value); + this->m_model.appleAccountInfo = m_appleAccountInfo ? &m_appleAccountInfo->Model() : nullptr; + } + + void SetCreated(time_t value) + { + this->m_model.created = value; + } + + void SetCustomIdInfo(std::optional> value) + { + m_customIdInfo = std::move(value); + this->m_model.customIdInfo = m_customIdInfo ? &m_customIdInfo->Model() : nullptr; + } + + void SetFacebookInfo(std::optional> value) + { + m_facebookInfo = std::move(value); + this->m_model.facebookInfo = m_facebookInfo ? &m_facebookInfo->Model() : nullptr; + } + + void SetFacebookInstantGamesIdInfo(std::optional> value) + { + m_facebookInstantGamesIdInfo = std::move(value); + this->m_model.facebookInstantGamesIdInfo = m_facebookInstantGamesIdInfo ? &m_facebookInstantGamesIdInfo->Model() : nullptr; + } + + void SetGameCenterInfo(std::optional> value) + { + m_gameCenterInfo = std::move(value); + this->m_model.gameCenterInfo = m_gameCenterInfo ? &m_gameCenterInfo->Model() : nullptr; + } + + void SetGoogleInfo(std::optional> value) + { + m_googleInfo = std::move(value); + this->m_model.googleInfo = m_googleInfo ? &m_googleInfo->Model() : nullptr; + } + + void SetGooglePlayGamesInfo(std::optional> value) + { + m_googlePlayGamesInfo = std::move(value); + this->m_model.googlePlayGamesInfo = m_googlePlayGamesInfo ? &m_googlePlayGamesInfo->Model() : nullptr; + } + + void SetIosDeviceInfo(std::optional> value) + { + m_iosDeviceInfo = std::move(value); + this->m_model.iosDeviceInfo = m_iosDeviceInfo ? &m_iosDeviceInfo->Model() : nullptr; + } + + void SetKongregateInfo(std::optional> value) + { + m_kongregateInfo = std::move(value); + this->m_model.kongregateInfo = m_kongregateInfo ? &m_kongregateInfo->Model() : nullptr; + } + + void SetNintendoSwitchAccountInfo(std::optional> value) + { + m_nintendoSwitchAccountInfo = std::move(value); + this->m_model.nintendoSwitchAccountInfo = m_nintendoSwitchAccountInfo ? &m_nintendoSwitchAccountInfo->Model() : nullptr; + } + + void SetNintendoSwitchDeviceIdInfo(std::optional> value) + { + m_nintendoSwitchDeviceIdInfo = std::move(value); + this->m_model.nintendoSwitchDeviceIdInfo = m_nintendoSwitchDeviceIdInfo ? &m_nintendoSwitchDeviceIdInfo->Model() : nullptr; + } + + void SetOpenIdInfo(ModelVector, Alloc> value) + { + m_openIdInfo = std::move(value); + this->m_model.openIdInfo = m_openIdInfo.empty() ? nullptr : m_openIdInfo.data(); + this->m_model.openIdInfoCount = static_cast(m_openIdInfo.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetPrivateInfo(std::optional> value) + { + m_privateInfo = std::move(value); + this->m_model.privateInfo = m_privateInfo ? &m_privateInfo->Model() : nullptr; + } + + void SetPsnInfo(std::optional> value) + { + m_psnInfo = std::move(value); + this->m_model.psnInfo = m_psnInfo ? &m_psnInfo->Model() : nullptr; + } + + void SetSteamInfo(std::optional> value) + { + m_steamInfo = std::move(value); + this->m_model.steamInfo = m_steamInfo ? &m_steamInfo->Model() : nullptr; + } + + void SetTitleInfo(std::optional> value) + { + m_titleInfo = std::move(value); + this->m_model.titleInfo = m_titleInfo ? &m_titleInfo->Model() : nullptr; + } + + void SetTwitchInfo(std::optional> value) + { + m_twitchInfo = std::move(value); + this->m_model.twitchInfo = m_twitchInfo ? &m_twitchInfo->Model() : nullptr; + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + void SetXboxInfo(std::optional> value) + { + m_xboxInfo = std::move(value); + this->m_model.xboxInfo = m_xboxInfo ? &m_xboxInfo->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.androidDeviceInfo = m_androidDeviceInfo ? &m_androidDeviceInfo->Model() : nullptr; + this->m_model.appleAccountInfo = m_appleAccountInfo ? &m_appleAccountInfo->Model() : nullptr; + this->m_model.customIdInfo = m_customIdInfo ? &m_customIdInfo->Model() : nullptr; + this->m_model.facebookInfo = m_facebookInfo ? &m_facebookInfo->Model() : nullptr; + this->m_model.facebookInstantGamesIdInfo = m_facebookInstantGamesIdInfo ? &m_facebookInstantGamesIdInfo->Model() : nullptr; + this->m_model.gameCenterInfo = m_gameCenterInfo ? &m_gameCenterInfo->Model() : nullptr; + this->m_model.googleInfo = m_googleInfo ? &m_googleInfo->Model() : nullptr; + this->m_model.googlePlayGamesInfo = m_googlePlayGamesInfo ? &m_googlePlayGamesInfo->Model() : nullptr; + this->m_model.iosDeviceInfo = m_iosDeviceInfo ? &m_iosDeviceInfo->Model() : nullptr; + this->m_model.kongregateInfo = m_kongregateInfo ? &m_kongregateInfo->Model() : nullptr; + this->m_model.nintendoSwitchAccountInfo = m_nintendoSwitchAccountInfo ? &m_nintendoSwitchAccountInfo->Model() : nullptr; + this->m_model.nintendoSwitchDeviceIdInfo = m_nintendoSwitchDeviceIdInfo ? &m_nintendoSwitchDeviceIdInfo->Model() : nullptr; + this->m_model.openIdInfo = m_openIdInfo.empty() ? nullptr : m_openIdInfo.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.privateInfo = m_privateInfo ? &m_privateInfo->Model() : nullptr; + this->m_model.psnInfo = m_psnInfo ? &m_psnInfo->Model() : nullptr; + this->m_model.steamInfo = m_steamInfo ? &m_steamInfo->Model() : nullptr; + this->m_model.titleInfo = m_titleInfo ? &m_titleInfo->Model() : nullptr; + this->m_model.twitchInfo = m_twitchInfo ? &m_twitchInfo->Model() : nullptr; + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + this->m_model.xboxInfo = m_xboxInfo ? &m_xboxInfo->Model() : nullptr; + } + + std::optional> m_androidDeviceInfo; + std::optional> m_appleAccountInfo; + std::optional> m_customIdInfo; + std::optional> m_facebookInfo; + std::optional> m_facebookInstantGamesIdInfo; + std::optional> m_gameCenterInfo; + std::optional> m_googleInfo; + std::optional> m_googlePlayGamesInfo; + std::optional> m_iosDeviceInfo; + std::optional> m_kongregateInfo; + std::optional> m_nintendoSwitchAccountInfo; + std::optional> m_nintendoSwitchDeviceIdInfo; + ModelVector, Alloc> m_openIdInfo; + String m_playFabId; + std::optional> m_privateInfo; + std::optional> m_psnInfo; + std::optional> m_steamInfo; + std::optional> m_titleInfo; + std::optional> m_twitchInfo; + String m_username; + std::optional> m_xboxInfo; +}; + +template class Alloc = std::allocator> +class PFItemInstanceWrapper : public ModelWrapper +{ +public: + using ModelType = PFItemInstance; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFItemInstanceWrapper() = default; + + PFItemInstanceWrapper(const PFItemInstance& model) : + ModelWrapper{ model }, + m_annotation{ SafeString(model.annotation) }, + m_bundleContents{ model.bundleContents, model.bundleContents + model.bundleContentsCount }, + m_bundleParent{ SafeString(model.bundleParent) }, + m_catalogVersion{ SafeString(model.catalogVersion) }, + m_customData{ model.customData, model.customData + model.customDataCount }, + m_displayName{ SafeString(model.displayName) }, + m_expiration{ model.expiration ? std::optional{ *model.expiration } : std::nullopt }, + m_itemClass{ SafeString(model.itemClass) }, + m_itemId{ SafeString(model.itemId) }, + m_itemInstanceId{ SafeString(model.itemInstanceId) }, + m_purchaseDate{ model.purchaseDate ? std::optional{ *model.purchaseDate } : std::nullopt }, + m_remainingUses{ model.remainingUses ? std::optional{ *model.remainingUses } : std::nullopt }, + m_unitCurrency{ SafeString(model.unitCurrency) }, + m_usesIncrementedBy{ model.usesIncrementedBy ? std::optional{ *model.usesIncrementedBy } : std::nullopt } + { + SetModelPointers(); + } + + PFItemInstanceWrapper(const PFItemInstanceWrapper& src) : + PFItemInstanceWrapper{ src.Model() } + { + } + + PFItemInstanceWrapper(PFItemInstanceWrapper&& src) : + PFItemInstanceWrapper{} + { + swap(*this, src); + } + + PFItemInstanceWrapper& operator=(PFItemInstanceWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFItemInstanceWrapper() = default; + + friend void swap(PFItemInstanceWrapper& lhs, PFItemInstanceWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_annotation, rhs.m_annotation); + swap(lhs.m_bundleContents, rhs.m_bundleContents); + swap(lhs.m_bundleParent, rhs.m_bundleParent); + swap(lhs.m_catalogVersion, rhs.m_catalogVersion); + swap(lhs.m_customData, rhs.m_customData); + swap(lhs.m_displayName, rhs.m_displayName); + swap(lhs.m_expiration, rhs.m_expiration); + swap(lhs.m_itemClass, rhs.m_itemClass); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_itemInstanceId, rhs.m_itemInstanceId); + swap(lhs.m_purchaseDate, rhs.m_purchaseDate); + swap(lhs.m_remainingUses, rhs.m_remainingUses); + swap(lhs.m_unitCurrency, rhs.m_unitCurrency); + swap(lhs.m_usesIncrementedBy, rhs.m_usesIncrementedBy); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAnnotation(String value) + { + m_annotation = std::move(value); + this->m_model.annotation = m_annotation.empty() ? nullptr : m_annotation.data(); + } + + void SetBundleContents(CStringVector value) + { + m_bundleContents = std::move(value); + this->m_model.bundleContents = m_bundleContents.empty() ? nullptr : m_bundleContents.data(); + this->m_model.bundleContentsCount = static_cast(m_bundleContents.size()); + } + + void SetBundleParent(String value) + { + m_bundleParent = std::move(value); + this->m_model.bundleParent = m_bundleParent.empty() ? nullptr : m_bundleParent.data(); + } + + void SetCatalogVersion(String value) + { + m_catalogVersion = std::move(value); + this->m_model.catalogVersion = m_catalogVersion.empty() ? nullptr : m_catalogVersion.data(); + } + + void SetCustomData(StringDictionaryEntryVector value) + { + m_customData = std::move(value); + this->m_model.customData = m_customData.empty() ? nullptr : m_customData.data(); + this->m_model.customDataCount = static_cast(m_customData.size()); + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + void SetExpiration(std::optional value) + { + m_expiration = std::move(value); + this->m_model.expiration = m_expiration ? m_expiration.operator->() : nullptr; + } + + void SetItemClass(String value) + { + m_itemClass = std::move(value); + this->m_model.itemClass = m_itemClass.empty() ? nullptr : m_itemClass.data(); + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetItemInstanceId(String value) + { + m_itemInstanceId = std::move(value); + this->m_model.itemInstanceId = m_itemInstanceId.empty() ? nullptr : m_itemInstanceId.data(); + } + + void SetPurchaseDate(std::optional value) + { + m_purchaseDate = std::move(value); + this->m_model.purchaseDate = m_purchaseDate ? m_purchaseDate.operator->() : nullptr; + } + + void SetRemainingUses(std::optional value) + { + m_remainingUses = std::move(value); + this->m_model.remainingUses = m_remainingUses ? m_remainingUses.operator->() : nullptr; + } + + void SetUnitCurrency(String value) + { + m_unitCurrency = std::move(value); + this->m_model.unitCurrency = m_unitCurrency.empty() ? nullptr : m_unitCurrency.data(); + } + + void SetUnitPrice(uint32_t value) + { + this->m_model.unitPrice = value; + } + + void SetUsesIncrementedBy(std::optional value) + { + m_usesIncrementedBy = std::move(value); + this->m_model.usesIncrementedBy = m_usesIncrementedBy ? m_usesIncrementedBy.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.annotation = m_annotation.empty() ? nullptr : m_annotation.data(); + this->m_model.bundleContents = m_bundleContents.empty() ? nullptr : m_bundleContents.data(); + this->m_model.bundleParent = m_bundleParent.empty() ? nullptr : m_bundleParent.data(); + this->m_model.catalogVersion = m_catalogVersion.empty() ? nullptr : m_catalogVersion.data(); + this->m_model.customData = m_customData.empty() ? nullptr : m_customData.data(); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + this->m_model.expiration = m_expiration ? m_expiration.operator->() : nullptr; + this->m_model.itemClass = m_itemClass.empty() ? nullptr : m_itemClass.data(); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.itemInstanceId = m_itemInstanceId.empty() ? nullptr : m_itemInstanceId.data(); + this->m_model.purchaseDate = m_purchaseDate ? m_purchaseDate.operator->() : nullptr; + this->m_model.remainingUses = m_remainingUses ? m_remainingUses.operator->() : nullptr; + this->m_model.unitCurrency = m_unitCurrency.empty() ? nullptr : m_unitCurrency.data(); + this->m_model.usesIncrementedBy = m_usesIncrementedBy ? m_usesIncrementedBy.operator->() : nullptr; + } + + String m_annotation; + CStringVector m_bundleContents; + String m_bundleParent; + String m_catalogVersion; + StringDictionaryEntryVector m_customData; + String m_displayName; + std::optional m_expiration; + String m_itemClass; + String m_itemId; + String m_itemInstanceId; + std::optional m_purchaseDate; + std::optional m_remainingUses; + String m_unitCurrency; + std::optional m_usesIncrementedBy; +}; + +template class Alloc = std::allocator> +class PFCharacterInventoryWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterInventory; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterInventoryWrapper() = default; + + PFCharacterInventoryWrapper(const PFCharacterInventory& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_inventory{ model.inventory, model.inventory + model.inventoryCount } + { + SetModelPointers(); + } + + PFCharacterInventoryWrapper(const PFCharacterInventoryWrapper& src) : + PFCharacterInventoryWrapper{ src.Model() } + { + } + + PFCharacterInventoryWrapper(PFCharacterInventoryWrapper&& src) : + PFCharacterInventoryWrapper{} + { + swap(*this, src); + } + + PFCharacterInventoryWrapper& operator=(PFCharacterInventoryWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterInventoryWrapper() = default; + + friend void swap(PFCharacterInventoryWrapper& lhs, PFCharacterInventoryWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_inventory, rhs.m_inventory); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetInventory(ModelVector, Alloc> value) + { + m_inventory = std::move(value); + this->m_model.inventory = m_inventory.empty() ? nullptr : m_inventory.data(); + this->m_model.inventoryCount = static_cast(m_inventory.size()); + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.inventory = m_inventory.empty() ? nullptr : m_inventory.data(); + } + + String m_characterId; + ModelVector, Alloc> m_inventory; +}; + +template class Alloc = std::allocator> +class PFCharacterResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterResultWrapper() = default; + + PFCharacterResultWrapper(const PFCharacterResult& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_characterName{ SafeString(model.characterName) }, + m_characterType{ SafeString(model.characterType) } + { + SetModelPointers(); + } + + PFCharacterResultWrapper(const PFCharacterResultWrapper& src) : + PFCharacterResultWrapper{ src.Model() } + { + } + + PFCharacterResultWrapper(PFCharacterResultWrapper&& src) : + PFCharacterResultWrapper{} + { + swap(*this, src); + } + + PFCharacterResultWrapper& operator=(PFCharacterResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterResultWrapper() = default; + + friend void swap(PFCharacterResultWrapper& lhs, PFCharacterResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_characterName, rhs.m_characterName); + swap(lhs.m_characterType, rhs.m_characterType); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetCharacterName(String value) + { + m_characterName = std::move(value); + this->m_model.characterName = m_characterName.empty() ? nullptr : m_characterName.data(); + } + + void SetCharacterType(String value) + { + m_characterType = std::move(value); + this->m_model.characterType = m_characterType.empty() ? nullptr : m_characterType.data(); + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.characterName = m_characterName.empty() ? nullptr : m_characterName.data(); + this->m_model.characterType = m_characterType.empty() ? nullptr : m_characterType.data(); + } + + String m_characterId; + String m_characterName; + String m_characterType; +}; + +template class Alloc = std::allocator> +class PFAdCampaignAttributionModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFAdCampaignAttributionModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAdCampaignAttributionModelWrapper() = default; + + PFAdCampaignAttributionModelWrapper(const PFAdCampaignAttributionModel& model) : + ModelWrapper{ model }, + m_campaignId{ SafeString(model.campaignId) }, + m_platform{ SafeString(model.platform) } + { + SetModelPointers(); + } + + PFAdCampaignAttributionModelWrapper(const PFAdCampaignAttributionModelWrapper& src) : + PFAdCampaignAttributionModelWrapper{ src.Model() } + { + } + + PFAdCampaignAttributionModelWrapper(PFAdCampaignAttributionModelWrapper&& src) : + PFAdCampaignAttributionModelWrapper{} + { + swap(*this, src); + } + + PFAdCampaignAttributionModelWrapper& operator=(PFAdCampaignAttributionModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAdCampaignAttributionModelWrapper() = default; + + friend void swap(PFAdCampaignAttributionModelWrapper& lhs, PFAdCampaignAttributionModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_campaignId, rhs.m_campaignId); + swap(lhs.m_platform, rhs.m_platform); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAttributedAt(time_t value) + { + this->m_model.attributedAt = value; + } + + void SetCampaignId(String value) + { + m_campaignId = std::move(value); + this->m_model.campaignId = m_campaignId.empty() ? nullptr : m_campaignId.data(); + } + + void SetPlatform(String value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + } + +private: + void SetModelPointers() + { + this->m_model.campaignId = m_campaignId.empty() ? nullptr : m_campaignId.data(); + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + } + + String m_campaignId; + String m_platform; +}; + +template class Alloc = std::allocator> +class PFContactEmailInfoModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFContactEmailInfoModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFContactEmailInfoModelWrapper() = default; + + PFContactEmailInfoModelWrapper(const PFContactEmailInfoModel& model) : + ModelWrapper{ model }, + m_emailAddress{ SafeString(model.emailAddress) }, + m_name{ SafeString(model.name) }, + m_verificationStatus{ model.verificationStatus ? std::optional{ *model.verificationStatus } : std::nullopt } + { + SetModelPointers(); + } + + PFContactEmailInfoModelWrapper(const PFContactEmailInfoModelWrapper& src) : + PFContactEmailInfoModelWrapper{ src.Model() } + { + } + + PFContactEmailInfoModelWrapper(PFContactEmailInfoModelWrapper&& src) : + PFContactEmailInfoModelWrapper{} + { + swap(*this, src); + } + + PFContactEmailInfoModelWrapper& operator=(PFContactEmailInfoModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFContactEmailInfoModelWrapper() = default; + + friend void swap(PFContactEmailInfoModelWrapper& lhs, PFContactEmailInfoModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_emailAddress, rhs.m_emailAddress); + swap(lhs.m_name, rhs.m_name); + swap(lhs.m_verificationStatus, rhs.m_verificationStatus); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEmailAddress(String value) + { + m_emailAddress = std::move(value); + this->m_model.emailAddress = m_emailAddress.empty() ? nullptr : m_emailAddress.data(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetVerificationStatus(std::optional value) + { + m_verificationStatus = std::move(value); + this->m_model.verificationStatus = m_verificationStatus ? m_verificationStatus.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.emailAddress = m_emailAddress.empty() ? nullptr : m_emailAddress.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + this->m_model.verificationStatus = m_verificationStatus ? m_verificationStatus.operator->() : nullptr; + } + + String m_emailAddress; + String m_name; + std::optional m_verificationStatus; +}; + +template class Alloc = std::allocator> +class PFLinkedPlatformAccountModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFLinkedPlatformAccountModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFLinkedPlatformAccountModelWrapper() = default; + + PFLinkedPlatformAccountModelWrapper(const PFLinkedPlatformAccountModel& model) : + ModelWrapper{ model }, + m_email{ SafeString(model.email) }, + m_platform{ model.platform ? std::optional{ *model.platform } : std::nullopt }, + m_platformUserId{ SafeString(model.platformUserId) }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFLinkedPlatformAccountModelWrapper(const PFLinkedPlatformAccountModelWrapper& src) : + PFLinkedPlatformAccountModelWrapper{ src.Model() } + { + } + + PFLinkedPlatformAccountModelWrapper(PFLinkedPlatformAccountModelWrapper&& src) : + PFLinkedPlatformAccountModelWrapper{} + { + swap(*this, src); + } + + PFLinkedPlatformAccountModelWrapper& operator=(PFLinkedPlatformAccountModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFLinkedPlatformAccountModelWrapper() = default; + + friend void swap(PFLinkedPlatformAccountModelWrapper& lhs, PFLinkedPlatformAccountModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_platform, rhs.m_platform); + swap(lhs.m_platformUserId, rhs.m_platformUserId); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetPlatform(std::optional value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + } + + void SetPlatformUserId(String value) + { + m_platformUserId = std::move(value); + this->m_model.platformUserId = m_platformUserId.empty() ? nullptr : m_platformUserId.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + this->m_model.platformUserId = m_platformUserId.empty() ? nullptr : m_platformUserId.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + String m_email; + std::optional m_platform; + String m_platformUserId; + String m_username; +}; + +template class Alloc = std::allocator> +class PFLocationModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFLocationModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFLocationModelWrapper() = default; + + PFLocationModelWrapper(const PFLocationModel& model) : + ModelWrapper{ model }, + m_city{ SafeString(model.city) }, + m_continentCode{ model.continentCode ? std::optional{ *model.continentCode } : std::nullopt }, + m_countryCode{ model.countryCode ? std::optional{ *model.countryCode } : std::nullopt }, + m_latitude{ model.latitude ? std::optional{ *model.latitude } : std::nullopt }, + m_longitude{ model.longitude ? std::optional{ *model.longitude } : std::nullopt } + { + SetModelPointers(); + } + + PFLocationModelWrapper(const PFLocationModelWrapper& src) : + PFLocationModelWrapper{ src.Model() } + { + } + + PFLocationModelWrapper(PFLocationModelWrapper&& src) : + PFLocationModelWrapper{} + { + swap(*this, src); + } + + PFLocationModelWrapper& operator=(PFLocationModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFLocationModelWrapper() = default; + + friend void swap(PFLocationModelWrapper& lhs, PFLocationModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_city, rhs.m_city); + swap(lhs.m_continentCode, rhs.m_continentCode); + swap(lhs.m_countryCode, rhs.m_countryCode); + swap(lhs.m_latitude, rhs.m_latitude); + swap(lhs.m_longitude, rhs.m_longitude); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCity(String value) + { + m_city = std::move(value); + this->m_model.city = m_city.empty() ? nullptr : m_city.data(); + } + + void SetContinentCode(std::optional value) + { + m_continentCode = std::move(value); + this->m_model.continentCode = m_continentCode ? m_continentCode.operator->() : nullptr; + } + + void SetCountryCode(std::optional value) + { + m_countryCode = std::move(value); + this->m_model.countryCode = m_countryCode ? m_countryCode.operator->() : nullptr; + } + + void SetLatitude(std::optional value) + { + m_latitude = std::move(value); + this->m_model.latitude = m_latitude ? m_latitude.operator->() : nullptr; + } + + void SetLongitude(std::optional value) + { + m_longitude = std::move(value); + this->m_model.longitude = m_longitude ? m_longitude.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.city = m_city.empty() ? nullptr : m_city.data(); + this->m_model.continentCode = m_continentCode ? m_continentCode.operator->() : nullptr; + this->m_model.countryCode = m_countryCode ? m_countryCode.operator->() : nullptr; + this->m_model.latitude = m_latitude ? m_latitude.operator->() : nullptr; + this->m_model.longitude = m_longitude ? m_longitude.operator->() : nullptr; + } + + String m_city; + std::optional m_continentCode; + std::optional m_countryCode; + std::optional m_latitude; + std::optional m_longitude; +}; + +template class Alloc = std::allocator> +class PFSubscriptionModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFSubscriptionModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSubscriptionModelWrapper() = default; + + PFSubscriptionModelWrapper(const PFSubscriptionModel& model) : + ModelWrapper{ model }, + m_status{ model.status ? std::optional{ *model.status } : std::nullopt }, + m_subscriptionId{ SafeString(model.subscriptionId) }, + m_subscriptionItemId{ SafeString(model.subscriptionItemId) }, + m_subscriptionProvider{ SafeString(model.subscriptionProvider) } + { + SetModelPointers(); + } + + PFSubscriptionModelWrapper(const PFSubscriptionModelWrapper& src) : + PFSubscriptionModelWrapper{ src.Model() } + { + } + + PFSubscriptionModelWrapper(PFSubscriptionModelWrapper&& src) : + PFSubscriptionModelWrapper{} + { + swap(*this, src); + } + + PFSubscriptionModelWrapper& operator=(PFSubscriptionModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSubscriptionModelWrapper() = default; + + friend void swap(PFSubscriptionModelWrapper& lhs, PFSubscriptionModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_status, rhs.m_status); + swap(lhs.m_subscriptionId, rhs.m_subscriptionId); + swap(lhs.m_subscriptionItemId, rhs.m_subscriptionItemId); + swap(lhs.m_subscriptionProvider, rhs.m_subscriptionProvider); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetExpiration(time_t value) + { + this->m_model.expiration = value; + } + + void SetInitialSubscriptionTime(time_t value) + { + this->m_model.initialSubscriptionTime = value; + } + + void SetIsActive(bool value) + { + this->m_model.isActive = value; + } + + void SetStatus(std::optional value) + { + m_status = std::move(value); + this->m_model.status = m_status ? m_status.operator->() : nullptr; + } + + void SetSubscriptionId(String value) + { + m_subscriptionId = std::move(value); + this->m_model.subscriptionId = m_subscriptionId.empty() ? nullptr : m_subscriptionId.data(); + } + + void SetSubscriptionItemId(String value) + { + m_subscriptionItemId = std::move(value); + this->m_model.subscriptionItemId = m_subscriptionItemId.empty() ? nullptr : m_subscriptionItemId.data(); + } + + void SetSubscriptionProvider(String value) + { + m_subscriptionProvider = std::move(value); + this->m_model.subscriptionProvider = m_subscriptionProvider.empty() ? nullptr : m_subscriptionProvider.data(); + } + +private: + void SetModelPointers() + { + this->m_model.status = m_status ? m_status.operator->() : nullptr; + this->m_model.subscriptionId = m_subscriptionId.empty() ? nullptr : m_subscriptionId.data(); + this->m_model.subscriptionItemId = m_subscriptionItemId.empty() ? nullptr : m_subscriptionItemId.data(); + this->m_model.subscriptionProvider = m_subscriptionProvider.empty() ? nullptr : m_subscriptionProvider.data(); + } + + std::optional m_status; + String m_subscriptionId; + String m_subscriptionItemId; + String m_subscriptionProvider; +}; + +template class Alloc = std::allocator> +class PFMembershipModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFMembershipModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMembershipModelWrapper() = default; + + PFMembershipModelWrapper(const PFMembershipModel& model) : + ModelWrapper{ model }, + m_membershipId{ SafeString(model.membershipId) }, + m_overrideExpiration{ model.overrideExpiration ? std::optional{ *model.overrideExpiration } : std::nullopt }, + m_subscriptions{ model.subscriptions, model.subscriptions + model.subscriptionsCount } + { + SetModelPointers(); + } + + PFMembershipModelWrapper(const PFMembershipModelWrapper& src) : + PFMembershipModelWrapper{ src.Model() } + { + } + + PFMembershipModelWrapper(PFMembershipModelWrapper&& src) : + PFMembershipModelWrapper{} + { + swap(*this, src); + } + + PFMembershipModelWrapper& operator=(PFMembershipModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMembershipModelWrapper() = default; + + friend void swap(PFMembershipModelWrapper& lhs, PFMembershipModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_membershipId, rhs.m_membershipId); + swap(lhs.m_overrideExpiration, rhs.m_overrideExpiration); + swap(lhs.m_subscriptions, rhs.m_subscriptions); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetIsActive(bool value) + { + this->m_model.isActive = value; + } + + void SetMembershipExpiration(time_t value) + { + this->m_model.membershipExpiration = value; + } + + void SetMembershipId(String value) + { + m_membershipId = std::move(value); + this->m_model.membershipId = m_membershipId.empty() ? nullptr : m_membershipId.data(); + } + + void SetOverrideExpiration(std::optional value) + { + m_overrideExpiration = std::move(value); + this->m_model.overrideExpiration = m_overrideExpiration ? m_overrideExpiration.operator->() : nullptr; + } + + void SetSubscriptions(ModelVector, Alloc> value) + { + m_subscriptions = std::move(value); + this->m_model.subscriptions = m_subscriptions.empty() ? nullptr : m_subscriptions.data(); + this->m_model.subscriptionsCount = static_cast(m_subscriptions.size()); + } + +private: + void SetModelPointers() + { + this->m_model.membershipId = m_membershipId.empty() ? nullptr : m_membershipId.data(); + this->m_model.overrideExpiration = m_overrideExpiration ? m_overrideExpiration.operator->() : nullptr; + this->m_model.subscriptions = m_subscriptions.empty() ? nullptr : m_subscriptions.data(); + } + + String m_membershipId; + std::optional m_overrideExpiration; + ModelVector, Alloc> m_subscriptions; +}; + +template class Alloc = std::allocator> +class PFPushNotificationRegistrationModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFPushNotificationRegistrationModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPushNotificationRegistrationModelWrapper() = default; + + PFPushNotificationRegistrationModelWrapper(const PFPushNotificationRegistrationModel& model) : + ModelWrapper{ model }, + m_notificationEndpointARN{ SafeString(model.notificationEndpointARN) }, + m_platform{ model.platform ? std::optional{ *model.platform } : std::nullopt } + { + SetModelPointers(); + } + + PFPushNotificationRegistrationModelWrapper(const PFPushNotificationRegistrationModelWrapper& src) : + PFPushNotificationRegistrationModelWrapper{ src.Model() } + { + } + + PFPushNotificationRegistrationModelWrapper(PFPushNotificationRegistrationModelWrapper&& src) : + PFPushNotificationRegistrationModelWrapper{} + { + swap(*this, src); + } + + PFPushNotificationRegistrationModelWrapper& operator=(PFPushNotificationRegistrationModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPushNotificationRegistrationModelWrapper() = default; + + friend void swap(PFPushNotificationRegistrationModelWrapper& lhs, PFPushNotificationRegistrationModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_notificationEndpointARN, rhs.m_notificationEndpointARN); + swap(lhs.m_platform, rhs.m_platform); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNotificationEndpointARN(String value) + { + m_notificationEndpointARN = std::move(value); + this->m_model.notificationEndpointARN = m_notificationEndpointARN.empty() ? nullptr : m_notificationEndpointARN.data(); + } + + void SetPlatform(std::optional value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.notificationEndpointARN = m_notificationEndpointARN.empty() ? nullptr : m_notificationEndpointARN.data(); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + } + + String m_notificationEndpointARN; + std::optional m_platform; +}; + +template class Alloc = std::allocator> +class PFStatisticModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFStatisticModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFStatisticModelWrapper() = default; + + PFStatisticModelWrapper(const PFStatisticModel& model) : + ModelWrapper{ model }, + m_name{ SafeString(model.name) } + { + SetModelPointers(); + } + + PFStatisticModelWrapper(const PFStatisticModelWrapper& src) : + PFStatisticModelWrapper{ src.Model() } + { + } + + PFStatisticModelWrapper(PFStatisticModelWrapper&& src) : + PFStatisticModelWrapper{} + { + swap(*this, src); + } + + PFStatisticModelWrapper& operator=(PFStatisticModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFStatisticModelWrapper() = default; + + friend void swap(PFStatisticModelWrapper& lhs, PFStatisticModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_name, rhs.m_name); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetValue(int32_t value) + { + this->m_model.value = value; + } + + void SetVersion(int32_t value) + { + this->m_model.version = value; + } + +private: + void SetModelPointers() + { + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + String m_name; +}; + +template class Alloc = std::allocator> +class PFTagModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFTagModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTagModelWrapper() = default; + + PFTagModelWrapper(const PFTagModel& model) : + ModelWrapper{ model }, + m_tagValue{ SafeString(model.tagValue) } + { + SetModelPointers(); + } + + PFTagModelWrapper(const PFTagModelWrapper& src) : + PFTagModelWrapper{ src.Model() } + { + } + + PFTagModelWrapper(PFTagModelWrapper&& src) : + PFTagModelWrapper{} + { + swap(*this, src); + } + + PFTagModelWrapper& operator=(PFTagModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTagModelWrapper() = default; + + friend void swap(PFTagModelWrapper& lhs, PFTagModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_tagValue, rhs.m_tagValue); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTagValue(String value) + { + m_tagValue = std::move(value); + this->m_model.tagValue = m_tagValue.empty() ? nullptr : m_tagValue.data(); + } + +private: + void SetModelPointers() + { + this->m_model.tagValue = m_tagValue.empty() ? nullptr : m_tagValue.data(); + } + + String m_tagValue; +}; + +template class Alloc = std::allocator> +class PFValueToDateModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFValueToDateModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFValueToDateModelWrapper() = default; + + PFValueToDateModelWrapper(const PFValueToDateModel& model) : + ModelWrapper{ model }, + m_currency{ SafeString(model.currency) }, + m_totalValueAsDecimal{ SafeString(model.totalValueAsDecimal) } + { + SetModelPointers(); + } + + PFValueToDateModelWrapper(const PFValueToDateModelWrapper& src) : + PFValueToDateModelWrapper{ src.Model() } + { + } + + PFValueToDateModelWrapper(PFValueToDateModelWrapper&& src) : + PFValueToDateModelWrapper{} + { + swap(*this, src); + } + + PFValueToDateModelWrapper& operator=(PFValueToDateModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFValueToDateModelWrapper() = default; + + friend void swap(PFValueToDateModelWrapper& lhs, PFValueToDateModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_currency, rhs.m_currency); + swap(lhs.m_totalValueAsDecimal, rhs.m_totalValueAsDecimal); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCurrency(String value) + { + m_currency = std::move(value); + this->m_model.currency = m_currency.empty() ? nullptr : m_currency.data(); + } + + void SetTotalValue(uint32_t value) + { + this->m_model.totalValue = value; + } + + void SetTotalValueAsDecimal(String value) + { + m_totalValueAsDecimal = std::move(value); + this->m_model.totalValueAsDecimal = m_totalValueAsDecimal.empty() ? nullptr : m_totalValueAsDecimal.data(); + } + +private: + void SetModelPointers() + { + this->m_model.currency = m_currency.empty() ? nullptr : m_currency.data(); + this->m_model.totalValueAsDecimal = m_totalValueAsDecimal.empty() ? nullptr : m_totalValueAsDecimal.data(); + } + + String m_currency; + String m_totalValueAsDecimal; +}; + +template class Alloc = std::allocator> +class PFPlayerProfileModelWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerProfileModel; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlayerProfileModelWrapper() = default; + + PFPlayerProfileModelWrapper(const PFPlayerProfileModel& model) : + ModelWrapper{ model }, + m_adCampaignAttributions{ model.adCampaignAttributions, model.adCampaignAttributions + model.adCampaignAttributionsCount }, + m_avatarUrl{ SafeString(model.avatarUrl) }, + m_bannedUntil{ model.bannedUntil ? std::optional{ *model.bannedUntil } : std::nullopt }, + m_contactEmailAddresses{ model.contactEmailAddresses, model.contactEmailAddresses + model.contactEmailAddressesCount }, + m_created{ model.created ? std::optional{ *model.created } : std::nullopt }, + m_displayName{ SafeString(model.displayName) }, + m_experimentVariants{ model.experimentVariants, model.experimentVariants + model.experimentVariantsCount }, + m_lastLogin{ model.lastLogin ? std::optional{ *model.lastLogin } : std::nullopt }, + m_linkedAccounts{ model.linkedAccounts, model.linkedAccounts + model.linkedAccountsCount }, + m_locations{ model.locations, model.locations + model.locationsCount }, + m_memberships{ model.memberships, model.memberships + model.membershipsCount }, + m_origination{ model.origination ? std::optional{ *model.origination } : std::nullopt }, + m_playerId{ SafeString(model.playerId) }, + m_publisherId{ SafeString(model.publisherId) }, + m_pushNotificationRegistrations{ model.pushNotificationRegistrations, model.pushNotificationRegistrations + model.pushNotificationRegistrationsCount }, + m_statistics{ model.statistics, model.statistics + model.statisticsCount }, + m_tags{ model.tags, model.tags + model.tagsCount }, + m_titleId{ SafeString(model.titleId) }, + m_totalValueToDateInUSD{ model.totalValueToDateInUSD ? std::optional{ *model.totalValueToDateInUSD } : std::nullopt }, + m_valuesToDate{ model.valuesToDate, model.valuesToDate + model.valuesToDateCount } + { + SetModelPointers(); + } + + PFPlayerProfileModelWrapper(const PFPlayerProfileModelWrapper& src) : + PFPlayerProfileModelWrapper{ src.Model() } + { + } + + PFPlayerProfileModelWrapper(PFPlayerProfileModelWrapper&& src) : + PFPlayerProfileModelWrapper{} + { + swap(*this, src); + } + + PFPlayerProfileModelWrapper& operator=(PFPlayerProfileModelWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlayerProfileModelWrapper() = default; + + friend void swap(PFPlayerProfileModelWrapper& lhs, PFPlayerProfileModelWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_adCampaignAttributions, rhs.m_adCampaignAttributions); + swap(lhs.m_avatarUrl, rhs.m_avatarUrl); + swap(lhs.m_bannedUntil, rhs.m_bannedUntil); + swap(lhs.m_contactEmailAddresses, rhs.m_contactEmailAddresses); + swap(lhs.m_created, rhs.m_created); + swap(lhs.m_displayName, rhs.m_displayName); + swap(lhs.m_experimentVariants, rhs.m_experimentVariants); + swap(lhs.m_lastLogin, rhs.m_lastLogin); + swap(lhs.m_linkedAccounts, rhs.m_linkedAccounts); + swap(lhs.m_locations, rhs.m_locations); + swap(lhs.m_memberships, rhs.m_memberships); + swap(lhs.m_origination, rhs.m_origination); + swap(lhs.m_playerId, rhs.m_playerId); + swap(lhs.m_publisherId, rhs.m_publisherId); + swap(lhs.m_pushNotificationRegistrations, rhs.m_pushNotificationRegistrations); + swap(lhs.m_statistics, rhs.m_statistics); + swap(lhs.m_tags, rhs.m_tags); + swap(lhs.m_titleId, rhs.m_titleId); + swap(lhs.m_totalValueToDateInUSD, rhs.m_totalValueToDateInUSD); + swap(lhs.m_valuesToDate, rhs.m_valuesToDate); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdCampaignAttributions(ModelVector, Alloc> value) + { + m_adCampaignAttributions = std::move(value); + this->m_model.adCampaignAttributions = m_adCampaignAttributions.empty() ? nullptr : m_adCampaignAttributions.data(); + this->m_model.adCampaignAttributionsCount = static_cast(m_adCampaignAttributions.size()); + } + + void SetAvatarUrl(String value) + { + m_avatarUrl = std::move(value); + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + } + + void SetBannedUntil(std::optional value) + { + m_bannedUntil = std::move(value); + this->m_model.bannedUntil = m_bannedUntil ? m_bannedUntil.operator->() : nullptr; + } + + void SetContactEmailAddresses(ModelVector, Alloc> value) + { + m_contactEmailAddresses = std::move(value); + this->m_model.contactEmailAddresses = m_contactEmailAddresses.empty() ? nullptr : m_contactEmailAddresses.data(); + this->m_model.contactEmailAddressesCount = static_cast(m_contactEmailAddresses.size()); + } + + void SetCreated(std::optional value) + { + m_created = std::move(value); + this->m_model.created = m_created ? m_created.operator->() : nullptr; + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + void SetExperimentVariants(CStringVector value) + { + m_experimentVariants = std::move(value); + this->m_model.experimentVariants = m_experimentVariants.empty() ? nullptr : m_experimentVariants.data(); + this->m_model.experimentVariantsCount = static_cast(m_experimentVariants.size()); + } + + void SetLastLogin(std::optional value) + { + m_lastLogin = std::move(value); + this->m_model.lastLogin = m_lastLogin ? m_lastLogin.operator->() : nullptr; + } + + void SetLinkedAccounts(ModelVector, Alloc> value) + { + m_linkedAccounts = std::move(value); + this->m_model.linkedAccounts = m_linkedAccounts.empty() ? nullptr : m_linkedAccounts.data(); + this->m_model.linkedAccountsCount = static_cast(m_linkedAccounts.size()); + } + + void SetLocations(ModelVector, Alloc> value) + { + m_locations = std::move(value); + this->m_model.locations = m_locations.empty() ? nullptr : m_locations.data(); + this->m_model.locationsCount = static_cast(m_locations.size()); + } + + void SetMemberships(ModelVector, Alloc> value) + { + m_memberships = std::move(value); + this->m_model.memberships = m_memberships.empty() ? nullptr : m_memberships.data(); + this->m_model.membershipsCount = static_cast(m_memberships.size()); + } + + void SetOrigination(std::optional value) + { + m_origination = std::move(value); + this->m_model.origination = m_origination ? m_origination.operator->() : nullptr; + } + + void SetPlayerId(String value) + { + m_playerId = std::move(value); + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + } + + void SetPublisherId(String value) + { + m_publisherId = std::move(value); + this->m_model.publisherId = m_publisherId.empty() ? nullptr : m_publisherId.data(); + } + + void SetPushNotificationRegistrations(ModelVector, Alloc> value) + { + m_pushNotificationRegistrations = std::move(value); + this->m_model.pushNotificationRegistrations = m_pushNotificationRegistrations.empty() ? nullptr : m_pushNotificationRegistrations.data(); + this->m_model.pushNotificationRegistrationsCount = static_cast(m_pushNotificationRegistrations.size()); + } + + void SetStatistics(ModelVector, Alloc> value) + { + m_statistics = std::move(value); + this->m_model.statistics = m_statistics.empty() ? nullptr : m_statistics.data(); + this->m_model.statisticsCount = static_cast(m_statistics.size()); + } + + void SetTags(ModelVector, Alloc> value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + void SetTotalValueToDateInUSD(std::optional value) + { + m_totalValueToDateInUSD = std::move(value); + this->m_model.totalValueToDateInUSD = m_totalValueToDateInUSD ? m_totalValueToDateInUSD.operator->() : nullptr; + } + + void SetValuesToDate(ModelVector, Alloc> value) + { + m_valuesToDate = std::move(value); + this->m_model.valuesToDate = m_valuesToDate.empty() ? nullptr : m_valuesToDate.data(); + this->m_model.valuesToDateCount = static_cast(m_valuesToDate.size()); + } + +private: + void SetModelPointers() + { + this->m_model.adCampaignAttributions = m_adCampaignAttributions.empty() ? nullptr : m_adCampaignAttributions.data(); + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + this->m_model.bannedUntil = m_bannedUntil ? m_bannedUntil.operator->() : nullptr; + this->m_model.contactEmailAddresses = m_contactEmailAddresses.empty() ? nullptr : m_contactEmailAddresses.data(); + this->m_model.created = m_created ? m_created.operator->() : nullptr; + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + this->m_model.experimentVariants = m_experimentVariants.empty() ? nullptr : m_experimentVariants.data(); + this->m_model.lastLogin = m_lastLogin ? m_lastLogin.operator->() : nullptr; + this->m_model.linkedAccounts = m_linkedAccounts.empty() ? nullptr : m_linkedAccounts.data(); + this->m_model.locations = m_locations.empty() ? nullptr : m_locations.data(); + this->m_model.memberships = m_memberships.empty() ? nullptr : m_memberships.data(); + this->m_model.origination = m_origination ? m_origination.operator->() : nullptr; + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + this->m_model.publisherId = m_publisherId.empty() ? nullptr : m_publisherId.data(); + this->m_model.pushNotificationRegistrations = m_pushNotificationRegistrations.empty() ? nullptr : m_pushNotificationRegistrations.data(); + this->m_model.statistics = m_statistics.empty() ? nullptr : m_statistics.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + this->m_model.totalValueToDateInUSD = m_totalValueToDateInUSD ? m_totalValueToDateInUSD.operator->() : nullptr; + this->m_model.valuesToDate = m_valuesToDate.empty() ? nullptr : m_valuesToDate.data(); + } + + ModelVector, Alloc> m_adCampaignAttributions; + String m_avatarUrl; + std::optional m_bannedUntil; + ModelVector, Alloc> m_contactEmailAddresses; + std::optional m_created; + String m_displayName; + CStringVector m_experimentVariants; + std::optional m_lastLogin; + ModelVector, Alloc> m_linkedAccounts; + ModelVector, Alloc> m_locations; + ModelVector, Alloc> m_memberships; + std::optional m_origination; + String m_playerId; + String m_publisherId; + ModelVector, Alloc> m_pushNotificationRegistrations; + ModelVector, Alloc> m_statistics; + ModelVector, Alloc> m_tags; + String m_titleId; + std::optional m_totalValueToDateInUSD; + ModelVector, Alloc> m_valuesToDate; +}; + +template class Alloc = std::allocator> +class PFStatisticValueWrapper : public ModelWrapper +{ +public: + using ModelType = PFStatisticValue; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFStatisticValueWrapper() = default; + + PFStatisticValueWrapper(const PFStatisticValue& model) : + ModelWrapper{ model }, + m_statisticName{ SafeString(model.statisticName) } + { + SetModelPointers(); + } + + PFStatisticValueWrapper(const PFStatisticValueWrapper& src) : + PFStatisticValueWrapper{ src.Model() } + { + } + + PFStatisticValueWrapper(PFStatisticValueWrapper&& src) : + PFStatisticValueWrapper{} + { + swap(*this, src); + } + + PFStatisticValueWrapper& operator=(PFStatisticValueWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFStatisticValueWrapper() = default; + + friend void swap(PFStatisticValueWrapper& lhs, PFStatisticValueWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_statisticName, rhs.m_statisticName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetStatisticName(String value) + { + m_statisticName = std::move(value); + this->m_model.statisticName = m_statisticName.empty() ? nullptr : m_statisticName.data(); + } + + void SetValue(int32_t value) + { + this->m_model.value = value; + } + + void SetVersion(uint32_t value) + { + this->m_model.version = value; + } + +private: + void SetModelPointers() + { + this->m_model.statisticName = m_statisticName.empty() ? nullptr : m_statisticName.data(); + } + + String m_statisticName; +}; + +template class Alloc = std::allocator> +class PFUserDataRecordWrapper : public ModelWrapper +{ +public: + using ModelType = PFUserDataRecord; + using DictionaryEntryType = PFUserDataRecordDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFUserDataRecordWrapper() = default; + + PFUserDataRecordWrapper(const PFUserDataRecord& model) : + ModelWrapper{ model }, + m_permission{ model.permission ? std::optional{ *model.permission } : std::nullopt }, + m_value{ SafeString(model.value) } + { + SetModelPointers(); + } + + PFUserDataRecordWrapper(const PFUserDataRecordWrapper& src) : + PFUserDataRecordWrapper{ src.Model() } + { + } + + PFUserDataRecordWrapper(PFUserDataRecordWrapper&& src) : + PFUserDataRecordWrapper{} + { + swap(*this, src); + } + + PFUserDataRecordWrapper& operator=(PFUserDataRecordWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFUserDataRecordWrapper() = default; + + friend void swap(PFUserDataRecordWrapper& lhs, PFUserDataRecordWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_permission, rhs.m_permission); + swap(lhs.m_value, rhs.m_value); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetLastUpdated(time_t value) + { + this->m_model.lastUpdated = value; + } + + void SetPermission(std::optional value) + { + m_permission = std::move(value); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + } + + void SetValue(String value) + { + m_value = std::move(value); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + +private: + void SetModelPointers() + { + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + + std::optional m_permission; + String m_value; +}; + +template class Alloc = std::allocator> +class PFVirtualCurrencyRechargeTimeWrapper : public ModelWrapper +{ +public: + using ModelType = PFVirtualCurrencyRechargeTime; + using DictionaryEntryType = PFVirtualCurrencyRechargeTimeDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetRechargeMax(int32_t value) + { + this->m_model.rechargeMax = value; + } + + void SetRechargeTime(time_t value) + { + this->m_model.rechargeTime = value; + } + + void SetSecondsToRecharge(int32_t value) + { + this->m_model.secondsToRecharge = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFGetPlayerCombinedInfoResultPayloadWrapper : public ModelWrapper +{ +public: + using ModelType = PFGetPlayerCombinedInfoResultPayload; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGetPlayerCombinedInfoResultPayloadWrapper() = default; + + PFGetPlayerCombinedInfoResultPayloadWrapper(const PFGetPlayerCombinedInfoResultPayload& model) : + ModelWrapper{ model }, + m_accountInfo{ model.accountInfo ? std::optional>{ *model.accountInfo } : std::nullopt }, + m_characterInventories{ model.characterInventories, model.characterInventories + model.characterInventoriesCount }, + m_characterList{ model.characterList, model.characterList + model.characterListCount }, + m_playerProfile{ model.playerProfile ? std::optional>{ *model.playerProfile } : std::nullopt }, + m_playerStatistics{ model.playerStatistics, model.playerStatistics + model.playerStatisticsCount }, + m_titleData{ model.titleData, model.titleData + model.titleDataCount }, + m_userData{ model.userData, model.userData + model.userDataCount }, + m_userInventory{ model.userInventory, model.userInventory + model.userInventoryCount }, + m_userReadOnlyData{ model.userReadOnlyData, model.userReadOnlyData + model.userReadOnlyDataCount }, + m_userVirtualCurrency{ model.userVirtualCurrency, model.userVirtualCurrency + model.userVirtualCurrencyCount }, + m_userVirtualCurrencyRechargeTimes{ model.userVirtualCurrencyRechargeTimes, model.userVirtualCurrencyRechargeTimes + model.userVirtualCurrencyRechargeTimesCount } + { + SetModelPointers(); + } + + PFGetPlayerCombinedInfoResultPayloadWrapper(const PFGetPlayerCombinedInfoResultPayloadWrapper& src) : + PFGetPlayerCombinedInfoResultPayloadWrapper{ src.Model() } + { + } + + PFGetPlayerCombinedInfoResultPayloadWrapper(PFGetPlayerCombinedInfoResultPayloadWrapper&& src) : + PFGetPlayerCombinedInfoResultPayloadWrapper{} + { + swap(*this, src); + } + + PFGetPlayerCombinedInfoResultPayloadWrapper& operator=(PFGetPlayerCombinedInfoResultPayloadWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGetPlayerCombinedInfoResultPayloadWrapper() = default; + + friend void swap(PFGetPlayerCombinedInfoResultPayloadWrapper& lhs, PFGetPlayerCombinedInfoResultPayloadWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_accountInfo, rhs.m_accountInfo); + swap(lhs.m_characterInventories, rhs.m_characterInventories); + swap(lhs.m_characterList, rhs.m_characterList); + swap(lhs.m_playerProfile, rhs.m_playerProfile); + swap(lhs.m_playerStatistics, rhs.m_playerStatistics); + swap(lhs.m_titleData, rhs.m_titleData); + swap(lhs.m_userData, rhs.m_userData); + swap(lhs.m_userInventory, rhs.m_userInventory); + swap(lhs.m_userReadOnlyData, rhs.m_userReadOnlyData); + swap(lhs.m_userVirtualCurrency, rhs.m_userVirtualCurrency); + swap(lhs.m_userVirtualCurrencyRechargeTimes, rhs.m_userVirtualCurrencyRechargeTimes); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAccountInfo(std::optional> value) + { + m_accountInfo = std::move(value); + this->m_model.accountInfo = m_accountInfo ? &m_accountInfo->Model() : nullptr; + } + + void SetCharacterInventories(ModelVector, Alloc> value) + { + m_characterInventories = std::move(value); + this->m_model.characterInventories = m_characterInventories.empty() ? nullptr : m_characterInventories.data(); + this->m_model.characterInventoriesCount = static_cast(m_characterInventories.size()); + } + + void SetCharacterList(ModelVector, Alloc> value) + { + m_characterList = std::move(value); + this->m_model.characterList = m_characterList.empty() ? nullptr : m_characterList.data(); + this->m_model.characterListCount = static_cast(m_characterList.size()); + } + + void SetPlayerProfile(std::optional> value) + { + m_playerProfile = std::move(value); + this->m_model.playerProfile = m_playerProfile ? &m_playerProfile->Model() : nullptr; + } + + void SetPlayerStatistics(ModelVector, Alloc> value) + { + m_playerStatistics = std::move(value); + this->m_model.playerStatistics = m_playerStatistics.empty() ? nullptr : m_playerStatistics.data(); + this->m_model.playerStatisticsCount = static_cast(m_playerStatistics.size()); + } + + void SetTitleData(StringDictionaryEntryVector value) + { + m_titleData = std::move(value); + this->m_model.titleData = m_titleData.empty() ? nullptr : m_titleData.data(); + this->m_model.titleDataCount = static_cast(m_titleData.size()); + } + + void SetUserData(ModelDictionaryEntryVector, Alloc> value) + { + m_userData = std::move(value); + this->m_model.userData = m_userData.empty() ? nullptr : m_userData.data(); + this->m_model.userDataCount = static_cast(m_userData.size()); + } + + void SetUserDataVersion(uint32_t value) + { + this->m_model.userDataVersion = value; + } + + void SetUserInventory(ModelVector, Alloc> value) + { + m_userInventory = std::move(value); + this->m_model.userInventory = m_userInventory.empty() ? nullptr : m_userInventory.data(); + this->m_model.userInventoryCount = static_cast(m_userInventory.size()); + } + + void SetUserReadOnlyData(ModelDictionaryEntryVector, Alloc> value) + { + m_userReadOnlyData = std::move(value); + this->m_model.userReadOnlyData = m_userReadOnlyData.empty() ? nullptr : m_userReadOnlyData.data(); + this->m_model.userReadOnlyDataCount = static_cast(m_userReadOnlyData.size()); + } + + void SetUserReadOnlyDataVersion(uint32_t value) + { + this->m_model.userReadOnlyDataVersion = value; + } + + void SetUserVirtualCurrency(DictionaryEntryVector value) + { + m_userVirtualCurrency = std::move(value); + this->m_model.userVirtualCurrency = m_userVirtualCurrency.empty() ? nullptr : m_userVirtualCurrency.data(); + this->m_model.userVirtualCurrencyCount = static_cast(m_userVirtualCurrency.size()); + } + + void SetUserVirtualCurrencyRechargeTimes(ModelDictionaryEntryVector, Alloc> value) + { + m_userVirtualCurrencyRechargeTimes = std::move(value); + this->m_model.userVirtualCurrencyRechargeTimes = m_userVirtualCurrencyRechargeTimes.empty() ? nullptr : m_userVirtualCurrencyRechargeTimes.data(); + this->m_model.userVirtualCurrencyRechargeTimesCount = static_cast(m_userVirtualCurrencyRechargeTimes.size()); + } + +private: + void SetModelPointers() + { + this->m_model.accountInfo = m_accountInfo ? &m_accountInfo->Model() : nullptr; + this->m_model.characterInventories = m_characterInventories.empty() ? nullptr : m_characterInventories.data(); + this->m_model.characterList = m_characterList.empty() ? nullptr : m_characterList.data(); + this->m_model.playerProfile = m_playerProfile ? &m_playerProfile->Model() : nullptr; + this->m_model.playerStatistics = m_playerStatistics.empty() ? nullptr : m_playerStatistics.data(); + this->m_model.titleData = m_titleData.empty() ? nullptr : m_titleData.data(); + this->m_model.userData = m_userData.empty() ? nullptr : m_userData.data(); + this->m_model.userInventory = m_userInventory.empty() ? nullptr : m_userInventory.data(); + this->m_model.userReadOnlyData = m_userReadOnlyData.empty() ? nullptr : m_userReadOnlyData.data(); + this->m_model.userVirtualCurrency = m_userVirtualCurrency.empty() ? nullptr : m_userVirtualCurrency.data(); + this->m_model.userVirtualCurrencyRechargeTimes = m_userVirtualCurrencyRechargeTimes.empty() ? nullptr : m_userVirtualCurrencyRechargeTimes.data(); + } + + std::optional> m_accountInfo; + ModelVector, Alloc> m_characterInventories; + ModelVector, Alloc> m_characterList; + std::optional> m_playerProfile; + ModelVector, Alloc> m_playerStatistics; + StringDictionaryEntryVector m_titleData; + ModelDictionaryEntryVector, Alloc> m_userData; + ModelVector, Alloc> m_userInventory; + ModelDictionaryEntryVector, Alloc> m_userReadOnlyData; + DictionaryEntryVector m_userVirtualCurrency; + ModelDictionaryEntryVector, Alloc> m_userVirtualCurrencyRechargeTimes; +}; + +template class Alloc = std::allocator> +class PFVariableWrapper : public ModelWrapper +{ +public: + using ModelType = PFVariable; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFVariableWrapper() = default; + + PFVariableWrapper(const PFVariable& model) : + ModelWrapper{ model }, + m_name{ SafeString(model.name) }, + m_value{ SafeString(model.value) } + { + SetModelPointers(); + } + + PFVariableWrapper(const PFVariableWrapper& src) : + PFVariableWrapper{ src.Model() } + { + } + + PFVariableWrapper(PFVariableWrapper&& src) : + PFVariableWrapper{} + { + swap(*this, src); + } + + PFVariableWrapper& operator=(PFVariableWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFVariableWrapper() = default; + + friend void swap(PFVariableWrapper& lhs, PFVariableWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_name, rhs.m_name); + swap(lhs.m_value, rhs.m_value); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetValue(String value) + { + m_value = std::move(value); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + +private: + void SetModelPointers() + { + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + + String m_name; + String m_value; +}; + +template class Alloc = std::allocator> +class PFTreatmentAssignmentWrapper : public ModelWrapper +{ +public: + using ModelType = PFTreatmentAssignment; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTreatmentAssignmentWrapper() = default; + + PFTreatmentAssignmentWrapper(const PFTreatmentAssignment& model) : + ModelWrapper{ model }, + m_variables{ model.variables, model.variables + model.variablesCount }, + m_variants{ model.variants, model.variants + model.variantsCount } + { + SetModelPointers(); + } + + PFTreatmentAssignmentWrapper(const PFTreatmentAssignmentWrapper& src) : + PFTreatmentAssignmentWrapper{ src.Model() } + { + } + + PFTreatmentAssignmentWrapper(PFTreatmentAssignmentWrapper&& src) : + PFTreatmentAssignmentWrapper{} + { + swap(*this, src); + } + + PFTreatmentAssignmentWrapper& operator=(PFTreatmentAssignmentWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTreatmentAssignmentWrapper() = default; + + friend void swap(PFTreatmentAssignmentWrapper& lhs, PFTreatmentAssignmentWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_variables, rhs.m_variables); + swap(lhs.m_variants, rhs.m_variants); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetVariables(ModelVector, Alloc> value) + { + m_variables = std::move(value); + this->m_model.variables = m_variables.empty() ? nullptr : m_variables.data(); + this->m_model.variablesCount = static_cast(m_variables.size()); + } + + void SetVariants(CStringVector value) + { + m_variants = std::move(value); + this->m_model.variants = m_variants.empty() ? nullptr : m_variants.data(); + this->m_model.variantsCount = static_cast(m_variants.size()); + } + +private: + void SetModelPointers() + { + this->m_model.variables = m_variables.empty() ? nullptr : m_variables.data(); + this->m_model.variants = m_variants.empty() ? nullptr : m_variants.data(); + } + + ModelVector, Alloc> m_variables; + CStringVector m_variants; +}; + +template class Alloc = std::allocator> +class PFEntityLineageWrapper : public ModelWrapper +{ +public: + using ModelType = PFEntityLineage; + using DictionaryEntryType = PFEntityLineageDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFEntityLineageWrapper() = default; + + PFEntityLineageWrapper(const PFEntityLineage& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_groupId{ SafeString(model.groupId) }, + m_masterPlayerAccountId{ SafeString(model.masterPlayerAccountId) }, + m_namespaceId{ SafeString(model.namespaceId) }, + m_titleId{ SafeString(model.titleId) }, + m_titlePlayerAccountId{ SafeString(model.titlePlayerAccountId) } + { + SetModelPointers(); + } + + PFEntityLineageWrapper(const PFEntityLineageWrapper& src) : + PFEntityLineageWrapper{ src.Model() } + { + } + + PFEntityLineageWrapper(PFEntityLineageWrapper&& src) : + PFEntityLineageWrapper{} + { + swap(*this, src); + } + + PFEntityLineageWrapper& operator=(PFEntityLineageWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFEntityLineageWrapper() = default; + + friend void swap(PFEntityLineageWrapper& lhs, PFEntityLineageWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_groupId, rhs.m_groupId); + swap(lhs.m_masterPlayerAccountId, rhs.m_masterPlayerAccountId); + swap(lhs.m_namespaceId, rhs.m_namespaceId); + swap(lhs.m_titleId, rhs.m_titleId); + swap(lhs.m_titlePlayerAccountId, rhs.m_titlePlayerAccountId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetGroupId(String value) + { + m_groupId = std::move(value); + this->m_model.groupId = m_groupId.empty() ? nullptr : m_groupId.data(); + } + + void SetMasterPlayerAccountId(String value) + { + m_masterPlayerAccountId = std::move(value); + this->m_model.masterPlayerAccountId = m_masterPlayerAccountId.empty() ? nullptr : m_masterPlayerAccountId.data(); + } + + void SetNamespaceId(String value) + { + m_namespaceId = std::move(value); + this->m_model.namespaceId = m_namespaceId.empty() ? nullptr : m_namespaceId.data(); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + void SetTitlePlayerAccountId(String value) + { + m_titlePlayerAccountId = std::move(value); + this->m_model.titlePlayerAccountId = m_titlePlayerAccountId.empty() ? nullptr : m_titlePlayerAccountId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.groupId = m_groupId.empty() ? nullptr : m_groupId.data(); + this->m_model.masterPlayerAccountId = m_masterPlayerAccountId.empty() ? nullptr : m_masterPlayerAccountId.data(); + this->m_model.namespaceId = m_namespaceId.empty() ? nullptr : m_namespaceId.data(); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + this->m_model.titlePlayerAccountId = m_titlePlayerAccountId.empty() ? nullptr : m_titlePlayerAccountId.data(); + } + + String m_characterId; + String m_groupId; + String m_masterPlayerAccountId; + String m_namespaceId; + String m_titleId; + String m_titlePlayerAccountId; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabCore/Include/playfab/core/PFCore.h b/Source/PlayFabCore/Include/playfab/core/PFCore.h new file mode 100644 index 0000000..af7c5aa --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/PFCore.h @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" +{ + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Initialize PlayFabCore global state. Custom platform hooks must be configured prior to calling PFInitialize. +/// +/// An XTaskQueue that should be used for background work. If no queue is provided then a default (threadpool) queue will be used. +/// Result code for this API operation. +PF_API PFInitialize( + _In_opt_ XTaskQueueHandle backgroundQueue +) noexcept; +#endif + +/// +/// Cleanup PlayFab global state. +/// +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// Asynchronous result returned via XAsyncGetStatus. +PF_API PFUninitializeAsync( + _In_ XAsyncBlock* async +) noexcept; + +} diff --git a/Source/PlayFabCore/Include/playfab/core/PFEventPipeline.h b/Source/PlayFabCore/Include/playfab/core/PFEventPipeline.h new file mode 100644 index 0000000..63066e0 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/PFEventPipeline.h @@ -0,0 +1,293 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +typedef struct PFEventPipeline* PFEventPipelineHandle; + +/// +/// Default value for maximum events per batch for a PlayStream Event pipeline if none is provided. +/// +const uint32_t PFPlayStreamEventPipelineMaxEventsPerBatchDefault = 5; + +/// +/// Default value for maximum wait time for a PlayStream Event pipeline if none is provided. +/// +const uint32_t PFPlayStreamEventPipelineMaxWaitTimeInSecondsDefault = 3; + +/// +/// Default value for poll delay time for a PlayStream Event pipeline if none is provided. +/// +const uint32_t PFPlayStreamEventPipelinePollDelayInMsDefault = 10; + +/// +/// Default value for maximum events per batch for a Telemetry Event pipeline if none is provided. +/// +const uint32_t PFTelemetryEventPipelineMaxEventsPerBatchDefault = 5; + +/// +/// Default value for maximum wait time for a Telemetry Event pipeline if none is provided. +/// +const uint32_t PFTelemetryEventPipelineMaxWaitTimeInSecondsDefault = 3; + +/// +/// Default value for poll delay time for a Telemetry Event pipeline if none is provided. +/// +const uint32_t PFTelemetryEventPipelinePollDelayInMsDefault = 10; + +/// +/// Event to be uploaded to PlayFab. +/// +struct PFEvent +{ + /// + /// Entity associated with the event. If null, the event will apply to the calling entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The namespace in which the event is defined. + /// + _Null_terminated_ const char* eventNamespace; + + /// + /// The name of the event. + /// + _Null_terminated_ const char* name; + + /// + /// Client assigned identifier associated with event. Not required but may be useful for tracking or tracing. + /// If a clientId is not provided, the SDK will automatically assign one. + /// + _Maybenull_ _Null_terminated_ const char* clientId; + + /// + /// Arbitrary JSON data associated with the event. + /// + _Null_terminated_ const char* payloadJson; +}; + +/// +/// Event that has been uploaded to PlayFab. Associates the service assigned ID with the clientId provided when the event was emitted. +/// +struct PFUploadedEvent +{ + /// + /// Id assigned by the client prior to the event being uploaded. + /// + _Null_terminated_ const char* clientId; + + /// + /// Unique Id assigned by the PlayFab server for the event. + /// + _Null_terminated_ const char* serviceId; +}; + +/// +/// Configuration struct that defines the properties required for using Telemetry Key. +/// +struct PFEventPipelineTelemetryKeyConfig +{ + /// + /// The Key created to send PlayFab event requests without an associated entity. + /// + _Null_terminated_ const char* telemetryKey; + + /// + /// Service Config to be used with telemetry key. + /// + PFServiceConfigHandle serviceConfigHandle; +}; + +/// +/// Defines the Event Pipeline configuration. +/// +struct PFEventPipelineConfig +{ + /// + /// The maximum number events that will be batched before writing them to PlayFab. If sent null, default value will be used (5 for Telemetry / 5 for PlayStream). + /// + _Maybenull_ uint32_t* maxEventsPerBatch; + + /// + /// The maximum time the pipeline will wait before sending out an incomplete batch. If sent null, default value will be used (3 for Telemetry / 3 for PlayStream). + /// + _Maybenull_ uint32_t* maxWaitTimeInSeconds; + + /// + /// How long the pipeline will wait to read from the event buffer again after emptying it. If sent null, default value will be used (10 for Telemetry / 10 for PlayStream). + /// + _Maybenull_ uint32_t* pollDelayInMs; +}; + +/// +/// A handler invoked when the SDK successfully uploads a batch of events. +/// +/// Optional context pointer to data used by the event handler. +/// The array of PFEventPipelineUploadedEvents that was uploaded. +/// The number of entries in the eventPipelineUploadedEvents array. +/// +/// Arguments besides context are owned by the SDK and only guaranteed to be valid within the callback. +/// +typedef void CALLBACK PFEventPipelineBatchUploadSucceededEventHandler( + _In_opt_ void* context, + _In_ PFUploadedEvent const* const* eventPipelineUploadedEvents, + _In_ size_t eventPipelineUploadedEventsCount +); + +/// +/// A handler invoked when the SDK has attempted but failed to upload a batch of event pipeline events. +/// It is up to the client to resubmit failed events as necessary using PFEventPipelineEmitEvent, though depending on the nature +/// of the failure, resubmitting directly may not resolve the issue. +/// +/// Optional context pointer to data used by the event handler. +/// Translated upload error. +/// Message describing the upload error. +/// Events that were in the failed batch. +/// The number of entries in the failedEvents array. +/// +/// Arguments besides context are owned by the SDK and only guaranteed to be valid within the callback. +/// +typedef void CALLBACK PFEventPipelineBatchUploadFailedEventHandler( + _In_opt_ void* context, + _In_ HRESULT translatedUploadError, + _In_ const char* errorMessage, + _In_ PFEvent const* const* failedEvents, + _In_ size_t failedEventsCount +); + +/// +/// Creates an event pipeline to upload Telemetry events using a Telemetry Key. +/// +/// The Configuration to use if telemetry key logging will be used. +/// The async queue where background work will be scheduled and where event callbacks will be invoked. +/// Optional handler that will be invoked when a batch of events is uploaded. +/// Optional handler that will be invoked when uploading a batch of events fails. +/// Optional pointer to data used by the event handlers. +/// Handle to the created pipeline. Needs to be closed with PFEventPipelineCloseHandle when it isn't needed. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_PF_NOT_INITIALIZED or E_FAIL. +PF_API PFEventPipelineCreateTelemetryPipelineHandleWithKey( + _In_ PFEventPipelineTelemetryKeyConfig* eventPipelineTelemetryKeyConfig, + _In_opt_ XTaskQueueHandle queue, + _In_opt_ PFEventPipelineBatchUploadSucceededEventHandler* eventPipelineBatchUploadedEventHandler, + _In_opt_ PFEventPipelineBatchUploadFailedEventHandler* eventPipelineBatchFailedEventHandler, + _In_opt_ void* handlerContext, + _Out_ PFEventPipelineHandle* eventPipelineHandle +) noexcept; + +/// +/// Creates an event pipeline to upload Telemetry events using an Entity. +/// +/// The Entity whose token will be used to make the PlayFab service requests in the background. +/// The async queue where background work will be scheduled and where event callbacks will be invoked. +/// Optional handler that will be invoked when a batch of events is uploaded. +/// Optional handler that will be invoked when uploading a batch of events fails. +/// Optional pointer to data used by the event handlers. +/// Handle to the created pipeline. Needs to be closed with PFEventPipelineCloseHandle when it isn't needed. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_PF_NOT_INITIALIZED or E_FAIL. +PF_API PFEventPipelineCreateTelemetryPipelineHandleWithEntity( + _In_ PFEntityHandle entityHandle, + _In_opt_ XTaskQueueHandle queue, + _In_opt_ PFEventPipelineBatchUploadSucceededEventHandler* eventPipelineBatchUploadedEventHandler, + _In_opt_ PFEventPipelineBatchUploadFailedEventHandler* eventPipelineBatchFailedEventHandler, + _In_opt_ void* handlerContext, + _Out_ PFEventPipelineHandle* eventPipelineHandle +) noexcept; + +/// +/// Creates an event pipeline to upload PlayStream events using an Entity. +/// +/// The Entity whose token will be used to make the PlayFab service requests in the background. +/// The async queue where background work will be scheduled and where event callbacks will be invoked. +/// Optional handler that will be invoked when a batch of events is uploaded. +/// Optional handler that will be invoked when uploading a batch of events fails. +/// Optional pointer to data used by the event handlers. +/// Handle to the created pipeline. Needs to be closed with PFEventPipelineCloseHandle when it isn't needed. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_PF_NOT_INITIALIZED or E_FAIL. +PF_API PFEventPipelineCreatePlayStreamPipelineHandle( + _In_ PFEntityHandle entityHandle, + _In_opt_ XTaskQueueHandle queue, + _In_opt_ PFEventPipelineBatchUploadSucceededEventHandler* eventPipelineBatchUploadedEventHandler, + _In_opt_ PFEventPipelineBatchUploadFailedEventHandler* eventPipelineBatchFailedEventHandler, + _In_opt_ void* handlerContext, + _Out_ PFEventPipelineHandle* eventPipelineHandle +) noexcept; + +/// +/// Duplicates a PFEventPipelineHandle. +/// +/// EventPipeline handle to duplicate. +/// The duplicated handle. +/// Result code for this API operation. +/// +/// Both the duplicated handle and the original handle need to be closed with PFEventPipelineCloseHandle when they are no longer needed. +/// +PF_API PFEventPipelineDuplicateHandle( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEventPipelineHandle* duplicatedEventPipelineHandle +) noexcept; + +/// +/// Closes a PFEventPipelineHandle. +/// +/// EventPipeline handle to close. +/// Result code for this API operation. +PF_API_(void) PFEventPipelineCloseHandle( + _In_ PFEventPipelineHandle eventPipelineHandle +) noexcept; + +/// +/// Adds a event to a pipelines buffer to be uploaded. The API will return synchronously and the event +/// will be uploaded in the background based on the pipeline configuration. +/// +/// The EventPipeline to submit the event to. +/// Event to upload. +/// Result code for this API operation. Possible values are S_OK, E_PF_NOT_INITIALIZED, or E_FAIL. +PF_API PFEventPipelineEmitEvent( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEvent const* event +) noexcept; + +/// +/// Adds an entity to an existing pipeline. All events emitted will be linked to this entity. +/// +/// The existing EventPipeline handle to add the uploading entity. +/// The Entity whose token will be used to make the PlayFab service requests in the background. +/// Result code for this API operation. Possible values are S_OK, E_PF_NOT_INITIALIZED or E_FAIL. +PF_API PFEventPipelineAddUploadingEntity( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEntityHandle entityHandle +) noexcept; + +/// +/// Remove an entity from an existing pipeline. If a valid Telemetry Key Configuration was added at pipeline creation +/// it will switch to it. +/// +/// The existing EventPipeline handle to remove the uploading entity. +/// Result code for this API operation. Possible values are S_OK, E_PF_NOT_INITIALIZED, or E_FAIL. +PF_API PFEventPipelineRemoveUploadingEntity( + _In_ PFEventPipelineHandle eventPipelineHandle +) noexcept; + +/// +/// Update an existing pipeline configuration. +/// +/// The existing EventPipeline handle to add the uploading entity. +/// Struct that contains the new configuration of the event pipeline. +/// Result code for this API operation. Possible values are S_OK, E_PF_NOT_INITIALIZED, or E_FAIL. +PF_API PFEventPipelineUpdateConfiguration( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEventPipelineConfig eventPipelineConfig +) noexcept; + +} diff --git a/Source/PlayFabCore/Include/playfab/core/PFHttpConfig.h b/Source/PlayFabCore/Include/playfab/core/PFHttpConfig.h new file mode 100644 index 0000000..387e972 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/PFHttpConfig.h @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +extern "C" +{ +/// +/// Struct the defines retry settings for PlayFab HTTP requests. +/// +struct PFHttpRetrySettings +{ + /// + /// Controls whether the SDK should automatically retry select errors. There are certain errors that will never be + /// handled internally and will always be returned directly to the client. Default value is 'true'. + /// + bool allowRetry; + + /// + /// The minimum number of seconds the SDK will wait after an HTTP failure before retrying the call. + /// The default and minimum value is 2 seconds. + /// + uint32_t minimumRetryDelayInSeconds; + + /// + /// The maximum number of seconds the SDK will attempt to retry an HTTP request before returning to the client. + /// The default value is 20 seconds. + /// + uint32_t timeoutWindowInSeconds; +}; + +/// +/// Sets global HTTP retry retry settings for the SDK. +/// +/// Pointer to retry settings. +/// Result code for this API operation. +PF_API PFSetHttpRetrySettings( + _In_ PFHttpRetrySettings const* settings +) noexcept; + +/// +/// Gets the current HTTP retry retry settings for the SDK. +/// +/// Pointer to retry settings that will be populated. +/// Result code for this API operation. +PF_API PFGetHttpRetrySettings( + _Out_ PFHttpRetrySettings* settings +) noexcept; + +} \ No newline at end of file diff --git a/Source/PlayFabCore/Include/playfab/core/PFPal.h b/Source/PlayFabCore/Include/playfab/core/PFPal.h new file mode 100644 index 0000000..6ceec0b --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/PFPal.h @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +#if !HC_PLATFORM_IS_MICROSOFT +#ifndef _Null_terminated_ +#define _Null_terminated_ +#endif +#endif // HC_PLATFORM_IS_MICROSOFT + +#if HC_PLATFORM_IS_MICROSOFT || HC_PLATFORM_IS_PLAYSTATION +#define PF_API_ATTRIBUTES __declspec(dllexport) +#else +#define PF_API_ATTRIBUTES +#endif + +#ifndef STDAPICALLTYPE +#define STDAPICALLTYPE +#endif + +#define PF_API PF_API_ATTRIBUTES HRESULT STDAPICALLTYPE +#define PF_API_(type) PF_API_ATTRIBUTES type STDAPICALLTYPE + +#if HC_PLATFORM_IS_MICROSOFT + #if _MSC_VER >= 1900 + #define PF_DEPRECATED __declspec(deprecated) + #else + #define PF_DEPRECATED + #endif +#else + #define PF_DEPRECATED +#endif +#define PF_API_DEPRECATED PF_API_ATTRIBUTES PF_DEPRECATED HRESULT STDAPICALLTYPE +#define PF_API_DEPRECATED_(type) PF_API_ATTRIBUTES PF_DEPRECATED type STDAPICALLTYPE + +#ifndef _Maybenull_ +#define _Maybenull_ +#endif diff --git a/Source/PlayFabCore/Include/playfab/core/PFPlatform.h b/Source/PlayFabCore/Include/playfab/core/PFPlatform.h new file mode 100644 index 0000000..e5ce075 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/PFPlatform.h @@ -0,0 +1,205 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +//----------------------------------------------------------------------------- +// Hooks for platform specific behavior +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Memory (optional on all platforms) +//----------------------------------------------------------------------------- + +/// +/// A callback invoked every time a new memory buffer must be dynamically allocated by the library. +/// This callback is optionally installed by calling PFMemSetFunctions() +/// +/// The callback must allocate and return a pointer to a contiguous block of memory of the +/// specified size that will remain valid until the app's corresponding PFMemFreeFunction +/// callback is invoked to release it. +/// +/// Every non-null pointer returned by this method will be subsequently passed to the corresponding +/// PFMemFreeFunction callback once the memory is no longer needed. +/// +/// A pointer to an allocated block of memory of the specified size, or a null +/// pointer if allocation failed. +/// The size of the allocation to be made. This value will never be zero. +typedef _Ret_maybenull_ _Post_writable_byte_size_(size) void* STDAPIVCALLTYPE PFMemAllocFunction(_In_ size_t size); + +/// +/// A callback invoked every time a previously allocated memory buffer is no longer needed by +/// the library and can be freed. This callback is optionally installed by calling PFMemSetFunctions() +/// +/// The callback is invoked whenever the library has finished using a memory buffer previously +/// returned by the app's corresponding PFMemAllocFunction such that the application can free the +/// memory buffer. +/// +/// The pointer to the memory buffer previously allocated. This value will +/// never be a null pointer. +typedef void STDAPIVCALLTYPE PFMemFreeFunction(_In_ _Post_invalid_ void* pointer); + +/// +/// Struct encapsulating memory hooks. +/// +/// +/// Both hooks must be set at the same time. +/// +typedef struct PFMemoryHooks +{ + /// + /// Custom allocation hook. + /// + PFMemAllocFunction* alloc; + + /// + /// Custom free hook. + /// + PFMemFreeFunction* free; +} PFMemoryHooks; + +/// +/// Optionally sets the memory hook functions to allow callers to control route memory +/// allocations to their own memory manager. This must be called before PFInitialize() +/// and can not be called again once memory hooks have been set. +/// +/// This method allows the application to install custom memory allocation routines in order +/// to service all requests for new memory buffers instead of using default allocation routines. +/// +/// Custom memory hooks to be used by the SDK. +/// HRESULT return code for this API operation. +/// +/// Must be called before PFInitialize. +/// +PF_API PFMemSetFunctions( + _In_ PFMemoryHooks* hooks +) noexcept; + +/// +/// Gets the memory hook functions to allow callers to control route memory allocations to their +/// own memory manager. This method allows the application get the default memory allocation routines. +/// This can be used along with PFMemSetFunctions() to monitor all memory allocations. +/// +/// Struct to be populated with the current memory hooks. Defaults will be returned +/// if custom hooks weren't previously set. +/// HRESULT return code for this API operation. +PF_API PFMemGetFunctions( + _Out_ PFMemoryHooks* hooks +) noexcept; + +//----------------------------------------------------------------------------- +// Storage (optional on all platforms) +//----------------------------------------------------------------------------- + +/// +/// Read from storage event handler. Should implement an . +/// +/// Optional pointer to data used by the event handler. +/// Identifies the data being written. Typically a filepath. +/// XAsyncBlock for the operation. +/// +/// This event handler will be invoked when PlayFab needs to read data from storage. +/// The XAsyncBlock should be completed with data size (in bytes) that was read. +/// All arguments are owned by the SDK and are guaranteed to be valid until the operation is complete (except context). +/// +typedef HRESULT STDAPIVCALLTYPE PFPlatformLocalStorageReadAsyncHandler( + _In_opt_ void* context, + _In_z_ const char* key, + _Inout_ XAsyncBlock* async +); + +/// +/// Write to storage event handler. Should implement an . +/// +/// Optional pointer to data used by the event handler. +/// Identifies the data being written. Typically a filepath. +/// The size (in bytes) of the data. +/// The data to write. +/// XAsyncBlock for the operation. +/// +/// This event handler will be invoked when PlayFab needs to write data to storage. +/// All arguments are owned by the SDK and are guaranteed to be valid until the operation is complete (except context). +/// +typedef HRESULT STDAPIVCALLTYPE PFPlatformLocalStorageWriteAsyncHandler( + _In_opt_ void* context, + _In_z_ const char* key, + _In_ size_t dataSize, + _In_reads_bytes_(dataSize) void const* data, + _Inout_ XAsyncBlock* async +); + +/// +/// Write from storage event handler. Should implement an . +/// +/// Optional pointer to data used by the event handler. +/// Identifies the data being written. Typically a filepath. +/// XAsyncBlock for the operation. +/// +/// This event handler will be invoked when PlayFab needs to clear data from storage. +/// All arguments are owned by the SDK and are guaranteed to be valid until the operation is complete (except context). +/// +typedef HRESULT STDAPIVCALLTYPE PFPlatformLocalStorageClearAsyncHandler( + _In_opt_ void* context, + _In_z_ const char* key, + _Inout_ XAsyncBlock* async +); + +/// +/// Struct encapsulating the storage hooks. +/// +/// +/// All 3 handlers must be set at the same time. +/// +typedef struct PFLocalStorageHooks +{ + /// + /// (Optional) Queue that the hooks should be invoked on. If not specified, the callbacks will be invoked + /// on the background queue provided to PFInitialize. + /// + _Maybenull_ XTaskQueueHandle queueHandle; + + /// + /// Custom read hook. + /// + PFPlatformLocalStorageReadAsyncHandler* read; + + /// + /// Custom write hook. + /// + PFPlatformLocalStorageWriteAsyncHandler* write; + + /// + /// Custom clear hook. + /// + PFPlatformLocalStorageClearAsyncHandler* clear; + + /// + /// (Optional) Client context that will be passed to storage hooks. + /// + _Maybenull_ void* context; +} PFLocalStorageHooks; + +/// +/// Sets the storage event handlers. If custom storage handlers are not set, a default implementation +/// based on cstdio and std::fstream objects will be used. +/// +/// Custom local storage hooks to be used by the SDK. +/// Result code for this API operation. +/// +/// Must be called before PFInitialize. +/// +PF_API PFPlatformLocalStorageSetHandlers( + _In_ PFLocalStorageHooks* hooks +) noexcept; + +} diff --git a/Source/PlayFabCore/Include/playfab/core/PFServiceConfig.h b/Source/PlayFabCore/Include/playfab/core/PFServiceConfig.h new file mode 100644 index 0000000..4131cd8 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/PFServiceConfig.h @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +extern "C" +{ + +typedef struct PFServiceConfig* PFServiceConfigHandle; + +/// +/// Creates a PlayFab service configuration. +/// +/// String used to connect to a PlayFab Service instance. +/// PlayFab TitleId for the title. Found in the Game Manager for your title on the PlayFab Website. +/// Pointer to a PFServiceConfigHandle to write. +/// Result code for this API operation. Possible values are S_OK, E_PF_NOT_INITIALIZED, or E_INVALIDARG. +PF_API PFServiceConfigCreateHandle( + _In_z_ const char* apiEndpoint, + _In_z_ const char* playFabTitleId, + _Out_ PFServiceConfigHandle* serviceConfigHandle +) noexcept; + +/// +/// Duplicates a PFServiceConfigHandle. +/// +/// ServiceConfig handle to duplicate. +/// The duplicated handle. +/// Result code for this API operation. +/// +/// Both the duplicated handle and the original handle need to be closed with PFServiceConfigCloseHandle when they +/// are no longer needed. +/// +PF_API PFServiceConfigDuplicateHandle( + PFServiceConfigHandle handle, + PFServiceConfigHandle* duplicatedHandle +) noexcept; + +/// +/// Closes a PFServiceConfigHandle. +/// +/// ServiceConfig handle to close. +/// Result code for this API operation. +PF_API_(void) PFServiceConfigCloseHandle( + PFServiceConfigHandle handle +) noexcept; + +/// +/// Gets the size of the buffer needed to hold the API endpoint for a service configuration. +/// +/// ServiceConfig handle. +/// Buffer size required for the API endpoint string (including null terminator). +/// Result code for this API operation. +PF_API PFServiceConfigGetAPIEndpointSize( + _In_ PFServiceConfigHandle handle, + _Out_ size_t* apiEndpointSize +) noexcept; + +/// +/// Gets the API endpoint for a service configuration. +/// +/// ServiceConfig handle. +/// Size of the provided buffer. Required size can be obtained via PFServiceConfigGetAPIEndpointSize. +/// Buffer the API endpoint string will be written to. +/// The number of bytes used in the buffer including the null terminator. +/// Result code for this API operation. +PF_API PFServiceConfigGetAPIEndpoint( + _In_ PFServiceConfigHandle handle, + _In_ size_t apiEndpointSize, + _Out_writes_(apiEndpointSize) char* apiEndpoint, + _Out_opt_ size_t* apiEndpointUsed +) noexcept; + +/// +/// Gets the size of the buffer needed to hold the PlayFab titleId for a service configuration. +/// +/// ServiceConfig handle. +/// Buffer size required for the titleId (including null terminator). +/// Result code for this API operation. +PF_API PFServiceConfigGetTitleIdSize( + _In_ PFServiceConfigHandle handle, + _Out_ size_t* titleIdSize +) noexcept; + +/// +/// Gets the PlayFab titleId for a service configuration. +/// +/// ServiceConfig handle. +/// Size of the provided buffer. Required size can be obtained via PFServiceConfigGetTitleIdSize. +/// Buffer the titleId will be written to. +/// The number of bytes used in the buffer including the null terminator. +/// Result code for this API operation. +PF_API PFServiceConfigGetTitleId( + _In_ PFServiceConfigHandle handle, + _In_ size_t titleIdSize, + _Out_writes_(titleIdSize) char* titleId, + _Out_opt_ size_t* titleIdUsed +) noexcept; + +} diff --git a/Source/PlayFabCore/Include/playfab/core/PFTrace.h b/Source/PlayFabCore/Include/playfab/core/PFTrace.h new file mode 100644 index 0000000..690b717 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/PFTrace.h @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +extern "C" +{ + +PF_API PFTraceEnableTraceToFile( + _In_z_ const char* traceFileDirectory +) noexcept; + +} diff --git a/Source/PlayFabCore/Include/playfab/core/cpp/Entity.h b/Source/PlayFabCore/Include/playfab/core/cpp/Entity.h new file mode 100644 index 0000000..2edeecc --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/cpp/Entity.h @@ -0,0 +1,140 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include "PlayFabException.h" +#include + + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class Entity +{ +public: + using String = typename std::basic_string, Alloc>; + template + using Vector = typename std::vector>; + + // Creates a Entity by wrapping a PFEntityHandle (transfers ownership of the handle) + static Entity Wrap(PFEntityHandle handle) + { + return Entity{ handle }; + } + + // Creates a Entity by duplicating a PFEntityHandle (caller still owns provided handle) + static Entity Duplicate(PFEntityHandle handle) + { + PFEntityHandle duplicatedHandle; + THROW_IF_FAILED(PFEntityDuplicateHandle(handle, &duplicatedHandle)); + return Entity{ duplicatedHandle }; + } + + Entity(Entity const& other) + { + THROW_IF_FAILED(PFEntityDuplicateHandle(other.m_handle, &m_handle)); + } + + Entity(Entity&& other) + { + std::swap(m_handle, other.m_handle); + } + + Entity& operator=(Entity other) + { + std::swap(m_handle, other.m_handle); + return *this; + } + + virtual ~Entity() + { + if (m_handle) + { + PFEntityCloseHandle(m_handle); + } + } + + PFEntityHandle Handle() const noexcept + { + return m_handle; + } + + PFEntityKeyWrapper EntityKey() const + { + size_t size{}; + THROW_IF_FAILED(PFEntityGetEntityKeySize(m_handle, &size)); + + PFEntityKey const* pEntityKey{}; + Vector buffer(size); + THROW_IF_FAILED(PFEntityGetEntityKey(m_handle, buffer.size(), buffer.data(), &pEntityKey, nullptr)); + + return *pEntityKey; + } + + // Gets secretKey if available and returns E_PF_NOSECRETKEY otherwise + HRESULT TryGetSecretKey(String& secretKey) const + { + try + { +#if HC_PLATFORM != HC_PLATFORM_GDK + size_t size{ 0 }; + THROW_IF_FAILED(PFEntityGetSecretKeySize(m_handle, &size)); + + Vector secretKeyBuffer(size, '\0'); + THROW_IF_FAILED(PFEntityGetSecretKey(m_handle, secretKeyBuffer.size(), secretKeyBuffer.data(), nullptr)); + + secretKey = secretKeyBuffer.data(); + return S_OK; +#else + UNREFERENCED_PARAMETER(secretKey); + assert(false); + return S_OK; +#endif + } + catch (Wrappers::Exception& e) + { + if (e.hr == E_PF_NOSECRETKEY) + { + return e.hr; + } + throw e; + } + } + + String APIEndpoint() const + { + size_t size{ 0 }; + THROW_IF_FAILED(PFEntityGetAPIEndpointSize(m_handle, &size)); + + Vector apiEndpoint(size, '\0'); + THROW_IF_FAILED(PFEntityGetAPIEndpoint(m_handle, size, &apiEndpoint[0], nullptr)); + + return String{ apiEndpoint.data() }; + } + + bool IsTitlePlayer() const + { + bool isTitlePlayer; + THROW_IF_FAILED(PFEntityIsTitlePlayer(m_handle, &isTitlePlayer)); + return isTitlePlayer; + } + +private: + Entity(PFEntityHandle handle) : m_handle{ handle } + { + } + + PFEntityHandle m_handle{ nullptr }; +}; + +} +} diff --git a/Source/PlayFabCore/Include/playfab/core/cpp/EventPipeline.h b/Source/PlayFabCore/Include/playfab/core/cpp/EventPipeline.h new file mode 100644 index 0000000..cff55d9 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/cpp/EventPipeline.h @@ -0,0 +1,148 @@ +#include +#include "PlayFabException.h" +#include + +namespace PlayFab +{ + +enum class PFEventPipelineType : uint32_t +{ + PlayStream, + Telemetry +}; + +namespace Wrappers +{ + +class EventPipeline +{ +public: + // Creates a EventPipeline by wrapping a PFEventPipelineHandle (transfers ownership of the handle) + static EventPipeline Wrap(PFEventPipelineHandle handle) + { + return EventPipeline{ handle }; + } + + // Creates a EventPipeline by duplicating a PFEventPipelineHandle (caller still owns provided handle) + static EventPipeline Duplicate(PFEventPipelineHandle handle) + { + PFEventPipelineHandle duplicatedHandle; + THROW_IF_FAILED(PFEventPipelineDuplicateHandle(handle, &duplicatedHandle)); + return EventPipeline{ duplicatedHandle }; + } + + EventPipeline() { }; + + EventPipeline( + PFEventPipelineTelemetryKeyConfig* eventPipelineTelemetryKeyConfig, + XTaskQueueHandle queue + ) + { + THROW_IF_FAILED(PFEventPipelineCreateTelemetryPipelineHandleWithKey(eventPipelineTelemetryKeyConfig, queue, nullptr, nullptr, nullptr, &m_handle)); + } + + EventPipeline( + PFEventPipelineType pipelineType, + PFEntityHandle entityHandle, + XTaskQueueHandle queue + ) + { + if (pipelineType == PFEventPipelineType::PlayStream) + { + THROW_IF_FAILED(PFEventPipelineCreatePlayStreamPipelineHandle(entityHandle, queue, nullptr, nullptr, nullptr, &m_handle)); + } + else + { + THROW_IF_FAILED(PFEventPipelineCreateTelemetryPipelineHandleWithEntity(entityHandle, queue, nullptr, nullptr, nullptr, &m_handle)); + } + } + + EventPipeline( + PFEventPipelineTelemetryKeyConfig* eventPipelineTelemetryKeyConfig, + XTaskQueueHandle queue, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext + ) + { + THROW_IF_FAILED(PFEventPipelineCreateTelemetryPipelineHandleWithKey(eventPipelineTelemetryKeyConfig, queue, batchUploadedEventHandler, batchFailedEventHandler, handlerContext, &m_handle)); + } + + EventPipeline( + PFEventPipelineType pipelineType, + PFEntityHandle entityHandle, + XTaskQueueHandle queue, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext + ) + { + if (pipelineType == PFEventPipelineType::PlayStream) + { + THROW_IF_FAILED(PFEventPipelineCreatePlayStreamPipelineHandle(entityHandle, queue, batchUploadedEventHandler, batchFailedEventHandler, handlerContext, &m_handle)); + } + else + { + THROW_IF_FAILED(PFEventPipelineCreateTelemetryPipelineHandleWithEntity(entityHandle, queue, batchUploadedEventHandler, batchFailedEventHandler, handlerContext, &m_handle)); + } + } + + EventPipeline(EventPipeline const& other) + { + THROW_IF_FAILED(PFEventPipelineDuplicateHandle(other.m_handle, &m_handle)); + } + + EventPipeline(EventPipeline&& other) + { + std::swap(m_handle, other.m_handle); + } + + EventPipeline& operator=(EventPipeline other) + { + std::swap(m_handle, other.m_handle); + return *this; + } + + virtual ~EventPipeline() + { + if (m_handle) + { + PFEventPipelineCloseHandle(m_handle); + } + } + + PFEventPipelineHandle Handle() const noexcept + { + return m_handle; + } + + HRESULT EmitEvent(PFEvent const* event) const noexcept + { + return PFEventPipelineEmitEvent(m_handle, event); + } + + HRESULT AddUploadingEntity(PFEntityHandle entityHandle) const noexcept + { + return PFEventPipelineAddUploadingEntity(m_handle, entityHandle); + } + + HRESULT RemoveUploadingEntity() const noexcept + { + return PFEventPipelineRemoveUploadingEntity(m_handle); + } + + HRESULT UpdateConfiguration(PFEventPipelineConfig eventPipelineConfig) const noexcept + { + return PFEventPipelineUpdateConfiguration(m_handle, eventPipelineConfig); + } + +private: + EventPipeline(PFEventPipelineHandle handle) : m_handle{ handle } + { + } + + PFEventPipelineHandle m_handle{ nullptr }; +}; + +} +} diff --git a/Source/PlayFabCore/Include/playfab/core/cpp/PlayFabException.h b/Source/PlayFabCore/Include/playfab/core/cpp/PlayFabException.h new file mode 100644 index 0000000..8f71a35 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/cpp/PlayFabException.h @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +struct Exception : public std::exception +{ + Exception(HRESULT _hr) : hr{ _hr } + { + } + HRESULT const hr; +}; + +#define THROW_IF_FAILED(hr) do { HRESULT __hrRet = hr; if (FAILED(__hrRet)) { throw PlayFab::Wrappers::Exception{ __hrRet }; }} while (0, 0) + +} +} diff --git a/Source/PlayFabCore/Include/playfab/core/cpp/ServiceConfig.h b/Source/PlayFabCore/Include/playfab/core/cpp/ServiceConfig.h new file mode 100644 index 0000000..791faa5 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/cpp/ServiceConfig.h @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class ServiceConfig +{ +public: + using String = typename std::basic_string, Alloc>; + template + using Vector = typename std::vector>; + + // Creates a ServiceConfig by wrapping a PFServiceConfigHandle (transfers ownership of the handle) + static ServiceConfig Wrap(PFServiceConfigHandle handle) + { + return ServiceConfig{ handle }; + } + + // Creates a TitlePlayer by duplicating a PFServiceConfigHandle (caller still owns provided handle) + static ServiceConfig Duplicate(PFServiceConfigHandle handle) + { + PFServiceConfigHandle duplicatedHandle; + THROW_IF_FAILED(PFServiceConfigDuplicateHandle(handle, &duplicatedHandle)); + return ServiceConfig{ duplicatedHandle }; + } + + ServiceConfig(_In_z_ const char* apiEndpoint, _In_z_ const char* titleId) + { + THROW_IF_FAILED(PFServiceConfigCreateHandle(apiEndpoint, titleId, &m_handle)); + } + + ServiceConfig(ServiceConfig const& other) + { + THROW_IF_FAILED(PFServiceConfigDuplicateHandle(other.m_handle, &m_handle)); + } + + ServiceConfig(ServiceConfig&& other) + { + std::swap(m_handle, other.m_handle); + } + + ServiceConfig& operator=(ServiceConfig other) + { + std::swap(m_handle, other.m_handle); + return *this; + } + + virtual ~ServiceConfig() + { + if (m_handle) + { + PFServiceConfigCloseHandle(m_handle); + } + } + + PFServiceConfigHandle Handle() const noexcept + { + return m_handle; + } + + String APIEndpoint() const + { + size_t size{ 0 }; + THROW_IF_FAILED(PFServiceConfigGetAPIEndpointSize(m_handle, &size)); + + Vector apiEndpoint(size, '\0'); + THROW_IF_FAILED(PFServiceConfigGetAPIEndpoint(m_handle, size, &apiEndpoint[0], nullptr)); + + return String{ apiEndpoint.data() }; + } + + String TitleId() const + { + size_t size{ 0 }; + THROW_IF_FAILED(PFServiceConfigGetTitleIdSize(m_handle, &size)); + + Vector titleId(size, '\0'); + THROW_IF_FAILED(PFServiceConfigGetTitleId(m_handle, titleId.size(), &titleId[0], nullptr)); + + return String{ titleId.data() }; + } + +private: + ServiceConfig(PFServiceConfigHandle handle) : m_handle{ handle } + { + } + + PFServiceConfigHandle m_handle{ nullptr }; +}; + +} +} diff --git a/Source/PlayFabCore/Include/playfab/core/cpp/TypeWrapperHelpers.h b/Source/PlayFabCore/Include/playfab/core/cpp/TypeWrapperHelpers.h new file mode 100644 index 0000000..01f5139 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/core/cpp/TypeWrapperHelpers.h @@ -0,0 +1,671 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include +#include +#include + +namespace PlayFab +{ +namespace Detail +{ + +template +struct IsDictionaryEntry : std::false_type {}; + +template +struct IsDictionaryEntry&& std::is_same_v>> : std::true_type {}; + +} + +namespace Wrappers +{ + +inline const char* SafeString(const char* input) +{ + static const char* emptyString{ "" }; + return input ? input : emptyString; +} + +template class Alloc = std::allocator> +class ModelWrapper +{ +public: + ModelWrapper() = default; + ModelWrapper(const ModelT& src) : m_model{ src } {} + ModelWrapper(const ModelWrapper&) = default; + ModelWrapper(ModelWrapper&&) = default; + ModelWrapper& operator=(const ModelWrapper&) = default; + ModelWrapper& operator=(ModelWrapper&&) = default; + virtual ~ModelWrapper() = default; + + ModelT const& Model() const + { + return m_model; + } +protected: + ModelT m_model{}; +}; + +template class Alloc = std::allocator> +class JsonObject +{ +public: + using String = typename std::basic_string, Alloc>; + + JsonObject() = default; + JsonObject(const PFJsonObject& value) : stringValue{ SafeString(value.stringValue) } {} + JsonObject(const char* value) : stringValue{ SafeString(value) } {} + JsonObject(String value) : stringValue{ std::move(value) } {} + JsonObject(const JsonObject& src) = default; + JsonObject(JsonObject&& src) = default; + JsonObject& operator=(const JsonObject& src) = default; + ~JsonObject() = default; + + String stringValue; +}; + +template class Alloc = std::allocator> +class PointerVector +{ +public: + using value_vector_type = std::vector>; + using pointer_vector_type = std::vector>; + using value_type = typename value_vector_type::value_type; + using pointer_type = typename pointer_vector_type::value_type; + using size_type = typename value_vector_type::size_type; + + PointerVector() = default; + PointerVector(const PointerVector& src) = default; + PointerVector(PointerVector&& src) = default; + PointerVector& operator=(const PointerVector& src); + PointerVector& operator=(PointerVector&&) = default; + virtual ~PointerVector() = default; + + // element access + value_type const& operator[](size_type index) const; + pointer_type const* data() noexcept; + pointer_type const* const data() const noexcept; + + // capacity + bool empty() const noexcept; + size_type size() const noexcept; + void reserve(size_type capacity) noexcept; + + // modifiers + void clear() noexcept; + void push_back(const value_type& value); + void push_back(value_type&& value); + +protected: + virtual pointer_type GetPointer(const value_type& value) const = 0; + + pointer_vector_type m_pointers; + value_vector_type m_values; +}; + +template class Alloc = std::allocator> +class DictionaryEntryVector +{ +public: + static_assert(Detail::IsDictionaryEntry::value, "EntryT must have const char* \"key\" and \"value\" properties"); + + using entry_vector_type = std::vector>; + using entry_type = EntryT; + using key_type = std::basic_string, Alloc>; + using value_type = decltype(EntryT::value); + using size_type = typename entry_vector_type::size_type; + + DictionaryEntryVector() = default; + DictionaryEntryVector(entry_type const* begin, entry_type const* end); + DictionaryEntryVector(const DictionaryEntryVector& src); + DictionaryEntryVector(DictionaryEntryVector&& src) = default; + DictionaryEntryVector& operator=(const DictionaryEntryVector& src); + DictionaryEntryVector& operator=(DictionaryEntryVector&& src) = default; + virtual ~DictionaryEntryVector() = default; + + // element access (vector-style and map-style) + entry_type const& operator[](size_type index) const; + entry_type const* data() noexcept; + entry_type const* const data() const noexcept; + value_type& at(const key_type& key); + value_type const& at(const key_type& key) const; + + // capacity + bool empty() const noexcept; + size_type size() const noexcept; + void reserve(size_type capacity) noexcept; + + // modifiers (map-style) + void clear() noexcept; + std::pair insert_or_assign(const key_type& key, value_type value); + std::pair insert_or_assign(const entry_type& entry); + +protected: + entry_vector_type m_entries; + std::map, Alloc>> m_map; // maps keys to entries index +}; + +template class Alloc = std::allocator> +class PointerDictionaryEntryVector : public DictionaryEntryVector +{ +public: + using typename DictionaryEntryVector::entry_vector_type; + using typename DictionaryEntryVector::entry_type; + using typename DictionaryEntryVector::key_type; + using value_type = ValueT; + using pointer_type = decltype(EntryT::value); + using typename DictionaryEntryVector::size_type; + + PointerDictionaryEntryVector() = default; + PointerDictionaryEntryVector(const PointerDictionaryEntryVector& src) = default; + PointerDictionaryEntryVector(PointerDictionaryEntryVector&& src) = default; + PointerDictionaryEntryVector& operator=(const PointerDictionaryEntryVector& src); + PointerDictionaryEntryVector& operator=(PointerDictionaryEntryVector&& src) = default; + virtual ~PointerDictionaryEntryVector() = default; + + value_type const& at(const key_type& key) const; + void reserve(size_type capacity) noexcept; + void clear() noexcept; + std::pair insert_or_assign(const key_type& key, value_type&& value); + template>*> + std::pair insert_or_assign(const entry_type& entry); + +protected: + virtual pointer_type GetPointer(const value_type& value) const = 0; + + using DictionaryEntryVector::m_entries; + using DictionaryEntryVector::m_map; + std::vector> m_values; +}; + +template class Alloc = std::allocator> +class ModelVector : public PointerVector +{ +public: + using PointerVectorType = PointerVector; + + ModelVector() = default; + ModelVector(typename ModelWrapperT::ModelType const* const* begin, typename ModelWrapperT::ModelType const* const* end); + ModelVector(const ModelVector& src); + ModelVector(ModelVector&& src) = default; + ModelVector& operator=(const ModelVector& src) = default; + ModelVector& operator=(ModelVector&&) = default; + ~ModelVector() = default; + +private: + typename PointerVectorType::pointer_type GetPointer(const typename PointerVectorType::value_type& value) const override + { + return &value.Model(); + } +}; + +template class Alloc = std::allocator> +class CStringVector : public PointerVector, Alloc>, Alloc> +{ +public: + using PointerVectorType = PointerVector, Alloc>, Alloc>; + + using PointerVectorType::PointerVectorType; + CStringVector() = default; + CStringVector(const char* const* begin, const char* const* end); + CStringVector(std::initializer_list, Alloc>> init); + CStringVector(const CStringVector& src); + +private: + typename PointerVectorType::pointer_type GetPointer(const typename PointerVectorType::value_type& value) const override + { + return value.data(); + } +}; + +template class Alloc = std::allocator> +class ModelDictionaryEntryVector : public PointerDictionaryEntryVector +{ +public: + using PointerDictionaryEntryVectorType = PointerDictionaryEntryVector; + + using PointerDictionaryEntryVectorType::PointerDictionaryEntryVectorType; + ModelDictionaryEntryVector() = default; + ModelDictionaryEntryVector(typename ModelWrapperT::DictionaryEntryType const* begin, typename ModelWrapperT::DictionaryEntryType const* end); + ModelDictionaryEntryVector(const ModelDictionaryEntryVector& src); + +private: + typename PointerDictionaryEntryVectorType::pointer_type GetPointer(const typename PointerDictionaryEntryVectorType::value_type& value) const override + { + return &value.Model(); + } +}; + +template class Alloc = std::allocator> +class StringDictionaryEntryVector : public PointerDictionaryEntryVector, Alloc>, Alloc> +{ +public: + using PointerDictionaryEntryVectorType = PointerDictionaryEntryVector, Alloc>, Alloc>; + + using PointerDictionaryEntryVectorType::PointerDictionaryEntryVectorType; + StringDictionaryEntryVector() = default; + StringDictionaryEntryVector(PFStringDictionaryEntry const* begin, PFStringDictionaryEntry const* end); + StringDictionaryEntryVector(const StringDictionaryEntryVector& src); + +private: + typename PointerDictionaryEntryVectorType::pointer_type GetPointer(const typename PointerDictionaryEntryVectorType::value_type& value) const override + { + return value.data(); + } +}; + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +template class Alloc> +PointerVector& PointerVector::operator=(const PointerVector& src) +{ + m_values = src.m_values; + m_pointers.clear(); + for (auto& value : m_values) + { + m_pointers.emplace_back(GetPointer(value)); + } + return *this; +} + +template class Alloc> +typename PointerVector::value_type const& PointerVector::operator[](size_type index) const +{ + return m_values[index]; +} + +template class Alloc> +typename PointerVector::pointer_type const* PointerVector::data() noexcept +{ + return m_pointers.data(); +} + +template class Alloc> +typename PointerVector::pointer_type const* const PointerVector::data() const noexcept +{ + return m_pointers.data(); +} + +template class Alloc> +bool PointerVector::empty() const noexcept +{ + assert(m_pointers.empty() == m_values.empty()); + return m_pointers.empty(); +} + + +template class Alloc> +typename PointerVector::size_type PointerVector::size() const noexcept +{ + assert(m_pointers.size() == m_values.size()); + return m_pointers.size(); +} + +template class Alloc> +void PointerVector::reserve(size_type capacity) noexcept +{ + m_pointers.reserve(capacity); + m_values.reserve(capacity); +} + +template class Alloc> +void PointerVector::clear() noexcept +{ + m_pointers.clear(); + m_values.clear(); +} + +template class Alloc> +void PointerVector::push_back(const value_type& value) +{ + auto remainingCapacity = m_values.capacity() - m_values.size(); + m_values.push_back(value); + if (remainingCapacity) + { + m_pointers.push_back(GetPointer(m_values.back())); + } + else + { + // reallocation happened, pointers invalidated + m_pointers.emplace_back(); + std::transform(m_values.begin(), m_values.end(), m_pointers.begin(), [this](const ValueT& v) { return this->GetPointer(v); }); + } +} + +template class Alloc> +void PointerVector::push_back(value_type&& value) +{ + auto remainingCapacity = m_values.capacity() - m_values.size(); + m_values.push_back(std::move(value)); + if (remainingCapacity) + { + m_pointers.push_back(GetPointer(m_values.back())); + } + else + { + // reallocation happened, pointers invalidated + m_pointers.emplace_back(); + std::transform(m_values.begin(), m_values.end(), m_pointers.begin(), [this](const ValueT& v) { return this->GetPointer(v); }); + } +} + +template class Alloc> +DictionaryEntryVector::DictionaryEntryVector(entry_type const* begin, entry_type const* end) +{ + m_entries.reserve(end - begin); + for (;begin != end; ++begin) + { + insert_or_assign(*begin); + } +} + +template class Alloc> +DictionaryEntryVector::DictionaryEntryVector(const DictionaryEntryVector& src) + : m_entries{ src.m_entries }, + m_map{ src.m_map } +{ + for (auto& mapEntry : m_map) + { + m_entries[mapEntry.second].key = mapEntry.first.data(); + } +} + +template class Alloc> +DictionaryEntryVector& DictionaryEntryVector::operator=(const DictionaryEntryVector& src) +{ + m_entries = src.m_entries; + m_map = src.m_map; + + for (auto& mapEntry : m_map) + { + m_entries[mapEntry.second].key = mapEntry.first.data(); + } + return *this; +} + +template class Alloc> +typename DictionaryEntryVector::entry_type const& DictionaryEntryVector::operator[](size_type index) const +{ + return m_entries[index]; +} + +template class Alloc> +typename DictionaryEntryVector::entry_type const* DictionaryEntryVector::data() noexcept +{ + return m_entries.data(); +} + +template class Alloc> +typename DictionaryEntryVector::entry_type const* const DictionaryEntryVector::data() const noexcept +{ + return m_entries.data(); +} + +template class Alloc> +typename DictionaryEntryVector::value_type& DictionaryEntryVector::at(const key_type& key) +{ + auto iter = m_map.find(key); + if (iter == m_map.end()) + { + throw std::out_of_range(""); + } + return m_entries[iter->second].value; +} + +template class Alloc> +typename DictionaryEntryVector::value_type const& DictionaryEntryVector::at(const key_type& key) const +{ + auto iter = m_map.find(key); + if (iter == m_map.end()) + { + throw std::out_of_range(""); + } + return m_entries[iter->second].value; +} + +template class Alloc> +bool DictionaryEntryVector::empty() const noexcept +{ + assert(m_entries.empty() == m_map.empty()); + return m_entries.empty(); +} + +template class Alloc> +typename DictionaryEntryVector::size_type DictionaryEntryVector::size() const noexcept +{ + assert(m_entries.size() == m_map.size()); + return m_entries.size(); +} + +template class Alloc> +void DictionaryEntryVector::reserve(size_type capacity) noexcept +{ + m_entries.reserve(capacity); +} + +template class Alloc> +void DictionaryEntryVector::clear() noexcept +{ + m_entries.clear(); + m_map.clear(); +} + +template class Alloc> +std::pair::entry_type const*, bool> DictionaryEntryVector::insert_or_assign(const key_type& key, value_type value) +{ + auto pair = m_map.emplace(key, m_entries.size()); + if (pair.second) + { + // new entry + m_entries.emplace_back(); + auto& entry = m_entries.back(); + entry.key = pair.first->first.data(); + entry.value = std::move(value); + return std::make_pair(&entry, true); + } + else + { + auto& entry = m_entries[pair.first->second]; + entry.value = std::move(value); + return std::make_pair(&entry, false); + } +} +template class Alloc> +std::pair::entry_type const*, bool> DictionaryEntryVector::insert_or_assign(const entry_type& entry) +{ + return insert_or_assign(entry.key, entry.value); +} + +template class Alloc> +PointerDictionaryEntryVector& PointerDictionaryEntryVector::operator=(const PointerDictionaryEntryVector& src) +{ + DictionaryEntryVector::operator=(src); + m_values = src.m_values; + for (auto& mapEntry : this->m_map) + { + m_entries[mapEntry.second].value = GetPointer(m_values[mapEntry.second]); + } + return *this; +} + +template class Alloc> +typename PointerDictionaryEntryVector::value_type const& PointerDictionaryEntryVector::at(const key_type& key) const +{ + auto iter = m_map.find(key); + if (iter == m_map.end()) + { + throw std::out_of_range(""); + } + return m_values[iter->second]; +} + +template class Alloc> +void PointerDictionaryEntryVector::reserve(size_type capacity) noexcept +{ + m_entries.reserve(capacity); + m_values.reserve(capacity); +} + +template class Alloc> +void PointerDictionaryEntryVector::clear() noexcept +{ + DictionaryEntryVector::clear(); + m_values.clear(); +} + +template class Alloc> +std::pair PointerDictionaryEntryVector::insert_or_assign(const key_type& key, value_type&& value) +{ + assert(m_entries.size() == m_values.size()); + auto pair = m_map.emplace(key, m_entries.size()); + if (pair.second) + { + // new entry + m_entries.emplace_back(); + auto& entry = m_entries.back(); + entry.key = pair.first->first.data(); + + auto remainingCapacity = m_values.capacity() - m_values.size(); + m_values.emplace_back(std::move(value)); + if (remainingCapacity) + { + entry.value = GetPointer(m_values.back()); + } + else + { + // reallocation happened, pointers invalidated + for (auto i = 0u; i < m_entries.size(); ++i) + { + m_entries[i].value = GetPointer(m_values[i]); + } + } + + return std::make_pair(&entry, true); + } + else + { + auto& existingValue = m_values[pair.first->second]; + auto& entry = m_entries[pair.first->second]; + + existingValue = std::move(value); + entry.value = GetPointer(existingValue); + + return std::make_pair(&entry, false); + } +} + +template class Alloc> template +std::pair PointerDictionaryEntryVector::insert_or_assign(const entry_type& entry) +{ + return insert_or_assign(entry.key, entry.value); +} + +template class Alloc> +ModelVector::ModelVector(typename ModelWrapperT::ModelType const* const* begin, typename ModelWrapperT::ModelType const* const* end) +{ + size_t count = end - begin; + this->m_pointers.reserve(count); + this->m_values.reserve(count); + for (;begin != end; ++begin) + { + this->push_back(typename PointerVectorType::value_type{ **begin }); + } +} + +template class Alloc> +ModelVector::ModelVector(const ModelVector& src) + : PointerVectorType{ src } +{ + std::transform(this->m_values.begin(), this->m_values.end(), this->m_pointers.begin(), std::bind(&ModelVector::GetPointer, this, std::placeholders::_1)); +} + +template class Alloc> +CStringVector::CStringVector(const char* const* begin, const char* const* end) +{ + size_t count = end - begin; + this->m_pointers.reserve(count); + this->m_values.reserve(count); + for (; begin != end; ++begin) + { + this->push_back(SafeString(*begin)); + } +} + +template class Alloc> +CStringVector::CStringVector(std::initializer_list, Alloc>> init) +{ + size_t count = init.size(); + this->m_pointers.reserve(count); + this->m_values.reserve(count); + for (auto&& value : init) + { + this->push_back(std::move(value)); + } +} + +template class Alloc> +CStringVector::CStringVector(const CStringVector& src) + : PointerVectorType{ src } +{ + std::transform(this->m_values.begin(), this->m_values.end(), this->m_pointers.begin(), std::bind(&CStringVector::GetPointer, this, std::placeholders::_1)); +} + +template class Alloc> +ModelDictionaryEntryVector::ModelDictionaryEntryVector(typename ModelWrapperT::DictionaryEntryType const* begin, typename ModelWrapperT::DictionaryEntryType const* end) +{ + size_t count = end - begin; + this->m_entries.reserve(count); + this->m_values.reserve(count); + for (; begin != end; ++begin) + { + this->insert_or_assign(begin->key, *begin->value); + } +} + +template class Alloc> +ModelDictionaryEntryVector::ModelDictionaryEntryVector(const ModelDictionaryEntryVector& src) + : PointerDictionaryEntryVectorType{ src } +{ + for (auto& mapEntry : this->m_map) + { + this->m_entries[mapEntry.second].value = GetPointer(this->m_values[mapEntry.second]); + } +} + +template class Alloc> +StringDictionaryEntryVector::StringDictionaryEntryVector(PFStringDictionaryEntry const* begin, PFStringDictionaryEntry const* end) +{ + size_t count = end - begin; + this->m_entries.reserve(count); + this->m_values.reserve(count); + for (; begin != end; ++begin) + { + this->insert_or_assign(*begin); + } +} + +template class Alloc> +StringDictionaryEntryVector::StringDictionaryEntryVector(const StringDictionaryEntryVector& src) + : PointerDictionaryEntryVectorType{ src } +{ + for (auto& mapEntry : this->m_map) + { + this->m_entries[mapEntry.second].value = GetPointer(this->m_values[mapEntry.second]); + } +} + +} // Wrappers +} // PlayFab diff --git a/Source/PlayFabCore/Include/playfab/httpClient/PFHCConfig.h b/Source/PlayFabCore/Include/playfab/httpClient/PFHCConfig.h new file mode 100644 index 0000000..1f4bb8b --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/httpClient/PFHCConfig.h @@ -0,0 +1,127 @@ +#pragma once + +// These macros define the "os"s that libHttpClient knows about +#define HC_PLATFORM_UNKNOWN 9999 +#define HC_PLATFORM_WIN32 1 +#define HC_PLATFORM_UWP 2 +#define HC_PLATFORM_XDK 3 +#define HC_PLATFORM_GDK 4 +#define HC_PLATFORM_ANDROID 11 +#define HC_PLATFORM_IOS 21 +#define HC_PLATFORM_MAC 22 +#define HC_PLATFORM_GENERIC 100 +#define HC_PLATFORM_NINTENDO_SWITCH 111 +#define HC_PLATFORM_SONY_PLAYSTATION_4 121 + +#define HC_PLATFORM_GSDK HC_PLATFORM_GDK // For backcompat + +// These macros define the datamodels that libHttpClient knows about +// (a datamodel defines the size of primitive types such as int and pointers) +#define HC_DATAMODEL_UNKNOWN 9999 +#define HC_DATAMODEL_ILP32 1 // int, long and pointer are 32 bits (32 bit platforms) +#define HC_DATAMODEL_LLP64 2 // int and long are 32 bit; long long and pointer are 64 bits (64 bit Windows) +#define HC_DATAMODEL_LP64 3 // int is 32 bit; long and pointer are 64 bits (64 bit Unix) +// see http://www.unix.org/version2/whatsnew/lp64_wp.html for detailed descriptions + +#if defined(HC_PLATFORM) +#if !defined(HC_DATAMODEL) + #error When setting HC_PLATFORM, also please specify the datamodel manually by setting the HC_DATAMODEL macro in your compiler. +#endif +#elif defined(_WIN32) + #include + #include + + #if defined(_GAMING_DESKTOP) || defined(_GAMING_XBOX) || defined(_GAMING_XBOX_XBOXONE) || defined(_GAMING_XBOX_SCARLETT) + #define HC_PLATFORM HC_PLATFORM_GDK + + #if !defined(NTDDI_WIN10_VB) + #define APP_LOCAL_DEVICE_ID_SIZE 32 + typedef struct APP_LOCAL_DEVICE_ID + { + BYTE value[APP_LOCAL_DEVICE_ID_SIZE]; + } APP_LOCAL_DEVICE_ID; + #endif + #elif !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) + #define HC_PLATFORM HC_PLATFORM_WIN32 + #elif WINAPI_FAMILY == WINAPI_FAMILY_PC_APP && _WIN32_WINNT >= _WIN32_WINNT_WIN10 + #define HC_PLATFORM HC_PLATFORM_UWP + #elif WINAPI_FAMILY == WINAPI_FAMILY_TV_APP || WINAPI_FAMILY == WINAPI_FAMILY_TV_TITLE + #define HC_PLATFORM HC_PLATFORM_XDK + #else + #error Cannot recognize Windows flavor + #endif + + #if defined(_WIN64) + #define HC_DATAMODEL HC_DATAMODEL_LLP64 + #else + #define HC_DATAMODEL HC_DATAMODEL_ILP32 + #endif +#elif defined(__ANDROID__) + #define HC_PLATFORM HC_PLATFORM_ANDROID + + #if defined(__LP64__) + #define HC_DATAMODEL HC_DATAMODEL_LP64 + #else + #define HC_DATAMODEL HC_DATAMODEL_ILP32 + #endif +#elif defined(__APPLE__) + #include + #if TARGET_OS_MAC == 1 + #if TARGET_OS_OSX + #define HC_PLATFORM HC_PLATFORM_MAC + #else + #define HC_PLATFORM HC_PLATFORM_IOS + #endif + #else + #error Cannot recognize Apple OS flavor + #endif + + #if defined(__LP64__) + #define HC_DATAMODEL HC_DATAMODEL_LP64 + #else + #define HC_DATAMODEL HC_DATAMODEL_ILP32 + #endif +#else + #if !defined(HC_DATAMODEL) + #error libHttpClient does not recognize this platform, please specify the datamodel manually by setting the HC_DATAMODEL macro in your compiler. + #endif +#endif + +// HC_PLATFORM defines the "os" that libHttpClient is being built for +#if !defined(HC_PLATFORM) +#pragma warning(libHttpClient does not recognize this platform) +#define HC_PLATFORM HC_PLATFORM_UNKNOWN +#endif + +// HC_PLATFORM defines the datamodel that libHttpClient is being built for +#if !defined(HC_DATAMODEL) +#error libHttpClient does not recognize the datamodel used on this platform. +#define HC_DATAMODEL HC_DATAMODEL_UNKNOWN +#elif HC_DATAMODEL != HC_DATAMODEL_ILP32 && HC_DATAMODEL != HC_DATAMODEL_LLP64 && HC_DATAMODEL != HC_DATAMODEL_LP64 +#error HC_DATAMODEL is not set to a valid value, it must be one of HC_DATAMODEL_ILP32, HC_DATAMODEL_LLP64, or HC_DATAMODEL_LP64. +#endif + +#if !defined(HC_PLATFORM_IS_MICROSOFT) +#define HC_PLATFORM_IS_MICROSOFT \ +(HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_UWP || HC_PLATFORM == HC_PLATFORM_XDK || HC_PLATFORM == HC_PLATFORM_GDK) +#endif + +#if !defined(HC_PLATFORM_IS_APPLE) +#define HC_PLATFORM_IS_APPLE \ +(HC_PLATFORM == HC_PLATFORM_MAC || HC_PLATFORM == HC_PLATFORM_IOS) +#endif + +// HC_PLATFORM_IS_EXTERNAL describes platforms where the implementation is outside of the libHttpClient repository +#if !defined(HC_PLATFORM_IS_EXTERNAL) +#define HC_PLATFORM_IS_EXTERNAL \ +(HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_GENERIC) +#endif + +#if defined(HC_PLATFORM_MSBUILD_GUESS) && (HC_PLATFORM_MSBUILD_GUESS != HC_PLATFORM) + #error The platform guessed by MSBuild does not agree with the platform selected by config.h +#endif + +#if !defined(HC_WINHTTP_WEBSOCKETS) +#define HC_WINHTTP_WEBSOCKETS \ +(HC_PLATFORM == HC_PLATFORM_GDK) +#endif diff --git a/Source/PlayFabCore/Include/playfab/httpClient/PFHCPal.h b/Source/PlayFabCore/Include/playfab/httpClient/PFHCPal.h new file mode 100644 index 0000000..b27f6f4 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/httpClient/PFHCPal.h @@ -0,0 +1,480 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +#if !defined(__cplusplus) + #error C++11 required +#endif + +#pragma once +#if HC_PLATFORM != HC_PLATFORM_ANDROID +#pragma warning(disable: 4062) // enumerator 'identifier' in switch of enum 'enumeration' is not handled +#pragma warning(disable: 4702) // unreachable code +#endif + +#include +#include +#include + +#include + +#if _WIN32 + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#ifndef NOMINMAX +#define NOMINMAX +#endif + +#include + +#ifndef HC_XDK_API +#define HC_XDK_API (HC_PLATFORM == HC_PLATFORM_XDK) +#endif + +#ifndef HC_UWP_API +#define HC_UWP_API (HC_PLATFORM == HC_PLATFORM_UWP) +#endif + +#if HC_UNITTEST_API +#undef HC_UWP_API +#define HC_UWP_API 1 +#endif + +#define _HRESULTYPEDEF_(_sc) ((HRESULT)_sc) + +// Windows defines these as an inline function so they cannot be +// used in a switch statement. (It would work if we required c++17 support) +#undef E_TIME_CRITICAL_THREAD +#undef E_NOT_SUFFICIENT_BUFFER + +#ifndef E_TIME_CRITICAL_THREAD +#ifndef ERROR_TIME_CRITICAL_THREAD +#define ERROR_TIME_CRITICAL_THREAD 0x1A0 +#endif +#define E_TIME_CRITICAL_THREAD __HRESULT_FROM_WIN32(ERROR_TIME_CRITICAL_THREAD) // 0x800701A0 +#endif + +#ifndef E_NO_TASK_QUEUE +#ifndef ERROR_NO_TASK_QUEUE +#define ERROR_NO_TASK_QUEUE 0x1AB +#endif +#define E_NO_TASK_QUEUE __HRESULT_FROM_WIN32(ERROR_NO_TASK_QUEUE) // 0x800701AB +#endif + +#ifndef E_NOT_SUPPORTED +#define E_NOT_SUPPORTED __HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) // 0x80070032 +#endif + +#ifndef E_NOT_SUFFICIENT_BUFFER +#define E_NOT_SUFFICIENT_BUFFER __HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) // 0x8007007A +#endif + +#ifndef HTTP_E_STATUS_429_TOO_MANY_REQUESTS +#define HTTP_E_STATUS_429_TOO_MANY_REQUESTS _HRESULTYPEDEF_(0x801901ADL) +#endif + + +#else // !HC_PLATFORM_IS_MICROSOFT + +#ifndef HC_ANDROID_API +#define HC_ANDROID_API (HC_PLATFORM == HC_PLATFORM_ANDROID) +#endif + +// not _WIN32 +typedef int32_t HRESULT; + +#define CALLBACK + +#ifndef __cdecl +#define __cdecl +#endif + +#ifndef __stdcal +#define __stdcall +#endif + +#ifndef __forceinline +#define __forceinline inline +#endif + +#ifndef EXTERN_C +#ifdef __cplusplus +#define EXTERN_C extern "C" +#else +#define EXTERN_C extern +#endif +#endif + +#ifndef HANDLE +typedef void* HANDLE; +#endif + +#define SEVERITY_SUCCESS 0 +#define SEVERITY_ERROR 1 + +#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) +#define FAILED(hr) (((HRESULT)(hr)) < 0) + +#define HRESULT_CODE(hr) ((hr) & 0xFFFF) +#define SCODE_CODE(sc) ((sc) & 0xFFFF) + +#define HRESULT_FACILITY(hr) (((hr) >> 16) & 0x1fff) +#define SCODE_FACILITY(sc) (((sc) >> 16) & 0x1fff) + +#define HRESULT_SEVERITY(hr) (((hr) >> 31) & 0x1) +#define SCODE_SEVERITY(sc) (((sc) >> 31) & 0x1) + +#define MAKE_HRESULT(sev,fac,code) \ + ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) ) +#define MAKE_SCODE(sev,fac,code) \ + ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) ) + +#define FACILITY_WIN32 7 +#define FACILITY_INTERNET 12 +#define FACILITY_HTTP 25 + +#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc) +#define _HRESULTYPEDEF_(_sc) ((HRESULT)_sc) +#define __HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000))) + +#define S_OK ((HRESULT)0L) +#define E_NOTIMPL _HRESULTYPEDEF_(0x80004001L) +#define E_OUTOFMEMORY _HRESULTYPEDEF_(0x8007000EL) +#define E_INVALIDARG _HRESULTYPEDEF_(0x80070057L) +#define E_ABORT _HRESULTYPEDEF_(0x80004004L) +#define E_FAIL _HRESULTYPEDEF_(0x80004005L) +#define E_ACCESSDENIED _HRESULTYPEDEF_(0x80070005L) +#define E_PENDING _HRESULTYPEDEF_(0x8000000AL) +#define E_UNEXPECTED _HRESULTYPEDEF_(0x8000FFFFL) +#define E_POINTER _HRESULTYPEDEF_(0x80004003L) +#define E_TIME_CRITICAL_THREAD _HRESULTYPEDEF_(0x800701A0L) +#define E_NO_TASK_QUEUE _HRESULTYPEDEF_(0x800701ABL) +#define E_NOT_SUPPORTED _HRESULTYPEDEF_(0x80070032L) +#define E_NOT_SUFFICIENT_BUFFER _HRESULTYPEDEF_(0x8007007AL) +#define E_NOINTERFACE _HRESULTYPEDEF_(0x80004002L) +#define E_BOUNDS _HRESULTYPEDEF_(0x8000000BL) +#define E_ILLEGAL_METHOD_CALL _HRESULTYPEDEF_(0x8000000EL) +#define HTTP_E_STATUS_AMBIGUOUS _HRESULTYPEDEF_(0x8019012CL) +#define HTTP_E_STATUS_BAD_GATEWAY _HRESULTYPEDEF_(0x801901F6L) +#define HTTP_E_STATUS_BAD_METHOD _HRESULTYPEDEF_(0x80190195L) +#define HTTP_E_STATUS_BAD_REQUEST _HRESULTYPEDEF_(0x80190190L) +#define HTTP_E_STATUS_CONFLICT _HRESULTYPEDEF_(0x80190199L) +#define HTTP_E_STATUS_DENIED _HRESULTYPEDEF_(0x80190191L) +#define HTTP_E_STATUS_EXPECTATION_FAILED _HRESULTYPEDEF_(0x801901A1L) +#define HTTP_E_STATUS_429_TOO_MANY_REQUESTS _HRESULTYPEDEF_(0x801901ADL) +#define HTTP_E_STATUS_FORBIDDEN _HRESULTYPEDEF_(0x80190193L) +#define HTTP_E_STATUS_GATEWAY_TIMEOUT _HRESULTYPEDEF_(0x801901F8L) +#define HTTP_E_STATUS_GONE _HRESULTYPEDEF_(0x8019019AL) +#define HTTP_E_STATUS_LENGTH_REQUIRED _HRESULTYPEDEF_(0x8019019BL) +#define HTTP_E_STATUS_MOVED _HRESULTYPEDEF_(0x8019012DL) +#define HTTP_E_STATUS_NONE_ACCEPTABLE _HRESULTYPEDEF_(0x80190196L) +#define HTTP_E_STATUS_NOT_FOUND _HRESULTYPEDEF_(0x80190194L) +#define HTTP_E_STATUS_NOT_MODIFIED _HRESULTYPEDEF_(0x80190130L) +#define HTTP_E_STATUS_NOT_SUPPORTED _HRESULTYPEDEF_(0x801901F5L) +#define HTTP_E_STATUS_PAYMENT_REQ _HRESULTYPEDEF_(0x80190192L) +#define HTTP_E_STATUS_PRECOND_FAILED _HRESULTYPEDEF_(0x8019019CL) +#define HTTP_E_STATUS_PROXY_AUTH_REQ _HRESULTYPEDEF_(0x80190197L) +#define HTTP_E_STATUS_RANGE_NOT_SATISFIABLE _HRESULTYPEDEF_(0x801901A0L) +#define HTTP_E_STATUS_REDIRECT _HRESULTYPEDEF_(0x8019012EL) +#define HTTP_E_STATUS_REDIRECT_KEEP_VERB _HRESULTYPEDEF_(0x80190133L) +#define HTTP_E_STATUS_REDIRECT_METHOD _HRESULTYPEDEF_(0x8019012FL) +#define HTTP_E_STATUS_REQUEST_TIMEOUT _HRESULTYPEDEF_(0x80190198L) +#define HTTP_E_STATUS_REQUEST_TOO_LARGE _HRESULTYPEDEF_(0x8019019DL) +#define HTTP_E_STATUS_SERVER_ERROR _HRESULTYPEDEF_(0x801901F4L) +#define HTTP_E_STATUS_SERVICE_UNAVAIL _HRESULTYPEDEF_(0x801901F7L) +#define HTTP_E_STATUS_UNEXPECTED _HRESULTYPEDEF_(0x80190001L) +#define HTTP_E_STATUS_UNEXPECTED_SERVER_ERROR _HRESULTYPEDEF_(0x80190005L) +#define HTTP_E_STATUS_UNSUPPORTED_MEDIA _HRESULTYPEDEF_(0x8019019FL) +#define HTTP_E_STATUS_URI_TOO_LONG _HRESULTYPEDEF_(0x8019019EL) +#define HTTP_E_STATUS_USE_PROXY _HRESULTYPEDEF_(0x80190131L) +#define HTTP_E_STATUS_VERSION_NOT_SUP _HRESULTYPEDEF_(0x801901F9L) +#define ONL_E_ACTION_REQUIRED _HRESULTYPEDEF_(0x8086000CL) +#define WEB_E_INVALID_JSON_STRING _HRESULTYPEDEF_(0x83750007L) +#define WEB_E_UNEXPECTED_CONTENT _HRESULTYPEDEF_(0x83750005L) + +#define ERROR_ARITHMETIC_OVERFLOW 534L +#define ERROR_BAD_CONFIGURATION 1610L +#define ERROR_BAD_LENGTH 24L +#define ERROR_CANCELLED 1223L +#define ERROR_NO_SUCH_USER 1317L +#define ERROR_RESOURCE_DATA_NOT_FOUND 1812L + +#define ZeroMemory(Destination,Length) memset((Destination),0,(Length)) + +// +// Calculate the address of the base of the structure given its type, and an +// address of a field within the structure. +// + +#define CONTAINING_RECORD(address, type, field) \ + ((type *)((char*)(address) - (uintptr_t)(&((type *)0)->field))) + +#ifndef _Field_size_ +#define _Field_size_(bytes) +#endif + +#ifndef _Field_size_bytes_ +#define _Field_size_bytes_(bytes) +#endif + +#ifndef _Field_size_bytes_opt_ +#define _Field_size_bytes_opt_(bytes) +#endif + +#ifndef _Field_size_opt_ +#define _Field_size_opt_(bytes) +#endif + +#ifndef _Field_z_ +#define _Field_z_ +#endif + +#ifndef _In_ +#define _In_ +#endif + +#ifndef _In_opt_ +#define _In_opt_ +#endif + +#ifndef _In_opt_z_ +#define _In_opt_z_ +#endif + +#ifndef _In_reads_ +#define _In_reads_(size) +#endif + +#ifndef _In_reads_opt_ +#define _In_reads_opt_(size) +#endif + +#ifndef _In_reads_bytes_ +#define _In_reads_bytes_(size) +#endif + +#ifndef _In_reads_bytes_opt_ +#define _In_reads_bytes_opt_(size) +#endif + +#ifndef _In_reads_z_ +#define _In_reads_z_(size) +#endif + +#ifndef _In_z_ +#define _In_z_ +#endif + +#ifndef _Inout_ +#define _Inout_ +#endif + +#ifndef _Inout_updates_bytes_ +#define _Inout_updates_bytes_(size) +#endif + +#ifndef _Null_terminated_ +#define _Null_terminated_ +#endif + +#ifndef _Out_ +#define _Out_ +#endif + +#ifndef _Out_opt_ +#define _Out_opt_ +#endif + +#ifndef _Out_range_ +#define _Out_range_(x, y) +#endif + +#ifndef _Out_writes_ +#define _Out_writes_(bytes) +#endif + +#ifndef _Out_writes_bytes_ +#define _Out_writes_bytes_(bytes) +#endif + +#ifndef _Out_writes_bytes_opt_ +#define _Out_writes_bytes_opt_(size) +#endif + +#ifndef _Out_writes_bytes_to_ +#define _Out_writes_bytes_to_(size, buffer) +#endif + +#ifndef _Out_writes_bytes_to_opt_ +#define _Out_writes_bytes_to_opt_(size, buffer) +#endif + +#ifndef _Out_writes_to_ +#define _Out_writes_to_(bytes, buffer) +#endif + +#ifndef _Out_writes_to_opt_ +#define _Out_writes_to_opt_(buffersize, size) +#endif + +#ifndef _Out_writes_z_ +#define _Out_writes_z_(bytes) +#endif + +#ifndef _Outptr_ +#define _Outptr_ +#endif + +#ifndef _Outptr_opt_ +#define _Outptr_opt_ +#endif + +#ifndef _Outptr_result_maybenull_ +#define _Outptr_result_maybenull_ +#endif + +#ifndef _Outptr_result_bytebuffer_maybenull_ +#define _Outptr_result_bytebuffer_maybenull_(size) +#endif + +#ifndef _Post_invalid_ +#define _Post_invalid_ +#endif + +#ifndef _Post_writable_byte_size_ +#define _Post_writable_byte_size_(X) +#endif + +#ifndef _Printf_format_string_ +#define _Printf_format_string_ +#endif + +#ifndef _Ret_maybenull_ +#define _Ret_maybenull_ +#endif + +#ifndef _Ret_z_ +#define _Ret_z_ +#endif + +#ifndef _Deref_out_opt_ +#define _Deref_out_opt_ +#endif + +#ifndef __analysis_assume +#define __analysis_assume(condition) +#endif + +#ifndef STDAPIVCALLTYPE +#define STDAPIVCALLTYPE __cdecl +#endif + +#ifndef STDAPI +#define STDAPI EXTERN_C HRESULT STDAPIVCALLTYPE +#endif + +#ifndef STDAPI_ +#define STDAPI_(type) EXTERN_C type STDAPIVCALLTYPE +#endif + +#ifndef DEFINE_ENUM_FLAG_OPERATORS + #ifdef __cplusplus + + extern "C++" { + + template + struct _ENUM_FLAG_INTEGER_FOR_SIZE; + + template <> + struct _ENUM_FLAG_INTEGER_FOR_SIZE<1> + { + typedef int8_t type; + }; + + template <> + struct _ENUM_FLAG_INTEGER_FOR_SIZE<2> + { + typedef int16_t type; + }; + + template <> + struct _ENUM_FLAG_INTEGER_FOR_SIZE<4> + { + typedef int32_t type; + }; + + template <> + struct _ENUM_FLAG_INTEGER_FOR_SIZE<8> + { + typedef int64_t type; + }; + + // used as an approximation of std::underlying_type + template + struct _ENUM_FLAG_SIZED_INTEGER + { + typedef typename _ENUM_FLAG_INTEGER_FOR_SIZE::type type; + }; + + } + + #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \ + extern "C++" { \ + inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER::type)a) | ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ + inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER::type &)a) |= ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ + inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER::type)a) & ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ + inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER::type &)a) &= ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ + inline ENUMTYPE operator ~ (ENUMTYPE a) throw() { return ENUMTYPE(~((_ENUM_FLAG_SIZED_INTEGER::type)a)); } \ + inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) throw() { return ENUMTYPE(((_ENUM_FLAG_SIZED_INTEGER::type)a) ^ ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ + inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYPE &)(((_ENUM_FLAG_SIZED_INTEGER::type &)a) ^= ((_ENUM_FLAG_SIZED_INTEGER::type)b)); } \ + } + #else + #define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) // NOP, C allows these operators. + #endif +#endif // DEFINE_ENUM_FLAG_OPERATORS + +#endif // HC_PLATFORM_IS_MICROSOFT + +#define FACILITY_XBOX 2339 +#define MAKE_E_HC(code) MAKE_HRESULT(1, FACILITY_XBOX, code) + +#define E_HC_NOT_INITIALISED MAKE_E_HC(0x5001) // 0x89235001 +#define E_HC_PERFORM_ALREADY_CALLED MAKE_E_HC(0x5003) // 0x89235003 +#define E_HC_ALREADY_INITIALISED MAKE_E_HC(0x5004) // 0x89235004 +#define E_HC_CONNECT_ALREADY_CALLED MAKE_E_HC(0x5005) // 0x89235005 +#define E_HC_NO_NETWORK MAKE_E_HC(0x5006) // 0x89235006 +#define E_HC_NETWORK_NOT_INITIALIZED MAKE_E_HC(0x5007) // 0x89235007 +#define E_HC_INTERNAL_STILLINUSE MAKE_E_HC(0x5008) // 0x89235008 + +typedef uint32_t PFHCMemoryType; +typedef struct HC_WEBSOCKET_OBSERVER* PFHCWebsocketHandle; +typedef struct HC_CALL* PFHCCallHandle; +typedef struct HC_MOCK_CALL* PFHCMockCallHandle; +typedef struct HC_PERFORM_ENV* PFHCPerformEnv; + +extern "C" +{ + +// Error codes from https://www.iana.org/assignments/websocket/websocket.xml#close-code-number +// and from https://docs.microsoft.com/en-us/windows/desktop/api/winhttp/ne-winhttp-_winhttp_web_socket_close_status +// and from https://docs.microsoft.com/en-us/windows/desktop/winhttp/error-messages +enum class PFHCWebSocketCloseStatus : uint32_t +{ + Normal = 1000, + GoingAway = 1001, + ProtocolError = 1002, + Unsupported = 1003, + EmptyStatus = 1005, + AbnormalClose = 1006, + InconsistentDatatype = 1007, + PolicyViolation = 1008, + TooLarge = 1009, + NegotiateError = 1010, + ServerTerminate = 1011, + HandshakeError = 1015, + UnknownError = 4000, + ErrorWinhttpTimeout = 12002 +}; + +} diff --git a/Source/PlayFabCore/Include/playfab/httpClient/PFHCTrace.h b/Source/PlayFabCore/Include/playfab/httpClient/PFHCTrace.h new file mode 100644 index 0000000..30cb602 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/httpClient/PFHCTrace.h @@ -0,0 +1,421 @@ +#if !defined(__cplusplus) + #error C++11 required +#endif + +#pragma once + +#include + +#ifndef PFHC_TRACE_BUILD_LEVEL +#define PFHC_TRACE_BUILD_LEVEL PFHC_PRIVATE_TRACE_LEVEL_VERBOSE +#endif + +extern "C" +{ + +///////////////////////////////////////////////////////////////////////////////////////// +// Tracing APIs +// + +//------------------------------------------------------------------------------ +// Configuration +//------------------------------------------------------------------------------ +// All macros used for configuration are always defined. Clients can define +// their own values for these macros to control tracing behavior +// +// HC_TRACE_BUILD_LEVEL [trace level (0-5)] +// controls the maximum level of verbosity that will be built in the +// executable. To control verbosity at runtime see TraceArea. Set to 0 to +// completely disable tracing +// +// HC_TRACE_TO_DEBUGGER [0,1] +// controls if trace will output using OutputDebugString +// only has an effect when building trace.cpp + +// These defines are not meant to be used by clients at runtime, the +// HCTraceLevel enum should be used instead +#define PFHC_PRIVATE_TRACE_LEVEL_OFF 0 +#define PFHC_PRIVATE_TRACE_LEVEL_ERROR 1 +#define PFHC_PRIVATE_TRACE_LEVEL_WARNING 2 +#define PFHC_PRIVATE_TRACE_LEVEL_IMPORTANT 3 +#define PFHC_PRIVATE_TRACE_LEVEL_INFORMATION 4 +#define PFHC_PRIVATE_TRACE_LEVEL_VERBOSE 5 + +#ifndef PFHC_TRACE_BUILD_LEVEL +#define PFHC_TRACE_BUILD_LEVEL PFHC_PRIVATE_TRACE_LEVEL_VERBOSE +#endif + +#ifndef PFHC_TRACE_TO_DEBUGGER +#define PFHC_TRACE_TO_DEBUGGER 1 +#endif + + +//------------------------------------------------------------------------------ +// Level enabled macros +//------------------------------------------------------------------------------ +// These macros can be used to easily check if a given trace level will be +// included in the build (for example to avoid compiling helper code for a +// trace). +// These macros are always defined +// +// HC_TRACE_ENABLE [0,1] +// HC_TRACE_ERROR_ENABLE [0,1] +// HC_TRACE_WARNING_ENABLE [0,1] +// HC_TRACE_IMPORTANT_ENABLE [0,1] +// HC_TRACE_INFORMATION_ENABLE [0,1] +// HC_TRACE_VERBOSE_ENABLE [0,1] +// +// these should not be manually modified, they are automatically set based on +// the values of HC_TRACE_BUILD_LEVEL + +#if PFHC_TRACE_BUILD_LEVEL > PFHC_PRIVATE_TRACE_LEVEL_OFF + #define PFHC_TRACE_ENABLE 1 +#else + #define PFHC_TRACE_ENABLE 0 +#endif + +#if PFHC_TRACE_BUILD_LEVEL >= PFHC_PRIVATE_TRACE_LEVEL_ERROR + #define PFHC_TRACE_ERROR_ENABLE 1 +#else + #define PFHC_TRACE_ERROR_ENABLE 0 +#endif + +#if PFHC_TRACE_BUILD_LEVEL >= PFHC_PRIVATE_TRACE_LEVEL_WARNING + #define PFHC_TRACE_WARNING_ENABLE 1 +#else + #define PFHC_TRACE_WARNING_ENABLE 0 +#endif + +#if PFHC_TRACE_BUILD_LEVEL >= PFHC_PRIVATE_TRACE_LEVEL_IMPORTANT + #define PFHC_TRACE_IMPORTANT_ENABLE 1 +#else + #define PFHC_TRACE_IMPORTANT_ENABLE 0 +#endif + + +#if PFHC_TRACE_BUILD_LEVEL >= PFHC_PRIVATE_TRACE_LEVEL_INFORMATION + #define PFHC_TRACE_INFORMATION_ENABLE 1 +#else + #define PFHC_TRACE_INFORMATION_ENABLE 0 +#endif + +#if PFHC_TRACE_BUILD_LEVEL >= PFHC_PRIVATE_TRACE_LEVEL_VERBOSE + #define PFHC_TRACE_VERBOSE_ENABLE 1 +#else + #define PFHC_TRACE_VERBOSE_ENABLE 0 +#endif + + +/// +/// Diagnostic level used by tracing. +/// +enum class PFHCTraceLevel : uint32_t +{ + /// + /// No tracing. + /// + Off = PFHC_PRIVATE_TRACE_LEVEL_OFF, + + /// + /// Trace only errors. + /// + Error = PFHC_PRIVATE_TRACE_LEVEL_ERROR, + + /// + /// Trace warnings and errors. + /// + Warning = PFHC_PRIVATE_TRACE_LEVEL_WARNING, + + /// + /// Trace important, warnings and errors. + /// + Important = PFHC_PRIVATE_TRACE_LEVEL_IMPORTANT, + + /// + /// Trace info, important, warnings and errors. + /// + Information = PFHC_PRIVATE_TRACE_LEVEL_INFORMATION, + + /// + /// Trace everything. + /// + Verbose = PFHC_PRIVATE_TRACE_LEVEL_VERBOSE, +}; + +/// +/// Sets the trace level for the library. Traces are sent the debug output. +/// +/// Trace level. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +PF_API PFHCSettingsSetTraceLevel( + _In_ PFHCTraceLevel traceLevel + ) noexcept; + +/// +/// Gets the trace level for the library. +/// +/// Trace level. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +PF_API PFHCSettingsGetTraceLevel( + _Out_ PFHCTraceLevel* traceLevel + ) noexcept; + +/// +/// Register callback for tracing so that the client can merge tracing into their +/// own traces. +/// +typedef void (CALLBACK PFHCTraceCallback)( + _In_z_ const char* areaName, + _In_ PFHCTraceLevel level, + _In_ uint64_t threadId, + _In_ uint64_t timestamp, + _In_z_ const char* message + ); + +/// +/// Set client callback for tracing. +/// +/// Trace callback. +/// +PF_API_(void) PFHCTraceSetClientCallback(_In_opt_ PFHCTraceCallback* callback) noexcept; + +/// +/// Sets or unsets if the trace is sent to the debugger. +/// +/// If True, sends the trace to the debugger. +/// +PF_API_(void) PFHCTraceSetTraceToDebugger(_In_ bool traceToDebugger) noexcept; + + +//------------------------------------------------------------------------------ +// Trace macros +//------------------------------------------------------------------------------ +// These are the macros to be used to log +// These macros are always defined but will compile to nothing if +// HC_TRACE_BUILD_LEVEL is not high enough + +#if PFHC_TRACE_ENABLE + #define PFHC_TRACE_MESSAGE(area, level, format, ...) PFHCTraceImplMessage(&PFHC_PRIVATE_TRACE_AREA_NAME(area), (level), format, ##__VA_ARGS__) + #ifdef __cplusplus + #define PFHC_TRACE_SCOPE(area, level) auto tsh = PFHCTraceImplScopeHelper{ &PFHC_PRIVATE_TRACE_AREA_NAME(area), level, PFHC_FUNCTION } + #else + #define PFHC_TRACE_SCOPE(area, level) + #endif +#else + #define PFHC_TRACE_MESSAGE(area, level, ...) + #define PFHC_TRACE_MESSAGE_WITH_LOCATION(area, level, format, ...) + #define PFHC_TRACE_SCOPE(area, level) +#endif + +#if PFHC_TRACE_ERROR_ENABLE + #define PFHC_TRACE_ERROR(area, msg, ...) PFHC_TRACE_MESSAGE(area, PFHCTraceLevel::Error, msg, ##__VA_ARGS__) + #define PFHC_TRACE_ERROR_HR(area, failedHr, msg) PFHC_TRACE_ERROR(area, "%hs (hr=0x%08x)", msg, failedHr) +#else + #define PFHC_TRACE_ERROR(area, msg, ...) + #define PFHC_TRACE_ERROR_HR(area, failedHr, msg) +#endif + +#if PFHC_TRACE_WARNING_ENABLE + #define PFHC_TRACE_WARNING(area, msg, ...) PFHC_TRACE_MESSAGE(area, PFHCTraceLevel::Warning, msg, ##__VA_ARGS__) + #define PFHC_TRACE_WARNING_HR(area, failedHr, msg) PFHC_TRACE_WARNING(area, "%hs (hr=0x%08x)", msg, failedHr) +#else + #define PFHC_TRACE_WARNING(area, msg, ...) + #define PFHC_TRACE_WARNING_HR(area, failedHr, msg) +#endif + +#if PFHC_TRACE_IMPORTANT_ENABLE + #define PFHC_TRACE_IMPORTANT(area, msg, ...) PFHC_TRACE_MESSAGE(area, PFHCTraceLevel::Important, msg, ##__VA_ARGS__) + #define PFHC_TRACE_SCOPE_IMPORTANT(area) PFHC_TRACE_SCOPE(area, PFHCTraceLevel::Important) +#else + #define PFHC_TRACE_IMPORTANT(area, msg, ...) + #define PFHC_TRACE_SCOPE_IMPORTANT(area) +#endif + +#if PFHC_TRACE_INFORMATION_ENABLE + #define PFHC_TRACE_INFORMATION(area, msg, ...) PFHC_TRACE_MESSAGE(area, PFHCTraceLevel::Information, msg, ##__VA_ARGS__) + #define PFHC_TRACE_SCOPE_INFORMATION(area) PFHC_TRACE_SCOPE(area, PFHCTraceLevel::Information) +#else + #define PFHC_TRACE_INFORMATION(area, msg, ...) + #define PFHC_TRACE_SCOPE_INFORMATION(area) +#endif + +#if PFHC_TRACE_VERBOSE_ENABLE +#define PFHC_TRACE_VERBOSE(area, msg, ...) PFHC_TRACE_MESSAGE(area, PFHCTraceLevel::Verbose, msg, ##__VA_ARGS__) +#define PFHC_TRACE_SCOPE_VERBOSE(area) PFHC_TRACE_SCOPE(area, PFHCTraceLevel::Verbose) +#else + #define PFHC_TRACE_VERBOSE(area, msg, ...) + #define PFHC_TRACE_SCOPE_VERBOSE(area) +#endif + +//------------------------------------------------------------------------------ +// Trace area macros +//------------------------------------------------------------------------------ +// These macros are used to set up areas for tracing +// These macros are always defined but will compile to nothing if trace is +// disabled + +#if PFHC_TRACE_ENABLE + // Defines an area for tracing: + // name is used as a prefix for all traces in the area + // verbosity sets the maximum verbosity that will be traced within this area + // verbosity can be tweaked at runtime by calling HC_TRACE_SET_VERBOSITY(area, + // level) + // since this defines a global variable, it should be only used from a .cpp file + // and each area should be defined only once + #define PFHC_DEFINE_TRACE_AREA(area, verbosity) struct PFHCTraceImplArea PFHC_PRIVATE_TRACE_AREA_NAME(area) = { #area, (verbosity) } + + // Declares a trace area. Since DEFINE_TRACE_AREA can only be used once and in a + // .cpp, this allows to trace in an already defined area from another file + #define PFHC_DECLARE_TRACE_AREA(area) extern struct PFHCTraceImplArea PFHC_PRIVATE_TRACE_AREA_NAME(area) + + // Access to the verbosity property of the area for runtime control + #define PFHC_TRACE_SET_VERBOSITY(area, level) PFHCTraceImplSetAreaVerbosity(&PFHC_PRIVATE_TRACE_AREA_NAME(area), level) + + #define PFHC_TRACE_GET_VERBOSITY(area) PFHCTraceImplGetAreaVerbosity(&PFHC_PRIVATE_TRACE_AREA_NAME(area)) +#else + #define PFHC_DEFINE_TRACE_AREA(name, verbosity) + #define PFHC_DECLARE_TRACE_AREA(name) + #define PFHC_TRACE_SET_VERBOSITY(area, level) + #define PFHC_TRACE_GET_VERBOSITY(area) PFHCTraceLevel::Off +#endif + +//------------------------------------------------------------------------------ +// Platform Hooks +//------------------------------------------------------------------------------ +typedef uint64_t(CALLBACK PFHCTracePlatformThisThreadIdCallback)(void*); +typedef void (CALLBACK PFHCTracePlatformWriteMessageToDebuggerCallback)(char const*, PFHCTraceLevel, char const*, void*); + +/// +/// Sets the Platform Callbacks. +/// +/// The thread ID callback. +/// The thread ID context. +/// The write to debbugger callback. +/// The write to debbugger context. +/// Result code for this API operation. Possible values are S_OK, or E_HC_NOT_INITIALISED. +PF_API PFHCTraceSetPlatformCallbacks( + _In_ PFHCTracePlatformThisThreadIdCallback* threadIdCallback, + _In_opt_ void* threadIdContext, + _In_ PFHCTracePlatformWriteMessageToDebuggerCallback* writeToDebuggerCallback, + _In_opt_ void* writeToDebuggerContext + ) noexcept; + +//------------------------------------------------------------------------------ +// Implementation +//------------------------------------------------------------------------------ +// These symbols are always built even if trace is disabled, but note that no +// trace areas will be defined so they should never be used directly +// the reason why they are always built is to avoid issues with different +// compilation units setting different values for HC_TRACE_BUILD_LEVEL +// the linker will discard everything if tracing is disabled because there will +// be no references + +// DO NOT USE THESE SYMBOLS DIRECTLY + +#define PFHC_PRIVATE_TRACE_AREA_NAME(area) g_trace##area +#define PFHC_FUNCTION __FUNCTION__ + +typedef struct PFHCTraceImplArea +{ + char const* const Name; + PFHCTraceLevel Verbosity; +} PFHCTraceImplArea; + +/// +/// Set the verbosity level of an trace area. +/// +/// The trace area. +/// The verbosity level. +/// +/// This should be accessed through macros, such as HC_TRACE_SET_VERBOSITY, rather than called directly. +EXTERN_C inline + void STDAPIVCALLTYPE PFHCTraceImplSetAreaVerbosity( + struct PFHCTraceImplArea* area, + PFHCTraceLevel verbosity + ) noexcept +{ + area->Verbosity = verbosity; +} + +/// +/// Get the trace verbosity level of an trace area. +/// +/// The trace area. +/// The verbosity level of the area. +/// This should be accessed through macros, such as HC_TRACE_GET_VERBOSITY, rather than called directly. +EXTERN_C inline + PFHCTraceLevel STDAPIVCALLTYPE PFHCTraceImplGetAreaVerbosity(struct PFHCTraceImplArea* area) noexcept +{ + return area->Verbosity; +} + +/// +/// Send a trace message. +/// +/// The trace area. +/// The trace level. +/// The message format and arguments. +/// +/// This should be accessed through macros, such as HC_TRACE_MESSAGE, rather than called directly. +PF_API_(void) PFHCTraceImplMessage( + struct PFHCTraceImplArea const* area, + PFHCTraceLevel level, + _Printf_format_string_ char const* format, + ... + ) noexcept; + +PF_API_(uint64_t) PFHCTraceImplScopeId() noexcept; + +} + +#if defined(__cplusplus) +class PFHCTraceImplScopeHelper +{ +public: + /// + /// PFHCTraceImplScopeHelper ctor. + /// + /// + PFHCTraceImplScopeHelper(PFHCTraceImplArea const* area, PFHCTraceLevel level, char const* scope) noexcept; + + /// + /// PFHCTraceImplScopeHelper dtor. + /// + /// + ~PFHCTraceImplScopeHelper() noexcept; + +private: + PFHCTraceImplArea const* m_area; + PFHCTraceLevel const m_level; + char const* const m_scope; + unsigned long long const m_id; +}; + +/// +/// HCTraceImplScopeHelper constructor. This should be accessed through macros, such as HC_TRACE_SCOPE, +/// rather than called directly. +/// +/// The trace area. +/// The trace level. +/// The trace scope. +/// +inline +PFHCTraceImplScopeHelper::PFHCTraceImplScopeHelper( + PFHCTraceImplArea const* area, + PFHCTraceLevel level, char const* scope +) noexcept + : m_area{ area }, m_level{ level }, m_scope{ scope }, m_id{ PFHCTraceImplScopeId() } +{ + PFHCTraceImplMessage(m_area, m_level, ">>> %s (%016llX)", m_scope, m_id); +} + +/// +/// HCTraceImplScopeHelper destructor. +/// +/// +inline +PFHCTraceImplScopeHelper::~PFHCTraceImplScopeHelper() noexcept +{ + PFHCTraceImplMessage(m_area, m_level, "<<< %s (%016llX)", m_scope, m_id); +} +#endif // defined(__cplusplus) diff --git a/Source/PlayFabCore/Include/playfab/httpClient/PFHttpClient.h b/Source/PlayFabCore/Include/playfab/httpClient/PFHttpClient.h new file mode 100644 index 0000000..aa894c4 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/httpClient/PFHttpClient.h @@ -0,0 +1,1099 @@ +#if !defined(__cplusplus) + #error C++11 required +#endif + +#pragma once + +#include + +#if HC_PLATFORM == HC_PLATFORM_ANDROID +#include "jni.h" +#endif + +extern "C" +{ +///////////////////////////////////////////////////////////////////////////////////////// +// Memory APIs +// + +/// +/// A callback invoked every time a new memory buffer must be dynamically allocated by the library. +/// This callback is optionally installed by calling PFHCMemSetFunctions() +/// +/// The callback must allocate and return a pointer to a contiguous block of memory of the +/// specified size that will remain valid until the app's corresponding PFHCMemFreeFunction +/// callback is invoked to release it. +/// +/// Every non-null pointer returned by this method will be subsequently passed to the corresponding +/// PFHCMemFreeFunction callback once the memory is no longer needed. +/// +/// A pointer to an allocated block of memory of the specified size, or a null +/// pointer if allocation failed. +/// The size of the allocation to be made. This value will never be zero. +/// An opaque identifier representing the internal category of +/// memory being allocated. +typedef _Ret_maybenull_ _Post_writable_byte_size_(size) void* +(STDAPIVCALLTYPE* PFHCMemAllocFunction)( + _In_ size_t size, + _In_ PFHCMemoryType memoryType + ); + +/// +/// A callback invoked every time a previously allocated memory buffer is no longer needed by +/// the library and can be freed. This callback is optionally installed by calling PFHCMemSetFunctions() +/// +/// The callback is invoked whenever the library has finished using a memory buffer previously +/// returned by the app's corresponding PFHCMemAllocFunction such that the application can free the +/// memory buffer. +/// +/// The pointer to the memory buffer previously allocated. This value will +/// never be a null pointer. +/// An opaque identifier representing the internal category of +/// memory being allocated. +typedef void +(STDAPIVCALLTYPE* PFHCMemFreeFunction)( + _In_ _Post_invalid_ void* pointer, + _In_ PFHCMemoryType memoryType + ); + +/// +/// Optionally sets the memory hook functions to allow callers to control route memory +/// allocations to their own memory manager. +/// +/// A pointer to the custom allocation callback to use, or a null +/// pointer to restore the default. +/// A pointer to the custom freeing callback to use, or a null +/// pointer to restore the default. +/// Result code for this API operation. Possible values are S_OK, or E_HC_ALREADY_INITIALIZED. +/// +/// This must be called before PFHCInitialize(). +/// and can not be called again until PFHCCleanup(). +/// +/// This method allows the application to install custom memory allocation routines in order +/// to service all requests for new memory buffers instead of using default allocation routines. +/// +/// The and parameters can be null +/// pointers to restore the default routines. Both callback pointers must be null or both must +/// be non-null. Mixing custom and default routines is not permitted. +/// +PF_API PFHCMemSetFunctions( + _In_opt_ PFHCMemAllocFunction memAllocFunc, + _In_opt_ PFHCMemFreeFunction memFreeFunc + ) noexcept; + +/// +/// Gets the memory hook functions to allow callers to control route memory allocations to their +/// own memory manager. +/// +/// Set to the current allocation callback. Returns the default routine +/// if not previously set. +/// Set to the to the current memory free callback. Returns the default +/// routine if not previously set. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// This method allows the application get the default memory allocation routines. +/// This can be used along with PFHCMemSetFunctions() to monitor all memory allocations. +/// +PF_API PFHCMemGetFunctions( + _Out_ PFHCMemAllocFunction* memAllocFunc, + _Out_ PFHCMemFreeFunction* memFreeFunc + ) noexcept; + +///////////////////////////////////////////////////////////////////////////////////////// +// Global APIs +// + +/// +/// Deprecated. Not needed. +/// +typedef struct PFHCInitArgs +{ + /// + /// Deprecated. Not needed. + /// + void* dummy; +} PFHCInitArgs; + +/// +/// Deprecated. Not needed. Call PFInitialize instead +/// +PF_API_DEPRECATED PFHCInitialize( + _In_opt_ PFHCInitArgs* args + ) noexcept; + +/// +/// Returns true if library has been initialized by PFHCInitialize +/// +/// Returns true if this library has been initialized, otherwise returns false. +PF_API_(bool) PFHCIsInitialized() noexcept; + +/// +/// Deprecated. Not needed. Call PFUninitializeAsync instead +/// +PF_API_DEPRECATED PFHCCleanupAsync( + _In_ XAsyncBlock* async + ) noexcept; + +/// +/// Returns the version of the library. +/// +/// The UTF-8 encoded version of the library in the format of release_year.release_month.date.rev +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +PF_API PFHCGetLibVersion(_Outptr_ const char** version) noexcept; + +/// +/// A callback that will be synchronously invoked each time an HTTP call is performed +/// +/// Handle to the HTTP call. +/// Client context pass when the handler was added. +typedef void +(STDAPIVCALLTYPE* PFHCCallRoutedHandler)( + _In_ PFHCCallHandle call, + _In_opt_ void* context + ); + +/// +/// Adds a callback to be invoked on intermediate http calls in order to debug or trace the traffic. +/// +/// The handler to be called. +/// Client context to pass to callback function. +/// An unique id that can be used to remove the handler. +PF_API_(int32_t) PFHCAddCallRoutedHandler( + _In_ PFHCCallRoutedHandler handler, + _In_opt_ void* context + ) noexcept; + +/// +/// Removes a previously added PFHCCallRoutedHandler. +/// +/// Id returned from the PFHCAddCallRoutedHandler call. +/// +PF_API_(void) PFHCRemoveCallRoutedHandler( + _In_ int32_t handlerId + ) noexcept; + +/// +/// Manually sets an explicit proxy address. +/// +/// The proxy address to use in the "[ip]:[port]" format. +/// Result code for this API operation. Possible values are S_OK, E_HC_NOT_INITIALISED, or E_FAIL. +/// If it is passed a null proxy, it will reset to default. Does not include proxying web socket traffic. +PF_API PFHCSetGlobalProxy(_In_ const char* proxyUri) noexcept; + +///////////////////////////////////////////////////////////////////////////////////////// +// Http APIs +// + +/// +/// Creates an HTTP call handle. +/// +/// The handle of the HTTP call. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// First create a HTTP handle using PFHCHttpCallCreate(). +/// Then call PFHCHttpCallRequestSet*() to prepare the PFHCCallHandle. +/// Then call PFHCHttpCallPerformAsync() to perform HTTP call using the PFHCCallHandle. +/// This call is asynchronous, so the work will be done on a background thread and will return via the callback. +/// +/// The perform call is asynchronous, so the work will be done on a background thread which calls +/// XTaskQueueDispatch( ..., XTaskQueuePort::Work ). +/// +/// The results will return to the callback on the thread that calls +/// XTaskQueueDispatch( ..., XTaskQueuePort::Completion ), then get the result of the HTTP call by calling +/// PFHCHttpCallResponseGet*() to get the HTTP response of the PFHCCallHandle. +/// +/// When the PFHCCallHandle is no longer needed, call PFHCHttpCallCloseHandle() to free the +/// memory associated with the PFHCCallHandle. +/// +PF_API PFHCHttpCallCreate( + _Out_ PFHCCallHandle* call + ) noexcept; + +/// +/// Perform HTTP call using the PFHCCallHandle. +/// +/// The handle of the HTTP call +/// The XAsyncBlock that defines the async operation +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// +/// First create a HTTP handle using PFHCHttpCallCreate(). +/// Then call PFHCHttpCallRequestSet*() to prepare the PFHCCallHandle. +/// Then call PFHCHttpCallPerformAsync() to perform HTTP call using the PFHCCallHandle. +/// This call is asynchronous, so the work will be done on a background thread and will return via the callback. +/// +/// The perform call is asynchronous, so the work will be done on a background thread which calls +/// XTaskQueueDispatch( ..., XTaskQueuePort::Work ). +/// +/// The results will return to the callback on the thread that calls +/// XTaskQueueDispatch( ..., XTaskQueuePort::Completion ), then get the result of the HTTP call by calling +/// PFHCHttpCallResponseGet*() to get the HTTP response of the PFHCCallHandle. +/// +/// When the PFHCCallHandle is no longer needed, call PFHCHttpCallCloseHandle() to free the +/// memory associated with the PFHCCallHandle. +/// +/// PFHCHttpCallPerformAsync can only be called once. Create new PFHCCallHandle to repeat the call. +/// +PF_API PFHCHttpCallPerformAsync( + _In_ PFHCCallHandle call, + _Inout_ XAsyncBlock* asyncBlock + ) noexcept; + +/// +/// Duplicates the PFHCCallHandle object. +/// +/// The handle of the HTTP call. +/// Returns the duplicated handle. +/// Use PFHCHttpCallCloseHandle to close it. +PF_API_(PFHCCallHandle) PFHCHttpCallDuplicateHandle( + _In_ PFHCCallHandle call + ) noexcept; + +/// +/// Decrements the reference count on the call object. +/// +/// The handle of the HTTP call +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// When the PFHCCallHandle ref count is 0, PFHCHttpCallCloseHandle() will free the memory associated with the PFHCCallHandle. +PF_API PFHCHttpCallCloseHandle( + _In_ PFHCCallHandle call + ) noexcept; + +/// +/// Returns a unique uint64_t which identifies this HTTP call object. +/// +/// The handle of the HTTP call. +/// Returns a unique uint64_t which identifies this HTTP call object or 0 if invalid. +PF_API_(uint64_t) PFHCHttpCallGetId( + _In_ PFHCCallHandle call + ) noexcept; + +/// +/// Enables or disables tracing for this specific HTTP call. +/// +/// The handle of the HTTP call. +/// Trace this call. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +PF_API PFHCHttpCallSetTracing( + _In_ PFHCCallHandle call, + _In_ bool traceCall + ) noexcept; + +/// +/// Gets the request url for the HTTP call. +/// +/// The handle of the HTTP call. +/// +/// The UTF-8 encoded url body string of the HTTP call. +/// The memory for the returned string pointer remains valid for the life of the PFHCCallHandle object until PFHCHttpCallCloseHandle() is called on it. +/// +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +PF_API PFHCHttpCallGetRequestUrl( + _In_ PFHCCallHandle call, + _Out_ const char** url + ) noexcept; + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallRequest Set APIs +// + +/// +/// Sets the url and method for the HTTP call. +/// +/// The handle of the HTTP call. +/// UTF-8 encoded method for the HTTP call. +/// UTF-8 encoded URL for the HTTP call. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +PF_API PFHCHttpCallRequestSetUrl( + _In_ PFHCCallHandle call, + _In_z_ const char* method, + _In_z_ const char* url + ) noexcept; + +/// +/// Set the request body bytes of the HTTP call. This API operation is mutually exclusive with +/// PFHCHttpCallRequestSetRequestBodyReadFunction and will result in any custom read callbacks that were +/// previously set on this call handle to be ignored. +/// +/// The handle of the HTTP call. +/// The request body bytes of the HTTP call. +/// The length in bytes of the body being set. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +PF_API PFHCHttpCallRequestSetRequestBodyBytes( + _In_ PFHCCallHandle call, + _In_reads_bytes_(requestBodySize) const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize + ) noexcept; + +/// +/// Set the request body string of the HTTP call. This API operation is mutually exclusive with +/// PFHCHttpCallRequestSetRequestBodyReadFunction and will result in any custom read callbacks that were +/// previously set on this call handle to be ignored. +/// +/// The handle of the HTTP call. +/// The UTF-8 encoded request body string of the HTTP call. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +PF_API PFHCHttpCallRequestSetRequestBodyString( + _In_ PFHCCallHandle call, + _In_z_ const char* requestBodyString + ) noexcept; + +/// +/// The callback definition used by an HTTP call to read the request body. This callback will be invoked +/// on an unspecified background thread which is platform dependent. +/// +/// The handle of the HTTP call. +/// The offset from the beginning of the request body. +/// The maximum number of bytes that can be written to the destination. +/// The context associated with this read function. +/// The destination where data may be written to. +/// The number of bytes that were actually written to destination. +/// Result code for this callback. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +typedef HRESULT +(CALLBACK* PFHCHttpCallRequestBodyReadFunction)( + _In_ PFHCCallHandle call, + _In_ size_t offset, + _In_ size_t bytesAvailable, + _In_opt_ void* context, + _Out_writes_bytes_to_(bytesAvailable, *bytesWritten) uint8_t* destination, + _Out_ size_t* bytesWritten + ); + +/// +/// Sets a custom callback function that will be used to read the request body when the HTTP call is +/// performed. If a custom read callback is used, any request body data previously set by +/// PFHCHttpCallRequestSetRequestBodyBytes or PFHCHttpCallRequestSetRequestBodyString is ignored making +/// these API operations mutually exclusive. +/// +/// The handle of the HTTP call. +/// The request body read function this call should use. +/// The size of the body. +/// The context associated with this read function. +/// Result code of this API operation. Possible values are S_OK or E_INVALIDARG. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +PF_API PFHCHttpCallRequestSetRequestBodyReadFunction( + _In_ PFHCCallHandle call, + _In_ PFHCHttpCallRequestBodyReadFunction readFunction, + _In_ size_t bodySize, + _In_opt_ void* context + ) noexcept; + +/// +/// Set a request header for the HTTP call. +/// +/// The handle of the HTTP call. +/// UTF-8 encoded request header name for the HTTP call. +/// UTF-8 encoded request header value for the HTTP call. +/// Set to false to skip tracing this request header, for example if it contains private information. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +PF_API PFHCHttpCallRequestSetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _In_z_ const char* headerValue, + _In_ bool allowTracing + ) noexcept; + +/// +/// Sets if retry is allowed for this HTTP call. +/// +/// The handle of the HTTP call. Pass nullptr to set the default for future calls. +/// If retry is allowed for this HTTP call. +/// Result code for this API operation. Possible values are S_OK, or E_FAIL. +/// +/// Defaults to true. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +/// +PF_API PFHCHttpCallRequestSetRetryAllowed( + _In_opt_ PFHCCallHandle call, + _In_ bool retryAllowed + ) noexcept; + +/// +/// ID number of this REST endpoint used to cache the Retry-After header for fast fail. +/// +/// The handle of the HTTP call. Pass nullptr to set the default for future calls. +/// ID number of this REST endpoint used to cache the Retry-After header for fast fail. Must be non-zero. 1-1000 are reserved for XSAPI. +/// Result code for this API operation. Possible values are S_OK, or E_FAIL. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +PF_API PFHCHttpCallRequestSetRetryCacheId( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t retryAfterCacheId + ) noexcept; + +/// +/// Sets the timeout for this HTTP call. +/// +/// The handle of the HTTP call. Pass nullptr to set the default for future calls. +/// The timeout for this HTTP call. +/// Result code for this API operation. Possible values are S_OK, or E_FAIL. +/// +/// Defaults to 30 seconds. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +/// +PF_API PFHCHttpCallRequestSetTimeout( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t timeoutInSeconds + ) noexcept; + +/// +/// Sets the HTTP retry delay in seconds. The default and minimum delay is 2 seconds. +/// +/// The handle of the HTTP call. Pass nullptr to set the default for future calls. +/// The retry delay in seconds. +/// Result code for this API operation. Possible values are S_OK, or E_FAIL. +/// +/// Retries are delayed using a exponential back off. By default, it will delay 2 seconds then the +/// next retry will delay 4 seconds, then 8 seconds, and so on up to a max of 1 min until either +/// the call succeeds or the HTTP timeout window is reached, at which point the call will fail. +/// The delay is also jittered between the current and next delay to spread out service load. +/// The default for the HTTP timeout window is 20 seconds and can be changed using PFHCSettingsSetTimeoutWindow()
+///
+/// If the service returns an HTTP error with a "Retry-After" header and the title had previously called +/// PFHCHttpCallRequestSetRetryCacheId(), then all future calls to that API will immediately fail with the +/// original error without contacting the service until the "Retry-After" time has been reached.
+///
+/// Idempotent service calls are retried when a network error occurs or the server responds with
+/// one of these HTTP status codes:
+/// 408 (Request Timeout)
+/// 429 (Too Many Requests)
+/// 500 (Internal Server Error)
+/// 502 (Bad Gateway)
+/// 503 (Service Unavailable)
+/// 504 (Gateway Timeout)
+///
+/// This must be called prior to calling PFHCHttpCallPerformAsync. +///
+PF_API PFHCHttpCallRequestSetRetryDelay( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t retryDelayInSeconds + ) noexcept; + +/// +/// Sets the HTTP timeout window in seconds. +/// +/// The handle of the HTTP call. Pass nullptr to set the default for future calls +/// The timeout window in seconds +/// Result code for this API operation. Possible values are S_OK, or E_FAIL. +/// +/// This controls how long to spend attempting to retry idempotent service calls before failing.
+/// The default is 20 seconds.
+///
+/// Idempotent service calls are retried when a network error occurs or the server responds
+/// with one of these HTTP status codes:
+/// 408 (Request Timeout)
+/// 429 (Too Many Requests)
+/// 500 (Internal Server Error)
+/// 502 (Bad Gateway)
+/// 503 (Service Unavailable)
+/// 504 (Gateway Timeout)
+///
+/// This must be called prior to calling PFHCHttpCallPerformAsync.
+///
+PF_API PFHCHttpCallRequestSetTimeoutWindow( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t timeoutWindowInSeconds + ) noexcept; + +#if HC_PLATFORM_IS_MICROSOFT && (HC_PLATFORM != HC_PLATFORM_UWP) && (HC_PLATFORM != HC_PLATFORM_XDK) +/// +/// Enables or disables SSL server certificate validation for this specific HTTP call. +/// +/// The handle of the HTTP call. +/// Boolean indicating whether to enable or disable certificate validation for the HTTP call. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// Only implemented for Win32. +/// The default is true +/// +/// Optional, call prior to calling PFHCHttpCallPerformAsync. +/// +PF_API PFHCHttpCallRequestSetSSLValidation( + _In_ PFHCCallHandle call, + _In_ bool sslValidation + ) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Defines the config settings value that is passed to the below API's. +/// +enum class PFHCConfigSetting : uint32_t +{ + /// + /// Only passed to the below API's to warn callers that this SSL validation + /// is enforced RETAIL sandboxes regardless of this setting + /// + SSLValidationEnforcedInRetailSandbox = 1 +}; + +/// +/// Disables asserts for SSL validation in console dev sandboxes. +/// +/// The config settings value to be passed down. +/// HRESULT return code for this API operation. +/// +/// On GDK console, SSL validation is enforced on RETAIL sandboxes regardless of this setting. +/// The asserts will not fire in RETAIL sandbox, and this setting has no affect in RETAIL sandboxes. +/// It is best practice to not call this API, but this can be used as a temporary way +/// to get unblocked while in early stages of game development. +/// +PF_API PFHCHttpDisableAssertsForSSLValidationInDevSandboxes( + _In_ PFHCConfigSetting setting + ) noexcept; +#endif + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallResponse Set APIs +// + +/// +/// The callback definition used by an HTTP call to write the response body. This callback will be +/// invoked on an unspecified background thread which is platform dependent. +/// +/// The handle of the HTTP call. +/// The source from which bytes may be read. +/// The number of bytes that can be read from the source. +/// The context associated with this write function. +/// Result code for this callback. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +typedef HRESULT +(CALLBACK* PFHCHttpCallResponseBodyWriteFunction)( + _In_ PFHCCallHandle call, + _In_reads_bytes_(bytesAvailable) const uint8_t* source, + _In_ size_t bytesAvailable, + _In_opt_ void* context + ); + +/// +/// Sets a custom callback function that will be used to write the response body when the HTTP call +/// is performed. Using a custom write callback will cause subsequent calls to +/// PFHCHttpCallResponseGetResponseBodyBytesSize, PFHCHttpCallResponseGetResponseBodyBytes, +/// and PFHCHttpCallGetResponseBodyString to fail as these are mutually exclusive. +/// +/// The handle of the HTTP call. +/// The response body write function this call should use. +/// The context to associate with this write function. +/// Result code of this API operation. Possible values are S_OK or E_INVALIDARG. +/// This must be called prior to calling PFHCHttpCallPerformAsync. +PF_API PFHCHttpCallResponseSetResponseBodyWriteFunction( + _In_ PFHCCallHandle call, + _In_ PFHCHttpCallResponseBodyWriteFunction writeFunction, + _In_opt_ void* context +) noexcept; + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallResponse Get APIs +// + +/// +/// Get the response body string of the HTTP call. This API operation will fail if a custom write +/// callback was set on this call handle using PFHCHttpCallResponseSetResponseBodyWriteFunction. +/// +/// The handle of the HTTP call. +/// +/// The UTF-8 encoded response body string of the HTTP call. +/// The memory for the returned string pointer remains valid for the life of the PFHCCallHandle object until PFHCHttpCallCloseHandle() is called on it. +/// +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +PF_API PFHCHttpCallResponseGetResponseString( + _In_ PFHCCallHandle call, + _Out_ const char** responseString + ) noexcept; + +/// +/// Get the response body buffer size of the HTTP call. This API operation will fail if a custom write +/// callback was set on this call handle using PFHCHttpCallResponseSetResponseBodyWriteFunction. +/// +/// The handle of the HTTP call. +/// The response body buffer size of the HTTP call. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +PF_API PFHCHttpCallResponseGetResponseBodyBytesSize( + _In_ PFHCCallHandle call, + _Out_ size_t* bufferSize + ) noexcept; + +/// +/// Get the response body buffer of the HTTP call. This API operation will fail if a custom write +/// callback was set on this call handle using PFHCHttpCallResponseSetResponseBodyWriteFunction. +/// +/// The handle of the HTTP call. +/// The response body buffer size being passed in. +/// The buffer to be written to. +/// The actual number of bytes written to the buffer. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +PF_API PFHCHttpCallResponseGetResponseBodyBytes( + _In_ PFHCCallHandle call, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) uint8_t* buffer, + _Out_opt_ size_t* bufferUsed + ) noexcept; + +/// +/// Get the HTTP status code of the HTTP call response. +/// +/// The handle of the HTTP call. +/// the HTTP status code of the HTTP call response. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +PF_API PFHCHttpCallResponseGetStatusCode( + _In_ PFHCCallHandle call, + _Out_ uint32_t* statusCode + ) noexcept; + +/// +/// Get the network error code of the HTTP call. +/// +/// The handle of the HTTP call. +/// The network error code of the HTTP call. Possible values are S_OK, or E_FAIL. +/// The platform specific network error code of the HTTP call to be used for tracing / debugging. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. On the GDK Platform, HTTP calls that fail +/// due to the title being suspended will have platformNetworkErrorCode set to HRESULT_FROM_WIN32(PROCESS_SUSPEND_RESUME). +/// +PF_API PFHCHttpCallResponseGetNetworkErrorCode( + _In_ PFHCCallHandle call, + _Out_ HRESULT* networkErrorCode, + _Out_ uint32_t* platformNetworkErrorCode + ) noexcept; + +/// +/// Get the platform network error message of the HTTP call. +/// +/// The handle of the HTTP call. +/// The platform specific network error message of the HTTP call to be used for tracing / debugging. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +PF_API PFHCHttpCallResponseGetPlatformNetworkErrorMessage( + _In_ PFHCCallHandle call, + _Out_ const char** platformNetworkErrorMessage + ) noexcept; + +/// +/// Get a response header for the HTTP call for a given header name. +/// +/// The handle of the HTTP call. +/// UTF-8 encoded response header name for the HTTP call. +/// The memory for the returned string pointer remains valid for the life of the PFHCCallHandle object until PFHCHttpCallCloseHandle() is called on it. +/// +/// UTF-8 encoded response header value for the HTTP call. +/// Returns nullptr if the header doesn't exist. +/// The memory for the returned string pointer remains valid for the life of the PFHCCallHandle object until PFHCHttpCallCloseHandle() is called on it. +/// +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +PF_API PFHCHttpCallResponseGetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _Out_ const char** headerValue + ) noexcept; + +/// +/// Gets the number of response headers in the HTTP call. +/// +/// The handle of the HTTP call. +/// The number of response headers in the HTTP call. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +PF_API PFHCHttpCallResponseGetNumHeaders( + _In_ PFHCCallHandle call, + _Out_ uint32_t* numHeaders + ) noexcept; + +/// +/// Gets the response headers at specific zero based index in the HTTP call. +/// +/// The handle of the HTTP call. +/// Specific zero based index of the response header. +/// UTF-8 encoded response header name for the HTTP call. +/// The memory for the returned string pointer remains valid for the life of the PFHCCallHandle object until PFHCHttpCallCloseHandle() is called on it. +/// +/// UTF-8 encoded response header value for the HTTP call. +/// The memory for the returned string pointer remains valid for the life of the PFHCCallHandle object until PFHCHttpCallCloseHandle() is called on it. +/// +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// Use PFHCHttpCallResponseGetNumHeaders() to know how many response headers there are in the HTTP call. +/// This can only be called after calling PFHCHttpCallPerformAsync when the HTTP task is completed. +/// +PF_API PFHCHttpCallResponseGetHeaderAtIndex( + _In_ PFHCCallHandle call, + _In_ uint32_t headerIndex, + _Out_ const char** headerName, + _Out_ const char** headerValue + ) noexcept; + +#if !HC_NOWEBSOCKETS +///////////////////////////////////////////////////////////////////////////////////////// +// WebSocket APIs +// + +/// +/// A callback invoked every time a WebSocket receives an incoming message +/// +/// Handle to the WebSocket that this message was sent to +/// UTF-8 encoded body of the incoming message as a string value, only if the message type is UTF-8. +/// Client context to pass to callback function. +typedef void +(CALLBACK* PFHCWebSocketMessageFunction)( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* incomingBodyString, + _In_ void* functionContext + ); + +/// +/// A callback invoked every time a WebSocket receives an incoming binary message +/// +/// Handle to the WebSocket that this message was sent to +/// Binary message payload. +/// Size of the payload in bytes. +/// Client context to pass to callback function. +typedef void +(CALLBACK* PFHCWebSocketBinaryMessageFunction)( + _In_ PFHCWebsocketHandle websocket, + _In_reads_bytes_(payloadSize) const uint8_t* payloadBytes, + _In_ uint32_t payloadSize, + _In_ void* functionContext + ); + +/// +/// A callback invoked every time a WebSocket receives an incoming message that is larger than +/// the WebSocket receive buffer (configurable using PFHCWebSocketSetMaxReceiveBufferSize). Large messages +/// will be broken down and passed to clients in chunks. +/// +/// Handle to the WebSocket that this message was sent to +/// Binary message payload. +/// Size of the payload in bytes. +/// True if this is the last fragment in a message, false otherwise. +/// Client context to pass to callback function. +typedef void +(CALLBACK* PFHCWebSocketBinaryMessageFragmentFunction)( + _In_ PFHCWebsocketHandle websocket, + _In_reads_bytes_(payloadSize) const uint8_t* payloadBytes, + _In_ uint32_t payloadSize, + _In_ bool isLastFragment, + _In_ void* functionContext + ); + +/// +/// A callback invoked when a WebSocket is closed +/// +/// Handle to the WebSocket +/// The status of why the WebSocket was closed +/// Client context to pass to callback function. +typedef void +(CALLBACK* PFHCWebSocketCloseEventFunction)( + _In_ PFHCWebsocketHandle websocket, + _In_ PFHCWebSocketCloseStatus closeStatus, + _In_ void* functionContext + ); + +/// +/// Creates an WebSocket handle. +/// +/// The handle of the websocket. +/// A pointer to the message handling callback to use, or a null pointer to remove. +/// A pointer to the binary message handling callback to use, or a null pointer to remove. +/// A pointer to the close callback to use, or a null pointer to remove. +/// Client context to pass to callback function. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// WebSocket usage:
+/// Create a WebSocket handle using PFHCWebSocketCreate()
+/// Call PFHCWebSocketSetProxyUri() and PFHCWebSocketSetHeader() to prepare the PFHCWebsocketHandle
+/// Call PFHCWebSocketConnectAsync() to connect the WebSocket using the PFHCWebsocketHandle.
+/// Call PFHCWebSocketSendMessageAsync() to send a message to the WebSocket using the PFHCWebsocketHandle.
+/// Call PFHCWebSocketDisconnect() to disconnect the WebSocket using the PFHCWebsocketHandle.
+/// Call PFHCWebSocketCloseHandle() when done with the PFHCWebsocketHandle to free the associated memory
+///
+PF_API PFHCWebSocketCreate( + _Out_ PFHCWebsocketHandle* websocket, + _In_opt_ PFHCWebSocketMessageFunction messageFunc, + _In_opt_ PFHCWebSocketBinaryMessageFunction binaryMessageFunc, + _In_opt_ PFHCWebSocketCloseEventFunction closeFunc, + _In_opt_ void* functionContext + ) noexcept; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +/// +/// Set the binary message fragment handler. The client functionContext passed to PFHCWebSocketCreate will also be passed to this handler. +/// +/// The handle of the websocket. +/// A pointer to the binary message fragment handling callback to use, or a null pointer to remove. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// If this handler is not set, messages larger than the configured buffer size may still be broken down and passed to the +/// PFHCWebSocketBinaryMessageFunction, but there will be no indication that they are partial messages. If large WebSocket messages are expected, +/// it is recommended to either set this handler OR set a receive buffer large enough to hold the entire message. +/// +PF_API PFHCWebSocketSetBinaryMessageFragmentEventFunction( + _In_ PFHCWebsocketHandle websocket, + _In_ PFHCWebSocketBinaryMessageFragmentFunction binaryMessageFragmentFunc + ) noexcept; +#endif + +/// +/// Set the proxy URI for the WebSocket. +/// +/// The handle of the WebSocket. +/// The UTF-8 encoded proxy URI for the WebSocket. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// This must be called prior to calling PFHCWebSocketConnectAsync. +PF_API PFHCWebSocketSetProxyUri( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* proxyUri + ) noexcept; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 && !HC_WINHTTP_WEBSOCKETS + +/// +/// Allows proxy server to decrypt and inspect traffic; should be used only for debugging purposes +/// This must be called after calling PFHCWebSocketSetProxyUri. +/// Only applies to Win32 non-GDK builds +/// +/// The handle of the WebSocket +/// true is proxy can decrypt, false is not allowed to decrypt +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +PF_API PFHCWebSocketSetProxyDecryptsHttps( + _In_ PFHCWebsocketHandle websocket, + _In_ bool allowProxyToDecryptHttps + ) noexcept; +#endif + +/// +/// Set a header for the WebSocket. +/// +/// The handle of the WebSocket. +/// UTF-8 encoded header name for the WebSocket. +/// UTF-8 encoded header value for the WebSocket. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// This must be called prior to calling PFHCWebSocketConnectAsync. +PF_API PFHCWebSocketSetHeader( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* headerName, + _In_z_ const char* headerValue + ) noexcept; + +/// +/// Gets the WebSocket functions to allow callers to respond to incoming messages and WebSocket close events. +/// +/// The handle of the websocket. +/// A pointer to the message handling callback to use, or a null pointer to remove. +/// A pointer to the binary message handling callback to use, or a null pointer to remove. +/// A pointer to the close callback to use, or a null pointer to remove. +/// Client context to pass to callback function. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_HC_NOT_INITIALISED, or E_FAIL. +PF_API PFHCWebSocketGetEventFunctions( + _In_ PFHCWebsocketHandle websocket, + _Out_opt_ PFHCWebSocketMessageFunction* messageFunc, + _Out_opt_ PFHCWebSocketBinaryMessageFunction* binaryMessageFunc, + _Out_opt_ PFHCWebSocketCloseEventFunction* closeFunc, + _Out_ void** functionContext + ) noexcept; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +/// +/// Gets the WebSocket binary message fragment handler. +/// +/// The handle of the websocket. +/// Returned binaryMessageFragmentFunc. +/// Client context to pass to callback function. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_HC_NOT_INITIALISED, or E_FAIL. +PF_API PFHCWebSocketGetBinaryMessageFragmentEventFunction( + _In_ PFHCWebsocketHandle websocket, + _Out_ PFHCWebSocketBinaryMessageFragmentFunction* binaryMessageFragmentFunc, + _Out_ void** functionContext + ) noexcept; +#endif + +/// +/// Used by PFHCWebSocketConnectAsync() and PFHCWebSocketSendMessageAsync(). +/// +typedef struct PFWebSocketCompletionResult +{ + /// The handle of the HTTP call. + PFHCWebsocketHandle websocket; + + /// The error code of the call. Possible values are S_OK, or E_FAIL. + HRESULT errorCode; + + /// The platform specific network error code of the call to be used for tracing / debugging. + uint32_t platformErrorCode; +} PFWebSocketCompletionResult; + +/// +/// Connects to the WebSocket. +/// +/// The UTF-8 encoded URI to connect to. +/// The UTF-8 encoded subProtocol to connect to. +/// The handle of the WebSocket. +/// The XAsyncBlock that defines the async operation. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +/// +/// To get the result, first call PFHCGetWebSocketConnectResult inside the AsyncBlock callback or after the AsyncBlock is complete. +/// On GDK and Win32 (Win 8+) the background work is scheduled to threads owned by WinHttp run in async mode. +/// On UWP and XDK, the connection thread is owned and controlled by Windows::Networking::Sockets::MessageWebSocket. +/// On Win32 (Win 7+), iOS, and Android, all background work (including initial connection process) will be added to the queue +/// in the provided XAsyncBlock. LibHttpClient will create a reference to that queue but it is the responsibility of the +/// caller to dispatch that queue for as long as the websocket connection is active. Note that work for +/// PFHCWebSocketSendMessageAsync calls can be assigned to a separate queue if desired. +/// +PF_API PFHCWebSocketConnectAsync( + _In_z_ const char* uri, + _In_z_ const char* subProtocol, + _In_ PFHCWebsocketHandle websocket, + _Inout_ XAsyncBlock* asyncBlock + ) noexcept; + +/// +/// Gets the result for PFHCGetWebSocketConnectResult. +/// +/// The XAsyncBlock that defines the async operation. +/// Pointer to the result payload. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, E_OUTOFMEMORY, or E_FAIL. +PF_API PFHCGetWebSocketConnectResult( + _Inout_ XAsyncBlock* asyncBlock, + _In_ PFWebSocketCompletionResult* result + ) noexcept; + +/// +/// Send message the WebSocket +/// +/// Handle to the WebSocket. +/// The UTF-8 encoded message to send. +/// The XAsyncBlock that defines the async operation. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// To get the result, first call PFHCGetWebSocketSendMessageResult +/// inside the AsyncBlock callback or after the AsyncBlock is complete. +/// +PF_API PFHCWebSocketSendMessageAsync( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* message, + _Inout_ XAsyncBlock* asyncBlock + ) noexcept; + +/// +/// Send binary message to the WebSocket. +/// +/// Handle to the WebSocket. +/// Binary data to send in byte buffer. +/// Size of byte buffer. +/// The AsyncBlock that defines the async operation. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// +/// To get the result, first call PFHCGetWebSocketSendMessageResult +/// inside the AsyncBlock callback or after the AsyncBlock is complete. +/// +PF_API PFHCWebSocketSendBinaryMessageAsync( + _In_ PFHCWebsocketHandle websocket, + _In_reads_bytes_(payloadSize) const uint8_t* payloadBytes, + _In_ uint32_t payloadSize, + _Inout_ XAsyncBlock* asyncBlock + ) noexcept; + +/// +/// Gets the result from PFHCWebSocketSendMessage. +/// +/// The XAsyncBlock that defines the async operation. +/// Pointer to the result payload. +/// Returns the duplicated handle. +PF_API PFHCGetWebSocketSendMessageResult( + _Inout_ XAsyncBlock* asyncBlock, + _In_ PFWebSocketCompletionResult* result + ) noexcept; + +/// +/// Disconnects / closes the WebSocket. +/// +/// Handle to the WebSocket. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +PF_API PFHCWebSocketDisconnect( + _In_ PFHCWebsocketHandle websocket + ) noexcept; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Configures how large the WebSocket receive buffer is allowed to grow before passing messages to clients. If a single message +/// exceeds the maximum buffer size, the message will be broken down and passed to clients via multiple calls to the PFHCWebSocketMessageFunction. +/// The default value is 20kb. +/// +/// The handle of the WebSocket +/// Maximum size (in bytes) for the WebSocket receive buffer. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +PF_API PFHCWebSocketSetMaxReceiveBufferSize( + _In_ PFHCWebsocketHandle websocket, + _In_ size_t bufferSizeInBytes + ) noexcept; +#endif + +/// +/// Increments the reference count on the call object. +/// +/// Handle to the WebSocket. +/// Returns the duplicated handle. +PF_API_(PFHCWebsocketHandle) PFHCWebSocketDuplicateHandle( + _In_ PFHCWebsocketHandle websocket + ) noexcept; + +/// +/// Decrements the reference count on the WebSocket object. +/// +/// Handle to the WebSocket. +/// Result code for this API operation. Possible values are S_OK, E_INVALIDARG, or E_FAIL. +/// When the ref count is 0, PFHCWebSocketCloseHandle() will free the memory associated with the PFHCWebsocketHandle. +PF_API PFHCWebSocketCloseHandle( + _In_ PFHCWebsocketHandle websocket + ) noexcept; + +/// +/// A callback that will be synchronously invoked when websocket traffic is sent or received +/// +/// Handle to the HTTP call. +/// True if receiving the data, false if sending the data. +/// Optional UTF-8 encoded message. +/// Either message or payloadBytes should be non-null depending if its text or binary message +/// Binary data in byte buffer. +/// Either message or payloadBytes should be non-null depending if its text or binary message +/// Size of byte buffer +/// Client context pass when the handler was added. +typedef void +(STDAPIVCALLTYPE* PFHCWebSocketRoutedHandler)( + _In_ PFHCWebsocketHandle websocket, + _In_ bool receiving, + _In_opt_z_ const char* message, + _In_opt_ const uint8_t* payloadBytes, + _In_ size_t payloadSize, + _In_opt_ void* context + ); + +/// +/// Adds a callback to be invoked on websocket traffic in order to debug or trace the traffic. +/// +/// The handler to be called. +/// Client context to pass to callback function. +/// An unique id that can be used to remove the handler. +PF_API_(int32_t) PFHCAddWebSocketRoutedHandler( + _In_ PFHCWebSocketRoutedHandler handler, + _In_opt_ void* context + ) noexcept; + +/// +/// Removes a previously added PFHCWebSocketRoutedHandler. +/// +/// Id returned from the PFHCAddWebSocketRoutedHandler call. +/// +PF_API_(void) PFHCRemoveWebSocketRoutedHandler( + _In_ int32_t handlerId + ) noexcept; + +#endif // !HC_NOWEBSOCKETS + +} + diff --git a/Source/PlayFabCore/Include/playfab/httpClient/PFHttpProvider.h b/Source/PlayFabCore/Include/playfab/httpClient/PFHttpProvider.h new file mode 100644 index 0000000..e752831 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/httpClient/PFHttpProvider.h @@ -0,0 +1,248 @@ +#if !defined(__cplusplus) + #error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ +typedef void +(CALLBACK* PFHCCallPerformFunction)( + _In_ PFHCCallHandle call, + _Inout_ XAsyncBlock* asyncBlock, + _In_opt_ void* context, + _In_ PFHCPerformEnv env + ); + +PF_API PFHCSetHttpCallPerformFunction( + _In_ PFHCCallPerformFunction performFunc, + _In_opt_ void* performContext + ) noexcept; + +PF_API PFHCGetHttpCallPerformFunction( + _Out_ PFHCCallPerformFunction* performFunc, + _Out_ void** performContext + ) noexcept; + +PF_API PFHCHttpCallGetContext( + _In_ PFHCCallHandle call, + _In_ void** context + ) noexcept; + +PF_API PFHCHttpCallSetContext( + _In_ PFHCCallHandle call, + _In_opt_ void* context + ) noexcept; + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallRequest Get APIs +// + +PF_API PFHCHttpCallRequestGetUrl( + _In_ PFHCCallHandle call, + _Outptr_ const char** method, + _Outptr_ const char** url + ) noexcept; + +PF_API PFHCHttpCallRequestGetRequestBodyBytes( + _In_ PFHCCallHandle call, + _Outptr_result_bytebuffer_maybenull_(*requestBodySize) const uint8_t** requestBodyBytes, + _Out_ uint32_t* requestBodySize + ) noexcept; + +PF_API PFHCHttpCallRequestGetRequestBodyString( + _In_ PFHCCallHandle call, + _Outptr_ const char** requestBody + ) noexcept; + +PF_API PFHCHttpCallRequestGetRequestBodyReadFunction( + _In_ PFHCCallHandle call, + _Out_ PFHCHttpCallRequestBodyReadFunction* readFunction, + _Out_ size_t* bodySize, + _Out_ void** context + ) noexcept; + +PF_API PFHCHttpCallRequestGetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _Out_ const char** headerValue + ) noexcept; + +PF_API PFHCHttpCallRequestGetNumHeaders( + _In_ PFHCCallHandle call, + _Out_ uint32_t* numHeaders + ) noexcept; + +PF_API PFHCHttpCallRequestGetHeaderAtIndex( + _In_ PFHCCallHandle call, + _In_ uint32_t headerIndex, + _Out_ const char** headerName, + _Out_ const char** headerValue +) noexcept; + +PF_API PFHCHttpCallRequestGetRetryAllowed( + _In_opt_ PFHCCallHandle call, + _Out_ bool* retryAllowed + ) noexcept; + +PF_API PFHCHttpCallRequestGetRetryCacheId( + _In_ PFHCCallHandle call, + _Out_ uint32_t* retryAfterCacheId + ) noexcept; + +PF_API PFHCHttpCallRequestGetTimeout( + _In_opt_ PFHCCallHandle call, + _Out_ uint32_t* timeoutInSeconds + ) noexcept; + +PF_API PFHCHttpCallRequestGetRetryDelay( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t* retryDelayInSeconds + ) noexcept; + +PF_API PFHCHttpCallRequestGetTimeoutWindow( + _In_opt_ PFHCCallHandle call, + _Out_ uint32_t* timeoutWindowInSeconds + ) noexcept; + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallResponse Get APIs +// + +PF_API PFHCHttpCallResponseGetResponseBodyWriteFunction( + _In_ PFHCCallHandle call, + _Out_ PFHCHttpCallResponseBodyWriteFunction* writeFunction, + _Out_ void** context + ) noexcept; + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallResponse Set APIs +// + +PF_API PFHCHttpCallResponseSetResponseBodyBytes( + _In_ PFHCCallHandle call, + _In_reads_bytes_(bodySize) const uint8_t* bodyBytes, + _In_ size_t bodySize + ) noexcept; + +PF_API PFHCHttpCallResponseAppendResponseBodyBytes( + _In_ PFHCCallHandle call, + _In_reads_bytes_(bodySize) const uint8_t* bodyBytes, + _In_ size_t bodySize + ) noexcept; + +PF_API PFHCHttpCallResponseSetStatusCode( + _In_ PFHCCallHandle call, + _In_ uint32_t statusCode + ) noexcept; + +PF_API PFHCHttpCallResponseSetNetworkErrorCode( + _In_ PFHCCallHandle call, + _In_ HRESULT networkErrorCode, + _In_ uint32_t platformNetworkErrorCode + ) noexcept; + +PF_API PFHCHttpCallResponseSetPlatformNetworkErrorMessage( + _In_ PFHCCallHandle call, + _In_z_ const char* platformNetworkErrorMessage + ) noexcept; + +PF_API PFHCHttpCallResponseSetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _In_z_ const char* headerValue + ) noexcept; + +PF_API PFHCHttpCallResponseSetHeaderWithLength( + _In_ PFHCCallHandle call, + _In_reads_(nameSize) const char* headerName, + _In_ size_t nameSize, + _In_reads_(valueSize) const char* headerValue, + _In_ size_t valueSize + ) noexcept; + +#if !HC_NOWEBSOCKETS + +///////////////////////////////////////////////////////////////////////////////////////// +// WebSocket Set APIs +// + +typedef HRESULT +(CALLBACK* PFHCWebSocketConnectFunction)( + _In_z_ const char* uri, + _In_z_ const char* subProtocol, + _In_ PFHCWebsocketHandle websocket, + _Inout_ XAsyncBlock* asyncBlock, + _In_opt_ void* context, + _In_ PFHCPerformEnv env + ); + +typedef HRESULT +(CALLBACK* PFHCWebSocketSendMessageFunction)( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* message, + _Inout_ XAsyncBlock* asyncBlock, + _In_opt_ void* context + ); + +typedef HRESULT +(CALLBACK* PFHCWebSocketSendBinaryMessageFunction)( + _In_ PFHCWebsocketHandle websocket, + _In_reads_bytes_(payloadSize) const uint8_t* payloadBytes, + _In_ uint32_t payloadSize, + _Inout_ XAsyncBlock* asyncBlock, + _In_opt_ void* context + ); + +typedef HRESULT +(CALLBACK* PFHCWebSocketDisconnectFunction)( + _In_ PFHCWebsocketHandle websocket, + _In_ PFHCWebSocketCloseStatus closeStatus, + _In_opt_ void* context + ); + +PF_API PFHCSetWebSocketFunctions( + _In_ PFHCWebSocketConnectFunction websocketConnectFunc, + _In_ PFHCWebSocketSendMessageFunction websocketSendMessageFunc, + _In_ PFHCWebSocketSendBinaryMessageFunction websocketSendBinaryMessageFunc, + _In_ PFHCWebSocketDisconnectFunction websocketDisconnectFunc, + _In_opt_ void* context + ) noexcept; + +PF_API PFHCGetWebSocketFunctions( + _Out_ PFHCWebSocketConnectFunction* websocketConnectFunc, + _Out_ PFHCWebSocketSendMessageFunction* websocketSendMessageFunc, + _Out_ PFHCWebSocketSendBinaryMessageFunction* websocketSendBinaryMessageFunc, + _Out_ PFHCWebSocketDisconnectFunction* websocketDisconnectFunc, + _Out_ void** context + ) noexcept; + +PF_API PFHCWebSocketGetProxyUri( + _In_ PFHCWebsocketHandle websocket, + _Out_ const char** proxyUri + ) noexcept; + +PF_API PFHCWebSocketGetHeader( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* headerName, + _Out_ const char** headerValue + ) noexcept; + +PF_API PFHCWebSocketGetNumHeaders( + _In_ PFHCWebsocketHandle websocket, + _Out_ uint32_t* numHeaders + ) noexcept; + + +PF_API PFHCWebSocketGetHeaderAtIndex( + _In_ PFHCWebsocketHandle websocket, + _In_ uint32_t headerIndex, + _Out_ const char** headerName, + _Out_ const char** headerValue + ) noexcept; + +#endif // !HC_NOWEBSOCKETS +} diff --git a/Source/PlayFabCore/Include/playfab/httpClient/PFMock.h b/Source/PlayFabCore/Include/playfab/httpClient/PFMock.h new file mode 100644 index 0000000..a9bce60 --- /dev/null +++ b/Source/PlayFabCore/Include/playfab/httpClient/PFMock.h @@ -0,0 +1,76 @@ +#if !defined(__cplusplus) + #error C++11 required +#endif + +#pragma once +#include + +extern "C" +{ + +///////////////////////////////////////////////////////////////////////////////////////// +// Mock APIs +// + +PF_API PFHCMockCallCreate( + _Out_ PFHCMockCallHandle* call + ) noexcept; + +PF_API PFHCMockAddMock( + _In_ PFHCMockCallHandle call, + _In_opt_z_ const char* method, + _In_opt_z_ const char* url, + _In_reads_bytes_opt_(requestBodySize) const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize + ) noexcept; + +typedef void (CALLBACK* PFHCMockMatchedCallback)( + _In_ PFHCMockCallHandle matchedMock, + _In_ const char* method, + _In_ const char* url, + _In_ const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize, + _In_ void* context + ); + +PF_API PFHCMockSetMockMatchedCallback( + _In_ PFHCMockCallHandle call, + _In_ PFHCMockMatchedCallback callback, + _In_opt_ void* context + ); + +PF_API PFHCMockRemoveMock( + _In_ PFHCMockCallHandle call + ); + +PF_API PFHCMockClearMocks() noexcept; + + +///////////////////////////////////////////////////////////////////////////////////////// +// HCMockResponse Set APIs +// + +PF_API PFHCMockResponseSetResponseBodyBytes( + _In_ PFHCMockCallHandle call, + _In_reads_bytes_(bodySize) const uint8_t* bodyBytes, + _In_ uint32_t bodySize + ) noexcept; + +PF_API PFHCMockResponseSetStatusCode( + _In_ PFHCMockCallHandle call, + _In_ uint32_t statusCode + ) noexcept; + +PF_API PFHCMockResponseSetNetworkErrorCode( + _In_ PFHCMockCallHandle call, + _In_ HRESULT networkErrorCode, + _In_ uint32_t platformNetworkErrorCode + ) noexcept; + +PF_API PFHCMockResponseSetHeader( + _In_ PFHCMockCallHandle call, + _In_z_ const char* headerName, + _In_z_ const char* headerValue + ) noexcept; + +} diff --git a/Source/PlayFabCore/Source/Api/PFAuthentication.cpp b/Source/PlayFabCore/Source/Api/PFAuthentication.cpp new file mode 100644 index 0000000..0fd61f8 --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFAuthentication.cpp @@ -0,0 +1,1926 @@ +#include "stdafx.h" +#include +#include "Authentication/Authentication.h" +#include "ApiXAsyncProvider.h" +#include "ApiHelpers.h" +#include "Authentication/GetEntityAsyncProvider.h" + +using namespace PlayFab; +using namespace PlayFab::Authentication; + +HRESULT PFAuthenticationLoginGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + + Vector tempBuffer; + if (!bufferSize || !buffer) + { + // The buffer for the extended LoginResult is optional, but we report the result size to XAsync when the async + // call completes (not when the client requests the result). XAsyncGetResult requires the specified buffer size + // so create and pass it a temporary one if the client didn't provide one + + RETURN_HR_IF(E_INVALIDARG, result); + RETURN_IF_FAILED(XAsyncGetResultSize(async, &bufferSize)); + tempBuffer.resize(bufferSize); + buffer = tempBuffer.data(); + } + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + PFCombinedLoginResult* combinedLoginResult = reinterpret_cast(buffer); + *entityHandle = combinedLoginResult->entityHandle; + + if (result) + { + *result = combinedLoginResult->loginResult; + } + + return S_OK; +} + +HRESULT PFAuthenticationServerLoginGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityTokenResponse); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + PFServerCombinedLoginResult* combinedLoginResult = reinterpret_cast(buffer); + *entityTokenResponse = combinedLoginResult->entityTokenResponse; + + if (result) + { + *result = combinedLoginResult->loginResult; + } + + return S_OK; +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationGetPhotonAuthenticationTokenAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationGetPhotonAuthenticationTokenRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetPhotonAuthenticationTokenAsync), + std::bind(&AuthenticationAPI::GetPhotonAuthenticationToken, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetPhotonAuthenticationTokenGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationGetPhotonAuthenticationTokenGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationGetPhotonAuthenticationTokenResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationGetTitlePublicKeyAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationGetTitlePublicKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetTitlePublicKeyAsync), + std::bind(&AuthenticationAPI::GetTitlePublicKey, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetTitlePublicKeyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationGetTitlePublicKeyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationGetTitlePublicKeyResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithAndroidDeviceIDAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithAndroidDeviceIDAsync), + std::bind(&AuthenticationAPI::LoginWithAndroidDeviceID, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithAndroidDeviceIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithAndroidDeviceIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithAndroidDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithAndroidDeviceID, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithAppleAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithAppleAsync), + std::bind(&AuthenticationAPI::LoginWithApple, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithAppleGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithAppleGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithAppleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithApple, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAuthenticationLoginWithCustomIDAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithCustomIDAsync), + std::bind(&AuthenticationAPI::LoginWithCustomID, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithCustomIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithCustomIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithCustomIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithCustomID, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithEmailAddressAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithEmailAddressRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithEmailAddressAsync), + std::bind(&AuthenticationAPI::LoginWithEmailAddress, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithEmailAddressGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithEmailAddressGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithEmailAddressAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithEmailAddressRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithEmailAddress, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithFacebookAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithFacebookRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithFacebookAsync), + std::bind(&AuthenticationAPI::LoginWithFacebook, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithFacebookGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithFacebookGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithFacebookAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithFacebookRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithFacebook, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithFacebookInstantGamesIdAsync), + std::bind(&AuthenticationAPI::LoginWithFacebookInstantGamesId, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithFacebookInstantGamesIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithFacebookInstantGamesId, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithGameCenterAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithGameCenterRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithGameCenterAsync), + std::bind(&AuthenticationAPI::LoginWithGameCenter, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithGameCenterGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithGameCenterGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithGameCenterAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGameCenterRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithGameCenter, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithGoogleAccountAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithGoogleAccountAsync), + std::bind(&AuthenticationAPI::LoginWithGoogleAccount, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithGoogleAccountGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithGoogleAccountGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithGoogleAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithGoogleAccount, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithGooglePlayGamesServicesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithGooglePlayGamesServicesAsync), + std::bind(&AuthenticationAPI::LoginWithGooglePlayGamesServices, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithGooglePlayGamesServicesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGooglePlayGamesServicesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithGooglePlayGamesServices, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithIOSDeviceIDAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithIOSDeviceIDAsync), + std::bind(&AuthenticationAPI::LoginWithIOSDeviceID, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithIOSDeviceIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithIOSDeviceIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithIOSDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithIOSDeviceID, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithKongregateAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithKongregateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithKongregateAsync), + std::bind(&AuthenticationAPI::LoginWithKongregate, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithKongregateGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithKongregateGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithKongregateAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithKongregateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithKongregate, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithNintendoServiceAccountAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithNintendoServiceAccountAsync), + std::bind(&AuthenticationAPI::LoginWithNintendoServiceAccount, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithNintendoServiceAccountGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithNintendoServiceAccountGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithNintendoServiceAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithNintendoServiceAccount, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync), + std::bind(&AuthenticationAPI::LoginWithNintendoSwitchDeviceId, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithNintendoSwitchDeviceId, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAuthenticationLoginWithOpenIdConnectAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithOpenIdConnectAsync), + std::bind(&AuthenticationAPI::LoginWithOpenIdConnect, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithOpenIdConnectGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithOpenIdConnectGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithOpenIdConnectAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithOpenIdConnect, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithPlayFabAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithPlayFabRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithPlayFabAsync), + std::bind(&AuthenticationAPI::LoginWithPlayFab, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithPlayFabGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithPlayFabGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithPlayFabAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithPlayFabRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithPlayFab, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithPSNAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithPSNRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithPSNAsync), + std::bind(&AuthenticationAPI::LoginWithPSN, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithPSNGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithPSNGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithPSNAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithPSNRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithPSN, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithSteamAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithSteamRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithSteamAsync), + std::bind(&AuthenticationAPI::LoginWithSteam, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithSteamGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithSteamGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithSteamAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithSteamRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithSteam, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithTwitchAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithTwitchRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithTwitchAsync), + std::bind(&AuthenticationAPI::LoginWithTwitch, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithTwitchGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithTwitchGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithTwitchAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithTwitchRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithTwitch, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithXboxAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithXboxAsync), + std::bind(&AuthenticationAPI::LoginWithXbox, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithXboxGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithXboxGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithXboxAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithXbox, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithXUserAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithXUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithXUserAsync), + std::bind(&AuthenticationAPI::LoginWithXUser, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithXUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithXUserGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithXUserAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithXUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithXUser, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationRegisterPlayFabUserAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationRegisterPlayFabUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationRegisterPlayFabUserAsync), + std::bind(&AuthenticationAPI::RegisterPlayFabUser, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationRegisterPlayFabUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationRegisterPlayFabUserGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationRegisterPlayFabUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationSetPlayerSecretAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationSetPlayerSecretRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationSetPlayerSecretAsync), + std::bind(&AuthenticationAPI::SetPlayerSecret, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationServerLoginWithServerCustomIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithServerCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithServerCustomIdAsync), + std::bind(&AuthenticationAPI::ServerLoginWithServerCustomId, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithServerCustomIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithServerCustomIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationServerLoginWithSteamIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithSteamIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithSteamIdAsync), + std::bind(&AuthenticationAPI::ServerLoginWithSteamId, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithSteamIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithSteamIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationServerLoginWithXboxAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationServerLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithXboxAsync), + std::bind(&AuthenticationAPI::ServerLoginWithXbox, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithXboxGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithXboxGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationServerLoginWithXboxIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithXboxIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithXboxIdAsync), + std::bind(&AuthenticationAPI::ServerLoginWithXboxId, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithXboxIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithXboxIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationAuthenticateCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationAuthenticateGameServerWithCustomIdAsync), + std::bind(&AuthenticationAPI::AuthenticateGameServerWithCustomId, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationAuthenticateCustomIdResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationDeleteAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationDeleteRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationDeleteAsync), + std::bind(&AuthenticationAPI::Delete, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_WIN32 +PF_API PFAuthenticationGetEntityAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationGetEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeGetEntityProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetEntityAsync), + std::bind(&AuthenticationAPI::GetEntity, state, std::move(context), *request, std::placeholders::_1), + state + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetEntityGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFEntityHandle), result, nullptr); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationGetEntityWithSecretKeyAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationGetEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeGetEntityProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetEntityWithSecretKeyAsync), + std::bind(&AuthenticationAPI::GetEntityWithSecretKey, state, std::move(context), secretKey, *request, std::placeholders::_1), + state + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetEntityWithSecretKeyGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFEntityHandle), result, nullptr); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFAuthenticationValidateEntityTokenAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationValidateEntityTokenRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationValidateEntityTokenAsync), + std::bind(&AuthenticationAPI::ValidateEntityToken, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationValidateEntityTokenGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationValidateEntityTokenGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationValidateEntityTokenResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + diff --git a/Source/PlayFabCore/Source/Api/PFCore.cpp b/Source/PlayFabCore/Source/Api/PFCore.cpp new file mode 100644 index 0000000..29be32b --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFCore.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" +#include +#include "Common/GlobalState.h" + +using namespace PlayFab; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFInitialize( + _In_opt_ XTaskQueueHandle backgroundQueue +) noexcept +{ + return GlobalState::Create(backgroundQueue, nullptr); +} +#endif + +/// +/// Internal PFCore function to enable PFServices's init to also init'd PFCore with HCInitArgs on demand as needed +/// +PF_API PFInitializeWithLHC( + _In_opt_ XTaskQueueHandle backgroundQueue, + _In_ HCInitArgs* args +) noexcept +{ + return GlobalState::Create(backgroundQueue, args); +} + +PF_API PFUninitializeAsync( + _In_ XAsyncBlock* async +) noexcept +{ + return GlobalState::CleanupAsync(async); +} diff --git a/Source/PlayFabCore/Source/Api/PFEntity.cpp b/Source/PlayFabCore/Source/Api/PFEntity.cpp new file mode 100644 index 0000000..37b514a --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFEntity.cpp @@ -0,0 +1,279 @@ +#include "stdafx.h" +#include +#include "GlobalState.h" +#include "ApiHelpers.h" +#include + +using namespace PlayFab; + +PF_API PFEntityDuplicateHandle( + _In_ PFEntityHandle entityHandle, + _Out_ PFEntityHandle* duplicatedEntityHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEntityDuplicateHandle), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(duplicatedEntityHandle); + + SharedPtr entity; + RETURN_IF_FAILED(state.Entities().FromHandle(entityHandle, entity)); + return state.Entities().MakeHandle(std::move(entity), *duplicatedEntityHandle); + }); +} + +PF_API_(void) PFEntityCloseHandle( + _In_ PFEntityHandle entityHandle +) noexcept +{ + ApiImpl(XASYNC_IDENTITY(PFEntityCloseHandle), [&](GlobalState& state) + { + state.Entities().CloseHandle(entityHandle); + return S_OK; + }); +} + +PF_API PFEntityGetEntityTokenAsync( + _In_ PFEntityHandle entityHandle, + _Inout_ XAsyncBlock* async +) noexcept +{ + // Although the internal method to retreive an EntityToken from and Entity object is synchronous, the public API is asynchronous for + // a somewhat subtle reason. Because EntityTokens are not fixed size, clients must first call an API to query the size of the buffer required to + // store the token, and only then request the token. At the same time, the SDK is updating EntityTokens in the backround. If PFEntityGetEntityToken + // is were synchronous, we could run into a sequence where the client queries the size of the EntityToken, allocates a buffer, the SDK refreshes the token, + // and then the client calls GetEntityToken only to find out that the newly refreshed Token doesn't fit in their buffer. This would make error handling + // somewhat problemetic for callers. Instead, we make the public GetEntityToken call asynchronous, effectively associating a Token "snapshot" with an + // XAsync operation. This functor wraps the internal syncronous Entity::GetEntityToken in an AsyncOp, allowing us to easily reuse the generic ApiXAsyncProvider + + struct GetEntityTokenAsyncWrapper + { + SharedPtr const entity; + + AsyncOp operator()(RunContext) noexcept + { + return entity->GetEntityToken(); + } + }; + + return EntityAsyncApiImpl(async, XASYNC_IDENTITY(PFEntityGetEntityTokenAsync), entityHandle, [&](SharedPtr entity, RunContext&& rc) + { + auto provider = MakeProvider(std::move(rc), async, XASYNC_IDENTITY(PFEntityGetEntityTokenAsync), GetEntityTokenAsyncWrapper{ std::move(entity) }); + return XAsyncProviderBase::Run(std::move(provider)); + }); +} + +PF_API PFEntityGetEntityTokenResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEntityGetEntityTokenResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ const PFEntityToken** entityToken, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityToken); + + HRESULT hr = XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed); + if (SUCCEEDED(hr)) + { + *entityToken = static_cast(buffer); + } + return hr; +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +PF_API PFEntityGetSecretKeySize( + _In_ PFEntityHandle handle, + _Out_ size_t* secretKeySize +) noexcept +{ + return EntityApiImpl(XASYNC_IDENTITY(PFEntityGetSecretKeySize), handle, [&](SharedPtr entity) + { + RETURN_HR_INVALIDARG_IF_NULL(secretKeySize); + auto result{ entity->GetSecretKey() }; + RETURN_IF_FAILED(result.hr); + + *secretKeySize = result.ExtractPayload().size() + 1; + return S_OK; + }); +} + +PF_API PFEntityGetSecretKey( + _In_ PFEntityHandle handle, + _In_ size_t secretKeySize, + _Out_writes_(secretKeySize) char* secretKeyBuffer, + _Out_opt_ size_t* secretKeyUsed +) noexcept +{ + return EntityApiImpl(XASYNC_IDENTITY(PFServiceConfigGetTitleId), handle, [&](SharedPtr entity) + { + RETURN_HR_INVALIDARG_IF_NULL(secretKeyBuffer); + auto result{ entity->GetSecretKey() }; + RETURN_IF_FAILED(result.hr); + + String const& secretKey{ result.Payload() }; + RETURN_HR_IF(E_INVALIDARG, secretKeySize < secretKey.size() + 1); + + memcpy(secretKeyBuffer, secretKey.data(), secretKey.size() + 1); + + if (secretKeyUsed) + { + *secretKeyUsed = secretKey.size() + 1; + } + + return S_OK; + }); +} +#endif + +PF_API PFEntityGetEntityKeySize( + _In_ PFEntityHandle entityHandle, + _Out_ size_t* bufferSize +) noexcept +{ + return EntityApiImpl(XASYNC_IDENTITY(PFEntityGetEntityKeySize), entityHandle, [&](SharedPtr entity) + { + RETURN_HR_INVALIDARG_IF_NULL(bufferSize); + *bufferSize = entity->EntityKey().RequiredBufferSize(); + return S_OK; + }); +} + +PF_API PFEntityGetEntityKey( + _In_ PFEntityHandle entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ const PFEntityKey** entityKey, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return EntityApiImpl(XASYNC_IDENTITY(PFEntityGetEntityKey), entityHandle, [&](SharedPtr entity) + { + RETURN_HR_INVALIDARG_IF_NULL(buffer); + RETURN_HR_INVALIDARG_IF_NULL(entityKey); + + ModelBuffer b{ buffer, bufferSize }; + auto copyResult = entity->EntityKey().Copy(b); + RETURN_IF_FAILED(copyResult.hr); + *entityKey = copyResult.ExtractPayload(); + if (bufferUsed) + { + *bufferUsed = bufferSize - b.RemainingSpace(); + } + return S_OK; + }); +} + +PF_API PFEntityIsTitlePlayer( + _In_ PFEntityHandle entityHandle, + _Out_ bool* isTitlePlayer +) noexcept +{ + return EntityApiImpl(XASYNC_IDENTITY(PFEntityIsTitlePlayer), entityHandle, [&](SharedPtr entity) + { + RETURN_HR_INVALIDARG_IF_NULL(isTitlePlayer); + *isTitlePlayer = std::strcmp(entity->EntityKey().Model().type, PFEntityTitlePlayerEntityType) == 0; + return S_OK; + }); +} + +PF_API PFEntityGetAPIEndpointSize( + _In_ PFEntityHandle entityHandle, + _Out_ size_t* apiEndpointSize +) noexcept +{ + return EntityApiImpl(XASYNC_IDENTITY(PFEntityGetAPIEndpointSize), entityHandle, [&](SharedPtr entity) + { + RETURN_HR_INVALIDARG_IF_NULL(apiEndpointSize); + *apiEndpointSize = entity->ServiceConfig()->APIEndpoint().size() + 1; + return S_OK; + }); +} + +PF_API PFEntityGetAPIEndpoint( + _In_ PFEntityHandle entityHandle, + _In_ size_t apiEndpointSize, + _Out_writes_(apiEndpointSize) char* apiEndpointBuffer, + _Out_opt_ size_t* apiEndpointUsed +) noexcept +{ + return EntityApiImpl(XASYNC_IDENTITY(PFEntityGetAPIEndpoint), entityHandle, [&](SharedPtr entity) + { + RETURN_HR_INVALIDARG_IF_NULL(apiEndpointBuffer); + + String const& apiEndpoint = entity->ServiceConfig()->APIEndpoint(); + RETURN_HR_IF(E_INVALIDARG, apiEndpointSize < apiEndpoint.size() + 1); + + memcpy(apiEndpointBuffer, apiEndpoint.data(), apiEndpoint.size() + 1); + + if (apiEndpointUsed) + { + *apiEndpointUsed = apiEndpoint.size() + 1; + } + + return S_OK; + }); +} + +PF_API PFEntityRegisterTokenExpiredEventHandler( + _In_opt_ XTaskQueueHandle queue, + _In_opt_ void* context, + _In_ PFEntityTokenExpiredEventHandler* handler, + _Out_ PFRegistrationToken* token +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEntityRegisterTokenExpiredEventHandler), [&](GlobalState& state) + { + return state.TokenExpiredHandler().RegisterClientHandler(state.RunContext().DeriveOnQueue(queue), context, handler, token); + }); +} + +PF_API_(void) PFEntityUnregisterTokenExpiredEventHandler( + _In_ PFRegistrationToken token +) noexcept +{ + SharedPtr state; + GlobalState::Get(state); + if (state) + { + state->TokenExpiredHandler().UnregisterClientHandler(token); + } +} + +PF_API PFEntityRegisterTokenRefreshedEventHandler( + _In_ XTaskQueueHandle queue, + _In_opt_ void* context, + _In_ PFEntityTokenRefreshedEventHandler* handler, + _Out_ PFRegistrationToken* token +) noexcept +{ + SharedPtr state; + RETURN_IF_FAILED(GlobalState::Get(state)); + + return state->TokenRefreshedHandler().RegisterClientHandler( + state->RunContext().DeriveOnQueue(queue), + context, + handler, + token + ); +} + +PF_API_(void) PFEntityUnregisterTokenRefreshedEventHandler( + _In_ PFRegistrationToken token +) noexcept +{ + + SharedPtr state; + GlobalState::Get(state); + if (state) + { + state->TokenRefreshedHandler().UnregisterClientHandler(token); + } +} diff --git a/Source/PlayFabCore/Source/Api/PFEventPipeline.cpp b/Source/PlayFabCore/Source/Api/PFEventPipeline.cpp new file mode 100644 index 0000000..cb30509 --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFEventPipeline.cpp @@ -0,0 +1,260 @@ +#include "stdafx.h" +#include "playfab/core/PFEventPipeline.h" +#include "EventPipeline/EventPipeline.h" +#include "ApiHelpers.h" + +using namespace PlayFab; + +HRESULT EventPipelineCreationHelper( + PFEventPipelineType eventPipelineType, + PFEventPipelineConfig* eventPipelineConfig, + PFEntityHandle entityHandle, + PFEventPipelineTelemetryKeyConfig* eventPipelineTelemetryKeyConfig, + XTaskQueueHandle queue, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext, + GlobalState& state, + PFEventPipelineHandle* eventPipelineHandle +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(eventPipelineHandle); + + // Telemetry Key is not valid for PlayStream Event Pipeline + if (eventPipelineType == PFEventPipelineType::PlayStream) + { + RETURN_HR_IF(E_INVALIDARG, !entityHandle); + } + else + { + RETURN_HR_IF(E_INVALIDARG, !entityHandle && !eventPipelineTelemetryKeyConfig); + RETURN_HR_IF(E_INVALIDARG, eventPipelineTelemetryKeyConfig && (!eventPipelineTelemetryKeyConfig->telemetryKey || !eventPipelineTelemetryKeyConfig->serviceConfigHandle)); + } + + SharedPtr entity; + SharedPtr serviceConfig; + + if (entityHandle) + { + RETURN_IF_FAILED(state.Entities().FromHandle(entityHandle, entity)); + } + else + { + RETURN_IF_FAILED(state.ServiceConfigs().FromHandle(eventPipelineTelemetryKeyConfig->serviceConfigHandle, serviceConfig)); + } + + uint32_t maxEvents, maxWaitTime, pollDelay; + + if (eventPipelineType == PFEventPipelineType::PlayStream) + { + maxEvents = !eventPipelineConfig || !eventPipelineConfig->maxEventsPerBatch ? PFPlayStreamEventPipelineMaxEventsPerBatchDefault : *eventPipelineConfig->maxEventsPerBatch; + maxWaitTime = !eventPipelineConfig || !eventPipelineConfig->maxWaitTimeInSeconds ? PFPlayStreamEventPipelineMaxWaitTimeInSecondsDefault : *eventPipelineConfig->maxWaitTimeInSeconds; + pollDelay = !eventPipelineConfig || !eventPipelineConfig->pollDelayInMs ? PFPlayStreamEventPipelinePollDelayInMsDefault : *eventPipelineConfig->pollDelayInMs; + } + else + { + maxEvents = !eventPipelineConfig || !eventPipelineConfig->maxEventsPerBatch ? PFTelemetryEventPipelineMaxEventsPerBatchDefault : *eventPipelineConfig->maxEventsPerBatch; + maxWaitTime = !eventPipelineConfig || !eventPipelineConfig->maxWaitTimeInSeconds ? PFTelemetryEventPipelineMaxWaitTimeInSecondsDefault : *eventPipelineConfig->maxWaitTimeInSeconds; + pollDelay = !eventPipelineConfig || !eventPipelineConfig->pollDelayInMs ? PFTelemetryEventPipelinePollDelayInMsDefault : *eventPipelineConfig->pollDelayInMs; + } + + SharedPtr pipeline; + + if (entityHandle) + { + pipeline = MakeShared( + state.RunContext().DeriveOnQueue(queue), + entity, + eventPipelineType, + maxEvents, + maxWaitTime, + pollDelay, + batchUploadedEventHandler, + batchFailedEventHandler, + handlerContext + ); + } + else + { + pipeline = MakeShared( + state.RunContext().DeriveOnQueue(queue), + serviceConfig, + eventPipelineTelemetryKeyConfig->telemetryKey, + eventPipelineType, + maxEvents, + maxWaitTime, + pollDelay, + batchUploadedEventHandler, + batchFailedEventHandler, + handlerContext + ); + } + + return state.ClientEventPipelines().MakeHandle(std::move(pipeline), *eventPipelineHandle); +} + +PF_API PFEventPipelineCreateTelemetryPipelineHandleWithKey( + _In_ PFEventPipelineTelemetryKeyConfig* eventPipelineTelemetryKeyConfig, + _In_opt_ XTaskQueueHandle queue, + _In_opt_ PFEventPipelineBatchUploadSucceededEventHandler* eventPipelineBatchUploadedEventHandler, + _In_opt_ PFEventPipelineBatchUploadFailedEventHandler* eventPipelineBatchFailedEventHandler, + _In_opt_ void* handlerContext, + _Out_ PFEventPipelineHandle* eventPipelineHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineCreateTelemetryPipelineHandleWithKey), [&](GlobalState& state) + { + return EventPipelineCreationHelper( + PFEventPipelineType::Telemetry, + nullptr, + nullptr, + eventPipelineTelemetryKeyConfig, + queue, + eventPipelineBatchUploadedEventHandler, + eventPipelineBatchFailedEventHandler, + handlerContext, + state, + eventPipelineHandle + ); + }); +} + +PF_API PFEventPipelineCreateTelemetryPipelineHandleWithEntity( + _In_ PFEntityHandle entityHandle, + _In_opt_ XTaskQueueHandle queue, + _In_opt_ PFEventPipelineBatchUploadSucceededEventHandler* eventPipelineBatchUploadedEventHandler, + _In_opt_ PFEventPipelineBatchUploadFailedEventHandler* eventPipelineBatchFailedEventHandler, + _In_opt_ void* handlerContext, + _Out_ PFEventPipelineHandle* eventPipelineHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineCreateTelemetryPipelineHandleWithEntity), [&](GlobalState& state) + { + return EventPipelineCreationHelper( + PFEventPipelineType::Telemetry, + nullptr, + entityHandle, + nullptr, + queue, + eventPipelineBatchUploadedEventHandler, + eventPipelineBatchFailedEventHandler, + handlerContext, + state, + eventPipelineHandle + ); + }); +} + +PF_API PFEventPipelineCreatePlayStreamPipelineHandle( + _In_ PFEntityHandle entityHandle, + _In_opt_ XTaskQueueHandle queue, + _In_opt_ PFEventPipelineBatchUploadSucceededEventHandler* eventPipelineBatchUploadedEventHandler, + _In_opt_ PFEventPipelineBatchUploadFailedEventHandler* eventPipelineBatchFailedEventHandler, + _In_opt_ void* handlerContext, + _Out_ PFEventPipelineHandle* eventPipelineHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineCreatePlayStreamPipelineHandle), [&](GlobalState& state) + { + return EventPipelineCreationHelper( + PFEventPipelineType::PlayStream, + nullptr, + entityHandle, + nullptr, + queue, + eventPipelineBatchUploadedEventHandler, + eventPipelineBatchFailedEventHandler, + handlerContext, + state, + eventPipelineHandle + ); + }); +} + +PF_API PFEventPipelineDuplicateHandle( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEventPipelineHandle* duplicatedEventPipelineHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineDuplicateHandle), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(duplicatedEventPipelineHandle); + + SharedPtr pipeline; + RETURN_IF_FAILED(state.ClientEventPipelines().FromHandle(eventPipelineHandle, pipeline)); + return state.ClientEventPipelines().MakeHandle(std::move(pipeline), *duplicatedEventPipelineHandle); + }); +} + +PF_API_(void) PFEventPipelineCloseHandle( + _In_ PFEventPipelineHandle eventPipelineHandle +) noexcept +{ + ApiImpl(XASYNC_IDENTITY(PFEventPipelineCloseHandle), [&](GlobalState& state) + { + state.ClientEventPipelines().CloseHandle(eventPipelineHandle); + return S_OK; + }); +} + +PF_API PFEventPipelineEmitEvent( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEvent const* event +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineEmitEvent), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(event); + + SharedPtr pipeline; + RETURN_IF_FAILED(state.ClientEventPipelines().FromHandle(eventPipelineHandle, pipeline)); + + return pipeline->EmitEvent(*event); + }); +} + +PF_API PFEventPipelineAddUploadingEntity( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEntityHandle entityHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineAddUploadingEntity), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + + SharedPtr pipeline; + RETURN_IF_FAILED(state.ClientEventPipelines().FromHandle(eventPipelineHandle, pipeline)); + + SharedPtr entity; + RETURN_IF_FAILED(state.Entities().FromHandle(entityHandle, entity)); + + return pipeline->AddUploadingEntity(entity); + }); +} + +PF_API PFEventPipelineRemoveUploadingEntity( + _In_ PFEventPipelineHandle eventPipelineHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineRemoveUploadingEntity), [&](GlobalState& state) + { + SharedPtr pipeline; + RETURN_IF_FAILED(state.ClientEventPipelines().FromHandle(eventPipelineHandle, pipeline)); + + return pipeline->RemoveUploadingEntity(); + }); +} + +PF_API PFEventPipelineUpdateConfiguration( + _In_ PFEventPipelineHandle eventPipelineHandle, + _In_ PFEventPipelineConfig eventPipelineConfig +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFEventPipelineUpdateConfiguration), [&](GlobalState& state) + { + SharedPtr pipeline; + RETURN_IF_FAILED(state.ClientEventPipelines().FromHandle(eventPipelineHandle, pipeline)); + + return pipeline->UpdateConfiguration(eventPipelineConfig); + }); +} \ No newline at end of file diff --git a/Source/PlayFabCore/Source/Api/PFEvents.cpp b/Source/PlayFabCore/Source/Api/PFEvents.cpp new file mode 100644 index 0000000..f78d6b9 --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFEvents.cpp @@ -0,0 +1,105 @@ +#include "stdafx.h" +#include +#include "Events/Events.h" +#include "ApiXAsyncProvider.h" +#include "ApiHelpers.h" + +using namespace PlayFab; +using namespace PlayFab::Events; + +PF_API PFEventsWriteEventsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsWriteEventsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsWriteEventsAsync), + std::bind(&EventsAPI::WriteEvents, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsWriteEventsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsWriteEventsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsWriteEventsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFEventsWriteTelemetryEventsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsWriteEventsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsWriteTelemetryEventsAsync), + std::bind(&EventsAPI::WriteTelemetryEvents, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsWriteTelemetryEventsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsWriteTelemetryEventsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsWriteEventsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabCore/Source/Api/PFHttpConfig.cpp b/Source/PlayFabCore/Source/Api/PFHttpConfig.cpp new file mode 100644 index 0000000..d8cd58d --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFHttpConfig.cpp @@ -0,0 +1,29 @@ +#include "stdafx.h" +#include "Common/GlobalState.h" +#include "Common/ApiHelpers.h" + +using namespace PlayFab; + +PF_API PFSetHttpRetrySettings( + _In_ PFHttpRetrySettings const* settings +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFSetHttpRetrySettings), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(settings); + *state.HttpRetrySettings() = *settings; + return S_OK; + }); +} + +PF_API PFGetHttpRetrySettings( + _Out_ PFHttpRetrySettings* settings +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFGetHttpRetrySettings), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(settings); + *settings = *state.HttpRetrySettings(); + return S_OK; + }); +} diff --git a/Source/PlayFabCore/Source/Api/PFPlatform.cpp b/Source/PlayFabCore/Source/Api/PFPlatform.cpp new file mode 100644 index 0000000..88d1ede --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFPlatform.cpp @@ -0,0 +1,60 @@ +#include "stdafx.h" +#include +#include "Platform/Platform.h" +#include "GlobalState.h" + +using namespace PlayFab; + +PF_API PFMemSetFunctions( + _In_ PFMemoryHooks* hooks +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(hooks); + + SharedPtr state; + GlobalState::Get(state); + RETURN_HR_IF(E_PF_CORE_ALREADY_INITIALIZED, state); + + RETURN_IF_FAILED(PlayFab::SetMemoryHooks(*hooks)); + + // Try to set the memory hooks for libHttpClient as well. If it has already be initialized, there is nothing we can do + HRESULT hr = HCMemSetFunctions([](size_t size, HCMemoryType) + { + return PlayFab::Alloc(size); + }, + [](void* pointer, HCMemoryType) + { + return PlayFab::Free(pointer); + }); + + if (FAILED(hr) && hr != E_HC_ALREADY_INITIALISED) + { + return hr; + } + + return S_OK; +} + +PF_API PFMemGetFunctions( + _Out_ PFMemoryHooks* hooks +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(hooks); + + *hooks = PlayFab::GetMemoryHooks(); + return S_OK; +} + + +PF_API PFPlatformLocalStorageSetHandlers( + _In_ PFLocalStorageHooks* hooks +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(hooks); + + SharedPtr state; + GlobalState::Get(state); + RETURN_HR_IF(E_PF_CORE_ALREADY_INITIALIZED, state); + + return PlayFab::Detail::SetLocalStorageHandlers(*hooks); +} diff --git a/Source/PlayFabCore/Source/Api/PFServiceConfig.cpp b/Source/PlayFabCore/Source/Api/PFServiceConfig.cpp new file mode 100644 index 0000000..d555b19 --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFServiceConfig.cpp @@ -0,0 +1,128 @@ +#include "stdafx.h" +#include +#include "GlobalState.h" +#include "ServiceConfig.h" +#include "ApiHelpers.h" + +using namespace PlayFab; + +PF_API PFServiceConfigCreateHandle( + _In_z_ const char* apiEndpoint, + _In_z_ const char* titleId, + _Out_ PFServiceConfigHandle* serviceConfigHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFServiceConfigCreateHandle), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(apiEndpoint); + RETURN_HR_INVALIDARG_IF_NULL(titleId); + RETURN_HR_INVALIDARG_IF_NULL(serviceConfigHandle); + + auto serviceConfig = MakeShared(apiEndpoint, titleId, state.HttpRetrySettings()); + return state.ServiceConfigs().MakeHandle(std::move(serviceConfig), *serviceConfigHandle); + }); +} + +PF_API PFServiceConfigDuplicateHandle( + PFServiceConfigHandle handle, + PFServiceConfigHandle* duplicatedHandle +) noexcept +{ + return ApiImpl(XASYNC_IDENTITY(PFServiceConfigDuplicateHandle), [&](GlobalState& state) + { + RETURN_HR_INVALIDARG_IF_NULL(duplicatedHandle); + + SharedPtr serviceConfig; + RETURN_IF_FAILED(state.ServiceConfigs().FromHandle(handle, serviceConfig)); + return state.ServiceConfigs().MakeHandle(std::move(serviceConfig), *duplicatedHandle); + }); +} + +PF_API_(void) PFServiceConfigCloseHandle( + PFServiceConfigHandle handle +) noexcept +{ + ApiImpl(XASYNC_IDENTITY(PFServiceConfigCloseHandle), [&](GlobalState& state) + { + state.ServiceConfigs().CloseHandle(handle); + return S_OK; + }); +} + +PF_API PFServiceConfigGetAPIEndpointSize( + _In_ PFServiceConfigHandle handle, + _Out_ size_t* apiEndpointSize +) noexcept +{ + return ServiceConfigApiImpl(XASYNC_IDENTITY(PFServiceConfigGetAPIEndpointSize), handle, [&](SharedPtr serviceConfig) + { + RETURN_HR_INVALIDARG_IF_NULL(apiEndpointSize); + + *apiEndpointSize = serviceConfig->HttpClient()->APIEndpoint().size() + 1; + return S_OK; + }); +} + +PF_API PFServiceConfigGetAPIEndpoint( + _In_ PFServiceConfigHandle handle, + _In_ size_t apiEndpointSize, + _Out_writes_(apiEndpointSize) char* apiEndpointBuffer, + _Out_opt_ size_t* apiEndpointUsed +) noexcept +{ + return ServiceConfigApiImpl(XASYNC_IDENTITY(PFServiceConfigGetAPIEndpoint), handle, [&](SharedPtr serviceConfig) + { + RETURN_HR_INVALIDARG_IF_NULL(apiEndpointBuffer); + + String const& apiEndpoint = serviceConfig->HttpClient()->APIEndpoint(); + RETURN_HR_IF(E_INVALIDARG, apiEndpointSize < apiEndpoint.size() + 1); + + memcpy(apiEndpointBuffer, apiEndpoint.data(), apiEndpoint.size() + 1); + + if (apiEndpointUsed) + { + *apiEndpointUsed = apiEndpoint.size() + 1; + } + + return S_OK; + }); +} + +PF_API PFServiceConfigGetTitleIdSize( + _In_ PFServiceConfigHandle handle, + _Out_ size_t* titleIdSize +) noexcept +{ + return ServiceConfigApiImpl(XASYNC_IDENTITY(PFServiceConfigGetTitleIdSize), handle, [&](SharedPtr serviceConfig) + { + RETURN_HR_INVALIDARG_IF_NULL(titleIdSize); + + *titleIdSize = serviceConfig->TitleId().size() + 1; + return S_OK; + }); +} + +PF_API PFServiceConfigGetTitleId( + _In_ PFServiceConfigHandle handle, + _In_ size_t titleIdSize, + _Out_writes_(titleIdSize) char* titleIdBuffer, + _Out_opt_ size_t* titleIdUsed +) noexcept +{ + return ServiceConfigApiImpl(XASYNC_IDENTITY(PFServiceConfigGetTitleId), handle, [&](SharedPtr serviceConfig) + { + RETURN_HR_INVALIDARG_IF_NULL(titleIdBuffer); + + String const& titleId = serviceConfig->TitleId(); + RETURN_HR_IF(E_INVALIDARG, titleIdSize < titleId.size() + 1); + + memcpy(titleIdBuffer, titleId.data(), titleId.size() + 1); + + if (titleIdUsed) + { + *titleIdUsed = titleId.size() + 1; + } + + return S_OK; + }); +} diff --git a/Source/PlayFabCore/Source/Api/PFTrace.cpp b/Source/PlayFabCore/Source/Api/PFTrace.cpp new file mode 100644 index 0000000..ce4bdab --- /dev/null +++ b/Source/PlayFabCore/Source/Api/PFTrace.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" +#include +#include "Common/GlobalState.h" +#include "Trace/TraceState.h" + +using namespace PlayFab; + +PF_API PFTraceEnableTraceToFile( + _In_z_ const char* traceFileDirectory +) noexcept +{ + SharedPtr state; + GlobalState::Get(state); + RETURN_HR_IF(E_PF_CORE_ALREADY_INITIALIZED, state); + + auto& settings = GetTraceSettings(); + settings.enableTraceToFile = true; + StrCpy(settings.traceFileDirectory, sizeof(settings.traceFileDirectory), traceFileDirectory); + + return S_OK; +} diff --git a/Source/PlayFabCore/Source/Authentication/CombinedLoginResult.cpp b/Source/PlayFabCore/Source/Authentication/CombinedLoginResult.cpp new file mode 100644 index 0000000..b8b3538 --- /dev/null +++ b/Source/PlayFabCore/Source/Authentication/CombinedLoginResult.cpp @@ -0,0 +1,112 @@ +#include "stdafx.h" +#include "CombinedLoginResult.h" +#include "GlobalState.h" +#include "JsonUtils.h" + +namespace PlayFab +{ +namespace Authentication +{ + +CombinedLoginResult::CombinedLoginResult(SharedPtr globalState) noexcept + : m_globalState{ std::move(globalState) } +{ +} + +Result CombinedLoginResult::FromJson( + const JsonValue& loginResponse, + SharedPtr globalState, + SharedPtr serviceConfig, + SharedPtr loginContext +) noexcept +{ + CombinedLoginResult result{ std::move(globalState) }; + + RETURN_IF_FAILED(result.loginResult.FromJson(loginResponse)); + + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(loginResponse, "EntityToken", entityToken)); + + auto makeEntityResult = Entity::Make( + std::move(entityToken), + std::move(serviceConfig), + result.m_globalState->RunContext().Derive(), + std::move(loginContext), + result.m_globalState->TokenExpiredHandler(), + result.m_globalState->TokenRefreshedHandler() + ); + + RETURN_IF_FAILED(makeEntityResult.hr); + result.entity = makeEntityResult.ExtractPayload(); + + return result; +} + +size_t CombinedLoginResult::RequiredBufferSize() const +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += loginResult.RequiredBufferSize(); + return requiredSize; +} + +Result CombinedLoginResult::Copy(ModelBuffer& buffer) const +{ + auto allocResult = buffer.Alloc(1); + RETURN_IF_FAILED(allocResult.hr); + + auto output = allocResult.ExtractPayload(); + + // Create PFEntityHandle for entity + RETURN_IF_FAILED(m_globalState->Entities().MakeHandle(entity, output->entityHandle)); + + // Copy LoginResult + auto propCopyResult = buffer.CopyTo(&loginResult.Model()); + RETURN_IF_FAILED(propCopyResult.hr); + output->loginResult = propCopyResult.ExtractPayload(); + + return output; +} + +Result ServerCombinedLoginResult::FromJson( + const JsonValue& loginResponse +) noexcept +{ + ServerCombinedLoginResult result{}; + + RETURN_IF_FAILED(result.loginResult.FromJson(loginResponse)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(loginResponse, "EntityToken", result.entityTokenResponse)); + + return result; +} + +size_t ServerCombinedLoginResult::RequiredBufferSize() const +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += entityTokenResponse.RequiredBufferSize(); + requiredSize += loginResult.RequiredBufferSize(); + return requiredSize; +} + +Result ServerCombinedLoginResult::Copy(ModelBuffer& buffer) const +{ + auto allocResult = buffer.Alloc(1); + RETURN_IF_FAILED(allocResult.hr); + + auto output = allocResult.ExtractPayload(); + + // Copy LoginResult + auto propCopyResult = buffer.CopyTo(&loginResult.Model()); + RETURN_IF_FAILED(propCopyResult.hr); + output->loginResult = propCopyResult.ExtractPayload(); + + // Copy EntityToken + auto entityTokenCopyResult = buffer.CopyTo(&entityTokenResponse.Model()); + RETURN_IF_FAILED(entityTokenCopyResult.hr); + output->entityTokenResponse = entityTokenCopyResult.ExtractPayload(); + + return output; +} + +} // namespace Authentication +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Authentication/CombinedLoginResult.h b/Source/PlayFabCore/Source/Authentication/CombinedLoginResult.h new file mode 100644 index 0000000..b31f71b --- /dev/null +++ b/Source/PlayFabCore/Source/Authentication/CombinedLoginResult.h @@ -0,0 +1,88 @@ +#pragma once + +#include "Generated/AuthenticationTypes.h" +#include "Entity.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Authentication +{ + +// Struct to hold public result types. Although the entityHandle and loginResult are returned via separate parameters +// from the public API, XAsync only allows for a single result type per call +struct PFCombinedLoginResult +{ + PFAuthenticationLoginResult const* loginResult; + PFEntityHandle entityHandle; +}; + +// Internal combined LoginResult. Contains both the Entity object and the (trimmed) LoginResult model. +// Holds reference to GlobalState to create Entity object and handles to it. +class CombinedLoginResult : public ClientOutputModel +{ +public: + static Result FromJson( + const JsonValue& loginResponse, + SharedPtr globalState, + SharedPtr serviceConfig, + SharedPtr loginContext + ) noexcept; + + CombinedLoginResult(const CombinedLoginResult&) = default; + CombinedLoginResult(CombinedLoginResult&&) = default; + CombinedLoginResult& operator=(const CombinedLoginResult&) = delete; + virtual ~CombinedLoginResult() = default; + + LoginResult loginResult; + SharedPtr entity; + +public: + // ClientOutputModel + size_t RequiredBufferSize() const override; + // Copy into a buffer in order to return to client. Note that this method creates a PFEntityHandle + // that must later be closed by the client. + Result Copy(ModelBuffer& buffer) const override; + +private: + CombinedLoginResult(SharedPtr globalState) noexcept; + + // Need global state to Copy, as that creates a PFEntityHandle for 'entity' + SharedPtr const m_globalState; +}; + +// Struct to hold public server result types. Although the entityToken and loginResult are returned via separate parameters +// from the public API, XAsync only allows for a single result type per call +struct PFServerCombinedLoginResult +{ + PFAuthenticationLoginResult const* loginResult; + PFAuthenticationEntityTokenResponse const* entityTokenResponse; +}; + +// Internal combined ServerLoginResult. Contains both the EntityTokenResponse object and the (trimmed) LoginResult model. +class ServerCombinedLoginResult : public ClientOutputModel +{ +public: + static Result FromJson( + const JsonValue& loginResponse + ) noexcept; + + ServerCombinedLoginResult() = default; + ServerCombinedLoginResult(const ServerCombinedLoginResult&) = default; + ServerCombinedLoginResult(ServerCombinedLoginResult&&) = default; + ServerCombinedLoginResult& operator=(const ServerCombinedLoginResult&) = delete; + virtual ~ServerCombinedLoginResult() = default; + + LoginResult loginResult; + EntityTokenResponse entityTokenResponse; + +public: + // ClientOutputModel + size_t RequiredBufferSize() const override; + // Copy into a buffer in order to return to client. Note that this method creates a PFEntityHandle + // that must later be closed by the client. + Result Copy(ModelBuffer& buffer) const override; +}; + +} // namespace Authentication +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Authentication/GDK/Authentication_GDK.cpp b/Source/PlayFabCore/Source/Authentication/GDK/Authentication_GDK.cpp new file mode 100644 index 0000000..83f2080 --- /dev/null +++ b/Source/PlayFabCore/Source/Authentication/GDK/Authentication_GDK.cpp @@ -0,0 +1,140 @@ +#include "stdafx.h" +#include "Generated/Authentication.h" +#include "GlobalState.h" +#include "JsonUtils.h" +#include "GDK/PlatformUser_GDK.h" + +namespace PlayFab +{ +namespace Authentication +{ + +class XUserLoginContext : public LoginContext +{ +public: + XUserLoginContext(XUser&& platformUser, String titleId, const PFAuthenticationLoginWithXUserRequest& request); + + AsyncOp GetRequestBody(RunContext runContext) const override; + +private: + XUser m_platformUser; + String m_titleId; + LoginWithXboxRequest m_request; +}; + +XUserLoginContext::XUserLoginContext(XUser&& platformUser, String titleId, const PFAuthenticationLoginWithXUserRequest& request) + : LoginContext{ "/Client/LoginWithXbox", CacheId::AuthenticationLoginWithXbox }, + m_platformUser{ std::move(platformUser) }, + m_titleId{ std::move(titleId) }, + m_request{ PFAuthenticationLoginWithXboxRequest + { + request.createAccount, + request.customTags, + request.customTagsCount, + request.infoRequestParameters, + request.playerSecret, + nullptr // XboxToken, will be populated later + } + } +{ +} + +AsyncOp XUserLoginContext::GetRequestBody(RunContext runContext) const +{ + return m_platformUser.GetTokenAndSignature(runContext).Then([request{ this->m_request }, titleId{ this->m_titleId }](Result getTokenResult) mutable->Result + { + RETURN_IF_FAILED(getTokenResult.hr); + request.SetXboxToken(getTokenResult.Payload().token); + auto requestJson = request.ToJson(); + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestJson, "TitleId", titleId)); + return requestJson; + }); +} + +AsyncOp AuthenticationAPI::LoginWithXUser( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithXUserRequest& request, + RunContext rc +) +{ + auto duplicateUserHandleResult = XUser::Duplicate(request.Model().user); + RETURN_IF_FAILED(duplicateUserHandleResult.hr); + + auto loginContext = MakeShared(duplicateUserHandleResult.ExtractPayload(), serviceConfig->TitleId(), request.Model()); + + return loginContext->GetRequestBody(rc).Then([rc, serviceConfig, loginContext](Result requestBodyResult) mutable -> AsyncOp + { + const char* path{ "/Client/LoginWithXbox" }; + JsonValue requestBody{ requestBodyResult.ExtractPayload() }; + + return serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + CacheId::AuthenticationLoginWithXbox, + rc.Derive() + ); + + }).Then([state, serviceConfig, loginContext](Result result)->Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithXUser( + SharedPtr entity, + const LoginWithXUserRequest& request, + RunContext rc +) +{ + auto duplicateUserHandleResult = XUser::Duplicate(request.Model().user); + RETURN_IF_FAILED(duplicateUserHandleResult.hr); + + // Create a new XUserLoginContext. TODO, we need a way to set this in the entity + auto loginContext = MakeShared(duplicateUserHandleResult.ExtractPayload(), entity->ServiceConfig()->TitleId(), request.Model()); + + return loginContext->GetRequestBody(rc).Then([rc, entity](Result requestBodyResult) mutable -> AsyncOp + { + const char* path{ "/Client/LoginWithXbox" }; + JsonValue requestBody{ requestBodyResult.ExtractPayload() }; + + return entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + CacheId::AuthenticationLoginWithXbox, + rc.Derive() + ); + + }).Then([entity, loginContext](Result result)->Result + { + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} +} diff --git a/Source/PlayFabCore/Source/Authentication/GetEntityAsyncProvider.h b/Source/PlayFabCore/Source/Authentication/GetEntityAsyncProvider.h new file mode 100644 index 0000000..bcf5b3c --- /dev/null +++ b/Source/PlayFabCore/Source/Authentication/GetEntityAsyncProvider.h @@ -0,0 +1,66 @@ +#pragma once + +#include +#include "GlobalState.h" + +namespace PlayFab +{ + +// XAsyncProvider for PlayFab GetEntity API calls. This provider wraps an internal call which returns a SharedPtr rather than a ClientOutputModel. +// It holds a referece to the GlobalState so that it has access to the EntityTable and can create and provide a PFEntityHandle to the title in GetResult. +template +class GetEntityAsyncProvider : public XAsyncProviderBase +{ +public: + static_assert(std::is_same_v, typename Detail::UnwrapAsyncT>>, "CallT must return an Entity"); + + template + GetEntityAsyncProvider(RunContext&& runContext, XAsyncBlock* async, const char(&identityName)[n], CallT authCall, SharedPtr state) + : XAsyncProviderBase{ std::move(runContext), async, identityName }, + m_call{ authCall }, + m_state{ std::move(state) } + { + } + +protected: + HRESULT Begin(RunContext runContext) override + { + m_call(std::move(runContext)).Finally([this](Result> result) + { + if (Succeeded(result)) + { + TRACE_VERBOSE("AuthXAsyncProvider[ID=%s] Call suceeded (hr=0x%08x)", identityName, result.hr); + m_result = result.ExtractPayload(); + this->Complete(sizeof(PFEntityHandle)); + } + else + { + TRACE_ERROR("AuthXAsyncProvider[ID=%s] Call failed with message \"%s\" (hr=0x%08x)", identityName, result.errorMessage.data(), result.hr); + this->Fail(result.hr); + } + }); + + return S_OK; + } + + HRESULT GetResult(void* buffer, size_t bufferSize) override + { + UNREFERENCED_PARAMETER(bufferSize); + assert(bufferSize == sizeof(PFEntityHandle)); + auto entityHandlePtr = static_cast(buffer); + return m_state->Entities().MakeHandle(m_result, *entityHandlePtr); + } + +private: + CallT m_call; + SharedPtr m_state; + SharedPtr m_result; +}; + +template +UniquePtr> MakeGetEntityProvider(RunContext&& runContext, XAsyncBlock* async, const char(&identityName)[n], CallT authCall, SharedPtr state) +{ + return MakeUnique>(std::move(runContext), async, identityName, std::move(authCall), std::move(state)); +} + +} diff --git a/Source/PlayFabCore/Source/Authentication/LoginContext.cpp b/Source/PlayFabCore/Source/Authentication/LoginContext.cpp new file mode 100644 index 0000000..7a496ad --- /dev/null +++ b/Source/PlayFabCore/Source/Authentication/LoginContext.cpp @@ -0,0 +1,55 @@ +#include "stdafx.h" +#include "JsonUtils.h" +#include "LoginContext.h" + +namespace PlayFab +{ +namespace Authentication +{ + +LoginContext::LoginContext(const char* requestPath, CacheId retryCacheId) + : m_path{ requestPath }, + m_cacheId{ retryCacheId } +{ +} + +LoginContext::LoginContext(const char* requestPath, JsonValue&& requestBody, CacheId retryCacheId) + : m_path{ requestPath }, + m_requestBody{ std::move(requestBody) }, + m_cacheId{ retryCacheId } +{ +} + +LoginContext::LoginContext(const char* requestPath, JsonValue&& requestBody, UnorderedMap&& requestHeaders, CacheId retryCacheId) + : m_path{ requestPath }, + m_requestBody{ std::move(requestBody) }, + m_requestHeaders{ std::move(requestHeaders) }, + m_cacheId{ retryCacheId } +{ +} + +const char* LoginContext::RequestPath() const +{ + return m_path.data(); +} + +AsyncOp LoginContext::GetRequestBody(RunContext runContext) const +{ + UNREFERENCED_PARAMETER(runContext); // No async work to be done in base LoginContext + JsonValue requestBodyCopy; + JsonUtils::FromJson(m_requestBody, requestBodyCopy); + return Result{ std::move(requestBodyCopy) }; +} + +const UnorderedMap& LoginContext::RequestHeaders() const +{ + return m_requestHeaders; +} + +CacheId LoginContext::RetryCacheId() const +{ + return m_cacheId; +} + +} // namespace Authentication +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Authentication/LoginContext.h b/Source/PlayFabCore/Source/Authentication/LoginContext.h new file mode 100644 index 0000000..df3986a --- /dev/null +++ b/Source/PlayFabCore/Source/Authentication/LoginContext.h @@ -0,0 +1,34 @@ +#pragma once + +#include "Generated/CacheId.h" + +namespace PlayFab +{ +namespace Authentication +{ + +// Context needed to re-login after auth tokens expire. +// By default, the original auth request will just replayed without modification. For behavior specific to a particular login method, derive +// from this class and override methods as necessary. +class LoginContext +{ +public: + LoginContext(const char* requestPath, CacheId retryCacheId); + LoginContext(const char* requestPath, JsonValue&& requestBody, CacheId retryCacheId); + LoginContext(const char* requestPath, JsonValue&& requestBody, UnorderedMap&& requestHeaders, CacheId retryCacheId); + virtual ~LoginContext() = default; + + virtual const char* RequestPath() const; + virtual AsyncOp GetRequestBody(RunContext runContext) const; + virtual const UnorderedMap& RequestHeaders() const; + virtual CacheId RetryCacheId() const; + +private: + String m_path; + JsonValue m_requestBody; + UnorderedMap m_requestHeaders; + CacheId m_cacheId; +}; + +} // namespace Authentication +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Common/ApiHelpers.cpp b/Source/PlayFabCore/Source/Common/ApiHelpers.cpp new file mode 100644 index 0000000..7d05845 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/ApiHelpers.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "ApiHelpers.h" + +namespace PlayFab +{ +namespace Detail +{ + +HRESULT CALLBACK AsyncErrorProvider(XAsyncOp op, XAsyncProviderData const* data) +{ + assert(data); + RETURN_HR_IF(E_UNEXPECTED, !data); + + if (op == XAsyncOp::Begin) + { + UniquePtr resultPtr{ static_cast(data->context) }; + XAsyncComplete(data->async, *resultPtr, 0); + } + return S_OK; +} + +HRESULT CompleteAsyncWithError(XAsyncBlock* async, const char* apiIdentity, HRESULT hr) +{ + auto resultPtr = MakeUnique(hr); + RETURN_IF_FAILED(XAsyncBegin(async, resultPtr.get(), nullptr, apiIdentity, AsyncErrorProvider)); + resultPtr.release(); + return S_OK; +} + +} +} diff --git a/Source/PlayFabCore/Source/Common/ApiHelpers.h b/Source/PlayFabCore/Source/Common/ApiHelpers.h new file mode 100644 index 0000000..7bc91b9 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/ApiHelpers.h @@ -0,0 +1,119 @@ +#pragma once + +#include "Error.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Detail +{ +HRESULT CompleteAsyncWithError(XAsyncBlock* async, const char* apiIdentity, HRESULT hr); +} + +template +inline HRESULT ApiImpl(const char* apiIdentity, TWork&& work) noexcept +{ + try + { + SharedPtr state; + RETURN_IF_FAILED(GlobalState::Get(state)); + + return work(*state); + } + catch (...) + { + TRACE_WARNING("[0x%08X] Exception reached api boundary %s\n %s:%u", E_FAIL, apiIdentity, __FILE__, __LINE__); + return CurrentExceptionToHR(); + } +} + +template +inline HRESULT AsyncApiImpl(XAsyncBlock* async, const char* apiIdentity, TWork&& work) noexcept +{ + try + { + SharedPtr state; + HRESULT hr = GlobalState::Get(state); + if (FAILED(hr)) + { + return Detail::CompleteAsyncWithError(async, apiIdentity, hr); + } + + return work(*state); + } + catch (...) + { + TRACE_WARNING("[0x%08X] Exception reached api boundary %s\n %s:%u", E_FAIL, apiIdentity, __FILE__, __LINE__); + return CurrentExceptionToHR(); + } +} + +template +inline HRESULT ServiceConfigApiImpl(const char* apiIdentity, PFServiceConfigHandle serviceConfigHandle, TWork&& work) noexcept +{ + try + { + SharedPtr state; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr serviceConfig; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(serviceConfigHandle, serviceConfig)); + + return work(serviceConfig); + } + catch (...) + { + TRACE_WARNING("[0x%08X] Exception reached api boundary %s\n %s:%u", E_FAIL, apiIdentity, __FILE__, __LINE__); + return CurrentExceptionToHR(); + } +} + +template +inline HRESULT EntityApiImpl(const char* apiIdentity, PFEntityHandle entityHandle, TWork&& work) noexcept +{ + try + { + SharedPtr state; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + return work(std::move(entity)); + } + catch (...) + { + TRACE_WARNING("[0x%08X] Exception reached api boundary %s\n %s:%u", E_FAIL, apiIdentity, __FILE__, __LINE__); + return CurrentExceptionToHR(); + } +} + +template +inline HRESULT EntityAsyncApiImpl(XAsyncBlock* async, const char* apiIdentity, PFEntityHandle entityHandle, TWork&& work) noexcept +{ + try + { + SharedPtr state; + HRESULT hr = GlobalState::Get(state); + if (FAILED(hr)) + { + return Detail::CompleteAsyncWithError(async, apiIdentity, hr); + } + + SharedPtr entity; + hr = state->Entities().FromHandle(entityHandle, entity); + if (FAILED(hr)) + { + return Detail::CompleteAsyncWithError(async, apiIdentity, hr); + } + + return work(std::move(entity), state->RunContext().DeriveOnQueue(async->queue)); + } + catch (...) + { + TRACE_WARNING("[0x%08X] Exception reached api boundary %s\n %s:%u", E_FAIL, apiIdentity, __FILE__, __LINE__); + return CurrentExceptionToHR(); + } +} + +} diff --git a/Source/PlayFabCore/Source/Common/Entity.cpp b/Source/PlayFabCore/Source/Common/Entity.cpp new file mode 100644 index 0000000..8439700 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/Entity.cpp @@ -0,0 +1,456 @@ +#include "stdafx.h" +#include "Entity.h" +#include "Generated/Authentication.h" +#include "JsonUtils.h" + +#if HC_PLATFORM == HC_PLATFORM_GDK +#include +#include +#include +#endif + +namespace PlayFab +{ + +class TokenRefreshWorker : public ITaskQueueWork, public std::enable_shared_from_this +{ +public: + static SharedPtr MakeAndStart( + SharedPtr const& entity, + SharedPtr loginContext, + TokenExpiredHandler tokenExpiredHandler, + RunContext&& rc + ) noexcept; + + ~TokenRefreshWorker(); + + HRESULT OnLoginContextUpdated(SharedPtr loginContext); + + static void SetInterval(uint32_t interval) { s_interval = interval; } +#if _DEBUG + static void SetDebugForceExpireToken(bool expire) { s_debugForceExpireToken = expire; } +#endif + +private: + TokenRefreshWorker(SharedPtr const& entity, SharedPtr loginContext, TokenExpiredHandler tokenExpiredHandler, RunContext&& rc); + + // ITaskQueueWork + void Run() override; + + // Check validity of token and refresh if needed. Handles all errors and invokes TokenExpiredHandler as needed + void CheckAndRefreshToken(SharedPtr entity) noexcept; + + static bool CheckRefreshRequired(EntityToken const& token) noexcept; + + std::mutex m_mutex; + WeakPtr m_weakEntity; + SharedPtr m_loginContext; + TokenExpiredHandler m_tokenExpiredHandler; + PlayFab::RunContext m_rc; + +#if HC_PLATFORM == HC_PLATFORM_GDK + static void CALLBACK NetworkConnectivityChangedCallback(void* context, const XNetworkingConnectivityHint* hint); + static void CALLBACK AppStateChangedCallback(BOOLEAN isSuspended, void* context); + + bool m_resumeTokenCheckPending{ false }; + bool m_isSuspended{ false }; + + XTaskQueueRegistrationToken m_networkConnectivityChangedToken{}; + PAPPSTATE_REGISTRATION m_appStateChangedToken{ nullptr }; +#endif + + static uint32_t s_interval; +#if _DEBUG + static bool s_debugForceExpireToken; +#endif +}; + +uint32_t TokenRefreshWorker::s_interval = 1000 * 60 * 30; // 30 Minutes +#if _DEBUG +bool TokenRefreshWorker::s_debugForceExpireToken = false; +#endif + +#if _DEBUG +extern "C" __declspec(dllexport) void PFDebugSetTokenRefreshDebugState(bool expireToken) +{ + TokenRefreshWorker::SetDebugForceExpireToken(expireToken); +} + +extern "C" __declspec(dllexport) void PFDebugSetSetInterval(uint32_t interval) +{ + TokenRefreshWorker::SetInterval(interval); +} +#endif + +TokenRefreshWorker::TokenRefreshWorker(SharedPtr const& entity, SharedPtr loginContext, TokenExpiredHandler tokenExpiredHandler, PlayFab::RunContext&& rc) : + m_weakEntity{ entity }, + m_loginContext{ std::move(loginContext) }, + m_tokenExpiredHandler{ std::move(tokenExpiredHandler) }, + m_rc{ std::move(rc) } +{ +#if HC_PLATFORM == HC_PLATFORM_GDK + HRESULT hr = XNetworkingRegisterConnectivityHintChanged(m_rc.TaskQueueHandle(), this, TokenRefreshWorker::NetworkConnectivityChangedCallback, &m_networkConnectivityChangedToken); + if (FAILED(hr)) + { + TRACE_ERROR_HR(hr, "Failed to register for connectivity changed notifications"); + } + + hr = HRESULT_FROM_WIN32(RegisterAppStateChangeNotification(TokenRefreshWorker::AppStateChangedCallback, this, &m_appStateChangedToken)); + if (FAILED(hr)) + { + TRACE_ERROR_HR(hr, "Failed to register for app state change notifications"); + } +#endif +} + +TokenRefreshWorker::~TokenRefreshWorker() +{ +#if HC_PLATFORM == HC_PLATFORM_GDK + if (m_appStateChangedToken) + { + UnregisterAppStateChangeNotification(m_appStateChangedToken); + } + + if (m_networkConnectivityChangedToken.token) + { + XNetworkingUnregisterConnectivityHintChanged(m_networkConnectivityChangedToken, true); + } +#endif +} + +SharedPtr TokenRefreshWorker::MakeAndStart( + SharedPtr const& entity, + SharedPtr loginContext, + TokenExpiredHandler tokenExpiredHandler, + RunContext&& rc +) noexcept +{ + Allocator a; + SharedPtr worker{ new (a.allocate(1)) TokenRefreshWorker{ entity, std::move(loginContext), std::move(tokenExpiredHandler), std::move(rc) }, Deleter{}, a }; + + worker->m_rc.TaskQueueSubmitWork(worker); + return worker; +} + +HRESULT TokenRefreshWorker::OnLoginContextUpdated(SharedPtr loginContext) +{ + std::lock_guard lock{ m_mutex }; + m_loginContext = std::move(loginContext); + return S_OK; +} + +void TokenRefreshWorker::Run() +{ + SharedPtr entity{ m_weakEntity.lock() }; + if (entity) + { + CheckAndRefreshToken(std::move(entity)); + + // Reschedule ourselves. + // Note that with this implementation the TokenExpiredHandler will be invoked every s_interval until the token is restored. + // This may be fine, but we could include some additional logic to avoid that if desired. + m_rc.TaskQueueSubmitWork(shared_from_this(), s_interval); + } +} + +void TokenRefreshWorker::CheckAndRefreshToken(SharedPtr entity) noexcept +{ + auto getEntityTokenResult = entity->GetEntityToken(); + if (FAILED(getEntityTokenResult.hr)) + { + // If we are able to get an entity token for the Entity, invoke the TokenExpired handler. + TRACE_INFORMATION("TokenRefreshWorker unable to get EntityToken (hr = 0x%08x)"); + m_tokenExpiredHandler.Invoke(entity->EntityKey()); + } + else if (CheckRefreshRequired(getEntityTokenResult.Payload())) + { + // If the Entity doesn't have a LoginContext (i.e. it wasn't obtained by a login) invoked the TokenExpiredHandler so that the + // title can resolve the issue. We may want to have additional handling for this case in the future. + if (!m_loginContext) + { + TRACE_VERBOSE("TokenRefreshWorker: EntityToken requires refresh but has no LoginContext, invoking TokenExpiredHandler"); + m_tokenExpiredHandler.Invoke(entity->EntityKey()); + return; + } + + SharedPtr self{ shared_from_this() }; + + m_loginContext->GetRequestBody(m_rc).Then([entity, self](Result result) -> AsyncOp + { + RETURN_IF_FAILED(result.hr); + + return entity->ServiceConfig()->HttpClient()->MakePostRequest( + self->m_loginContext->RequestPath(), + self->m_loginContext->RequestHeaders(), + result.ExtractPayload(), + self->m_loginContext->RetryCacheId(), + self->m_rc.Derive() + ); + }).Then([entity, self](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + +#if _DEBUG + if (TokenRefreshWorker::s_debugForceExpireToken) + { + TokenRefreshWorker::s_debugForceExpireToken = false; + return E_FAIL; + } +#endif + + Authentication::EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(result.Payload().Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(std::move(entityToken))); + + return S_OK; + + }).Finally([entity, self](Result result) + { + // If we are unable to re-login for any reason, invoke the TokenExpiredHandler so the title can resolve the issue + if (Failed(result)) + { + TRACE_ERROR_HR(result.hr, "TokenRefreshWorker unable to restore EntityToken, invoking TokenExpiredHandler"); + self->m_tokenExpiredHandler.Invoke(entity->EntityKey()); + } + else + { + TRACE_VERBOSE("TokenRefreshWorker: Tokens successfully refreshed"); + } + }); + } +} + +bool TokenRefreshWorker::CheckRefreshRequired(EntityToken const& token) noexcept +{ + // This was just a first crack at a refresh heuristic. We may want to refine this and sync with the + // service team about recommended refresh policy. + time_t const* expiration{ token.expiration }; + if (expiration && (*expiration - time(nullptr)) < (60 * 60)) + { + return true; + } + +#if _DEBUG + if (TokenRefreshWorker::s_debugForceExpireToken) + { + return true; + } +#endif + + return false; +} + +#if HC_PLATFORM == HC_PLATFORM_GDK + +void TokenRefreshWorker::NetworkConnectivityChangedCallback(void* context, const XNetworkingConnectivityHint* /*hint*/) +{ + assert(context); + auto worker = static_cast(context); + + std::unique_lock lock{ worker->m_mutex }; + + // Ignore network connectivity changes if we are suspended + if (!worker->m_isSuspended) + { + // Always requery the latest network connectivity hint rather than relying on the passed parameter in case this is a stale notification + XNetworkingConnectivityHint hint{}; + HRESULT hr = XNetworkingGetConnectivityHint(&hint); + if (SUCCEEDED(hr)) + { + TRACE_VERBOSE("NetworkConnectivityChangedCallback, hint.networkInitialized=%d, hint.connectivityLevel=%d", hint.networkInitialized, hint.connectivityLevel); + if (hint.networkInitialized && worker->m_resumeTokenCheckPending) + { + worker->m_resumeTokenCheckPending = false; + lock.unlock(); + + SharedPtr entity{ worker->m_weakEntity.lock() }; + if (entity) + { + worker->CheckAndRefreshToken(std::move(entity)); + } + } + } + else + { + TRACE_ERROR_HR(hr, "Unable to get NetworkConnectivityHint"); + } + } +} + +void CALLBACK TokenRefreshWorker::AppStateChangedCallback(BOOLEAN isSuspended, void* context) +{ + assert(context); + auto worker = static_cast(context); + + std::unique_lock lock{ worker->m_mutex }; + + if (isSuspended) + { + worker->m_isSuspended = true; + worker->m_resumeTokenCheckPending = true; + } + else + { + assert(worker->m_isSuspended); + worker->m_isSuspended = false; + + lock.unlock(); + + // Force a query of network state since we've ignored notifications during suspend. The EntityToken will + // also be checked and refresh if needed here + NetworkConnectivityChangedCallback(worker, nullptr); + } +} +#endif + +Result> Entity::Make( + Authentication::EntityTokenResponse&& entityTokenResponse, + SharedPtr serviceConfig, + RunContext&& tokenRefreshContext, + SharedPtr loginContext, + TokenExpiredHandler tokenExpiredHandler, + TokenRefreshedHandler tokenRefreshedHandler, + std::optional secretKey +) noexcept +{ + RETURN_HR_IF(E_FAIL, !entityTokenResponse.Model().entity); + + Allocator a{}; + SharedPtr entity{ + new (a.allocate(1)) Entity{ + std::move(serviceConfig), + PlayFab::EntityKey(*entityTokenResponse.Model().entity), + PlayFab::EntityToken(entityTokenResponse), + std::move(secretKey), + std::move(tokenRefreshedHandler) + }, Deleter(), a + }; + + entity->m_tokenRefreshWorker = TokenRefreshWorker::MakeAndStart(entity, std::move(loginContext), std::move(tokenExpiredHandler), std::move(tokenRefreshContext)); + + return entity; +} + +Result> Entity::Make( + Authentication::GetEntityTokenResponse&& entityTokenResponse, + SharedPtr serviceConfig, + RunContext&& tokenRefreshContext, + TokenExpiredHandler tokenExpiredHandler, + TokenRefreshedHandler tokenRefreshedHandler, + std::optional secretKey +) noexcept +{ + RETURN_HR_IF(E_FAIL, !entityTokenResponse.entity); + + Allocator a{}; + SharedPtr entity{ + new (a.allocate(1)) Entity{ + std::move(serviceConfig), + PlayFab::EntityKey(*entityTokenResponse.entity), + PlayFab::EntityToken(entityTokenResponse), + std::move(secretKey), + std::move(tokenRefreshedHandler) + }, Deleter(), a + }; + + entity->m_tokenRefreshWorker = TokenRefreshWorker::MakeAndStart(entity, nullptr, std::move(tokenExpiredHandler), std::move(tokenRefreshContext)); + + return entity; +} + +Entity::Entity( + SharedPtr serviceConfig, + PlayFab::EntityKey&& entityKey, + PlayFab::EntityToken&& entityToken, + std::optional secretKey, + TokenRefreshedHandler tokenRefreshedHandler +) noexcept : + m_key{ std::move(entityKey) }, + m_entityToken{ std::move(entityToken) }, + m_secretKey{ std::move(secretKey) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_tokenRefreshedHandler{ std::move(tokenRefreshedHandler) } +{ +} + +SharedPtr Entity::ServiceConfig() const +{ + return m_serviceConfig; +} + +PlayFab::EntityKey const& Entity::EntityKey() const +{ + return m_key; +} + +Result Entity::GetEntityToken() const +{ + std::unique_lock lock{ m_mutex }; + if (m_entityToken.expiration && *m_entityToken.expiration < GetTimeTNow()) + { + return E_PF_NOENTITYTOKEN; + } + return PlayFab::EntityToken{ m_entityToken }; +} + +Result Entity::GetSecretKey() const +{ + // No lock needed here since SecretKey is const + if (!m_secretKey.has_value()) + { + return E_PF_NOSECRETKEY; + } + return String{ m_secretKey.value() }; +} + +HRESULT Entity::OnEntityTokenRefreshed(Authentication::EntityTokenResponse const& entityTokenResponse) +{ + std::unique_lock lock{ m_mutex }; + + RETURN_HR_IF(E_FAIL, entityTokenResponse.Model().entity == nullptr); + + if (std::strcmp(entityTokenResponse.Model().entity->id, m_key.Model().id)) + { + TRACE_ERROR("%s: attempting to set EntityToken with mismatched entityKey", __FUNCTION__); + return E_FAIL; + } + + PlayFab::EntityToken newToken{ entityTokenResponse }; + m_entityToken = newToken; + + // Release lock before invoke handler (m_key and m_tokenRefreshedHandler are const and safe to access without lock) + lock.unlock(); + m_tokenRefreshedHandler.Invoke(m_key, newToken); + + return S_OK; +} + +HRESULT Entity::OnEntityTokenRefreshed(Authentication::GetEntityTokenResponse const& entityTokenResponse) +{ + std::unique_lock lock{ m_mutex }; + + RETURN_HR_IF(E_FAIL, !entityTokenResponse.entity.has_value()); + + if (std::strcmp(entityTokenResponse.entity->Model().id, m_key.Model().id)) + { + TRACE_ERROR("%s: attempting to set EntityToken with mismatched entityKey", __FUNCTION__); + return E_FAIL; + } + + PlayFab::EntityToken newToken{ entityTokenResponse }; + m_entityToken = newToken; + + // Release lock before invoke handler (m_key and m_tokenRefreshedHandler are const and safe to access without lock) + lock.unlock(); + m_tokenRefreshedHandler.Invoke(m_key, newToken); + + return S_OK; +} + +HRESULT Entity::OnLoginContextUpdated(SharedPtr loginContext) +{ + std::unique_lock lock{ m_mutex }; + return m_tokenRefreshWorker->OnLoginContextUpdated(std::move(loginContext)); +} + +} diff --git a/Source/PlayFabCore/Source/Common/Entity.h b/Source/PlayFabCore/Source/Common/Entity.h new file mode 100644 index 0000000..9d88f6a --- /dev/null +++ b/Source/PlayFabCore/Source/Common/Entity.h @@ -0,0 +1,85 @@ +#pragma once + +#include +#include "ServiceConfig.h" +#include "EntityToken.h" +#include "TokenExpiredHandler.h" +#include "TokenRefreshedHandler.h" +#include "Authentication/LoginContext.h" + +namespace PlayFab +{ + +class TokenRefreshWorker; + +// An entity authenticated with PlayFab. An entity has a type, an ID, and an EntityToken. For more detail on PlayFab entities see the service +// documentation here: https://docs.microsoft.com/en-us/gaming/playfab/features/data/entities/quickstart. +class Entity : public std::enable_shared_from_this +{ +public: + // Create a new Entity from an EntityTokenResponse and ClientSessionTicket returned from a Login call + static Result> Make( + Authentication::EntityTokenResponse&& entityTokenResponse, + SharedPtr serviceConfig, + RunContext&& tokenRefreshContext, + SharedPtr loginContext, + TokenExpiredHandler tokenExpiredHandler, + TokenRefreshedHandler tokenRefreshedHandler, + std::optional secretKey = std::nullopt + ) noexcept; + + // Create a new Entity from a GetEntityTokenResponse + static Result> Make( + Authentication::GetEntityTokenResponse&& entityTokenResponse, + SharedPtr serviceConfig, + RunContext&& tokenRefreshContext, + TokenExpiredHandler tokenExpiredHandler, + TokenRefreshedHandler tokenRefreshedHandler, + std::optional secretKey = std::nullopt + ) noexcept; + + Entity(const Entity&) = delete; + Entity(Entity&&) = delete; + Entity& operator=(const Entity&) = delete; + Entity& operator=(Entity&&) = delete; + ~Entity() noexcept = default; + +public: + // ServiceConfig this Entity belongs to + SharedPtr ServiceConfig() const; + + // EntityKey for this Entity + EntityKey const& EntityKey() const; + + // Get the cached EntityToken + Result GetEntityToken() const; + + // Get the API SecretKey if one is available + Result GetSecretKey() const; + + // Update the cached LoginContext in the TokenRefreshWorker + HRESULT OnLoginContextUpdated(SharedPtr loginContext); + + // Handlers to update cached tokens when they are refreshed + HRESULT OnEntityTokenRefreshed(Authentication::EntityTokenResponse const& newToken); + HRESULT OnEntityTokenRefreshed(Authentication::GetEntityTokenResponse const& newToken); + +private: + Entity( + SharedPtr serviceConfig, + PlayFab::EntityKey&& entityKey, + PlayFab::EntityToken&& entityToken, + std::optional secretKey, + TokenRefreshedHandler tokenRefreshedHandler + ) noexcept; + + mutable std::mutex m_mutex; + PlayFab::EntityKey const m_key; + PlayFab::EntityToken m_entityToken; + std::optional const m_secretKey; + SharedPtr m_serviceConfig; + SharedPtr m_tokenRefreshWorker; + TokenRefreshedHandler const m_tokenRefreshedHandler; +}; + +} diff --git a/Source/PlayFabCore/Source/Common/EntityToken.cpp b/Source/PlayFabCore/Source/Common/EntityToken.cpp new file mode 100644 index 0000000..ce58d1f --- /dev/null +++ b/Source/PlayFabCore/Source/Common/EntityToken.cpp @@ -0,0 +1,95 @@ +#include "stdafx.h" +#include "EntityToken.h" + +namespace PlayFab +{ + +EntityToken::EntityToken(const Authentication::EntityTokenResponse& tokenResponse) : + PFEntityToken{}, + m_token{ tokenResponse.Model().entityToken}, + m_expiration{ tokenResponse.Model().tokenExpiration ? std::optional{ *tokenResponse.Model().tokenExpiration } : std::nullopt } +{ + token = m_token.empty() ? nullptr : m_token.data(); + expiration = m_expiration ? m_expiration.operator->() : nullptr; +} + +EntityToken::EntityToken(const Authentication::GetEntityTokenResponse& tokenResponse) : + PFEntityToken{}, + m_token{ tokenResponse.entityToken }, + m_expiration{ tokenResponse.tokenExpiration } +{ + token = m_token.empty() ? nullptr : m_token.data(); + expiration = m_expiration ? m_expiration.operator->() : nullptr; +} + +EntityToken::EntityToken(const EntityToken& src) : + m_token{ src.m_token }, + m_expiration{ src.m_expiration } +{ + token = m_token.empty() ? nullptr : m_token.data(); + expiration = m_expiration ? m_expiration.operator->() : nullptr; +} + +EntityToken::EntityToken(EntityToken&& src) : + m_token{ std::move(src.m_token) }, + m_expiration{ src.m_expiration } +{ + token = m_token.empty() ? nullptr : m_token.data(); + expiration = m_expiration ? m_expiration.operator->() : nullptr; +} + +EntityToken& EntityToken::operator=(const EntityToken& src) +{ + m_token = src.m_token; + token = m_token.empty() ? nullptr : m_token.data(); + + m_expiration = src.m_expiration; + expiration = m_expiration ? m_expiration.operator->() : nullptr; + + return *this; +} + +EntityToken& EntityToken::operator=(EntityToken&& src) +{ + m_token = std::move(src.m_token); + token = m_token.empty() ? nullptr : m_token.data(); + + m_expiration = src.m_expiration; + expiration = m_expiration ? m_expiration.operator->() : nullptr; + + return *this; +} + +size_t EntityToken::RequiredBufferSize() const +{ + size_t requiredSize{ alignof(EntityToken) + sizeof(EntityToken) }; + if (token) + { + requiredSize += (std::strlen(token) + 1); + } + if (expiration) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + return requiredSize; +} + +Result EntityToken::Copy(ModelBuffer& buffer) const +{ + // Alloc + auto allocResult = buffer.Alloc(1); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + { + auto tokenCopyResult = buffer.CopyTo(this->token); + RETURN_IF_FAILED(tokenCopyResult.hr); + outputPtr->token = tokenCopyResult.ExtractPayload(); + } + { + outputPtr->expiration = this->expiration; + } + return outputPtr; +} + +} diff --git a/Source/PlayFabCore/Source/Common/EntityToken.h b/Source/PlayFabCore/Source/Common/EntityToken.h new file mode 100644 index 0000000..a6868ad --- /dev/null +++ b/Source/PlayFabCore/Source/Common/EntityToken.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include "Generated/AuthenticationTypes.h" + +namespace PlayFab +{ + +// EntityToken used to Authenticate with PlayFab endpoints +// Continuing to expose token expiration time even though we don't require titles to directly act on it +class EntityToken : public PFEntityToken, public ClientOutputModel +{ +public: + EntityToken(const Authentication::EntityTokenResponse& tokenResponse); + EntityToken(const Authentication::GetEntityTokenResponse& tokenResponse); + EntityToken(const EntityToken& src); + EntityToken(EntityToken&& src); + EntityToken& operator=(const EntityToken& src); + EntityToken& operator=(EntityToken&& src); + ~EntityToken() = default; + + // ClientOutputModel + size_t RequiredBufferSize() const; + Result Copy(ModelBuffer& buffer) const; + +private: + String m_token; + std::optional m_expiration; +}; + +} diff --git a/Source/PlayFabCore/Source/Common/GlobalState.cpp b/Source/PlayFabCore/Source/Common/GlobalState.cpp new file mode 100644 index 0000000..1e22047 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/GlobalState.cpp @@ -0,0 +1,312 @@ +#include "stdafx.h" +#include "GlobalState.h" +#include "Trace/TraceState.h" +#include + +using namespace PlayFab; + +namespace PlayFab +{ + +namespace Detail +{ + +// Choose arbitrary but recognizable values for handles +uintptr_t const kFirstServiceConfigHandle = 0x10000000; +uintptr_t const kFirstEventPipelineHandle = 0x30000000; +uintptr_t const kFirstEntityHandle = 0x40000000; + +} + +enum class AccessMode +{ + Initialize, + Get, + Cleanup +}; + +HRESULT AccessGlobalState(AccessMode mode, SharedPtr& state) +{ + struct GlobalStateHolder + { + SharedPtr const state; + }; + + static std::atomic s_globalStateHolder{ nullptr }; // intentional non-owning pointer + assert(s_globalStateHolder.is_lock_free()); + + try + { + + switch (mode) + { + case AccessMode::Initialize: + { + RETURN_HR_INVALIDARG_IF_NULL(state); + + UniquePtr stateHolder{ new (Allocator{}.allocate(1)) GlobalStateHolder{ state } }; + + GlobalStateHolder* expected{ nullptr }; + if (!s_globalStateHolder.compare_exchange_strong(expected, stateHolder.get())) + { + return E_PF_CORE_ALREADY_INITIALIZED; + } + + stateHolder.release(); // reclaimed via AccessMode::Cleanup + + return S_OK; + } + case AccessMode::Get: + { + GlobalStateHolder* stateHolder = s_globalStateHolder.load(); + + RETURN_HR_IF(E_PF_CORE_NOT_INITIALIZED, !stateHolder); + assert(stateHolder->state); + state = stateHolder->state; + + return S_OK; + } + case AccessMode::Cleanup: + { + UniquePtr stateHolder{ s_globalStateHolder.exchange(nullptr) }; + + RETURN_HR_IF(E_PF_CORE_NOT_INITIALIZED, !stateHolder); + state = stateHolder->state; + + return S_OK; + } + default: + { + assert(false); + return E_UNEXPECTED; + } + } + } + catch (...) + { + return CurrentExceptionToHR(); + } +} + + +GlobalState::GlobalState(XTaskQueueHandle backgroundQueue) noexcept : + m_runContext{ RunContext::Root(backgroundQueue) }, + m_serviceConfigs{ Detail::kFirstServiceConfigHandle }, + m_entities{ Detail::kFirstEntityHandle }, + m_clientEventPipelines{ Detail::kFirstEventPipelineHandle }, + m_httpRetrySettings{ MakeShared() } +{ + TRACE_VERBOSE("PlayFabCore::GlobalState::GlobalState"); + + m_httpRetrySettings->allowRetry = kDefaultHttpRetryAllowed; + m_httpRetrySettings->minimumRetryDelayInSeconds = kDefaultHttpRetryDelay; + m_httpRetrySettings->timeoutWindowInSeconds = kDefaultHttpTimeoutWindow; +} + +GlobalState::~GlobalState() noexcept +{ + TRACE_VERBOSE("PlayFabCore::GlobalState::~GlobalState"); +} + +HRESULT GlobalState::Create(XTaskQueueHandle backgroundQueue, HCInitArgs* args) noexcept +{ + // Set up tracing before doing anything else + // LocalStorage not needed anywhere else currently so create an instance just for TraceState. If + // it is needed elsewhere, there should be a single shared instance hanging off of GlobalState + RETURN_IF_FAILED(TraceState::Create(RunContext::Root(backgroundQueue), LocalStorage())); + + RETURN_IF_FAILED(HCInitialize(args)); + + Allocator a{}; + SharedPtr state = SharedPtr{ new (a.allocate(1)) GlobalState{ backgroundQueue }, Deleter(), a }; + return AccessGlobalState(AccessMode::Initialize, state); +} + +HRESULT GlobalState::Get(SharedPtr& state) noexcept +{ + return AccessGlobalState(AccessMode::Get, state); +} + +struct CleanupContext +{ + SharedPtr state; + XAsyncBlock lhcCleanupAsyncBlock{}; + XAsyncBlock traceStateCleanupAsyncBlock{}; + XAsyncBlock* clientAsyncBlock{}; +}; + +HRESULT GlobalState::CleanupAsync(XAsyncBlock* async) noexcept +{ + try + { + TRACE_VERBOSE("PlayFabCore::GlobalState::CleanupAsync"); + + UniquePtr context = MakeUnique(); + RETURN_IF_FAILED(XAsyncBegin(async, context.get(), __FUNCTION__, __FUNCTION__, CleanupAsyncProvider)); + context.release(); + return S_OK; + } + catch (...) + { + return CurrentExceptionToHR(); + } +} + +HRESULT CALLBACK GlobalState::CleanupAsyncProvider(XAsyncOp op, XAsyncProviderData const* data) +{ + CleanupContext* context{ static_cast(data->context) }; + + switch (op) + { + case XAsyncOp::Begin: + try + { + TRACE_VERBOSE("PlayFabCore::GlobalState::CleanupAsyncProvider::Begin"); + + RETURN_IF_FAILED(AccessGlobalState(AccessMode::Cleanup, context->state)); + context->clientAsyncBlock = data->async; + + context->state->m_runContext.Terminate(*context->state, context); + return S_OK; + } + catch (...) + { + return CurrentExceptionToHR(); + } + default: + { + return S_OK; + } + } +} + +void CALLBACK TraceStateCleanupComplete(XAsyncBlock* async) +{ + // This is the last step of cleanup, so reclaim the context + UniquePtr context{ static_cast(async->context) }; + XAsyncBlock* asyncBlock{ context->clientAsyncBlock }; // Keep copy of asyncBlock pointer to complete after cleaning up context + + HRESULT hr = XAsyncGetStatus(async, true); + + // Free CleanupContext + context.reset(); + + // GlobalState::Cleanup complete! + XAsyncComplete(asyncBlock, hr, 0); +} + +void CALLBACK HCCleanupComplete(XAsyncBlock* async) +{ + TRACE_VERBOSE(__FUNCTION__); + + UniquePtr context{ static_cast(async->context) }; + XAsyncBlock* asyncBlock{ context->clientAsyncBlock }; // Keep copy of asyncBlock pointer to complete after cleaning up context + + HRESULT hr = XAsyncGetStatus(async, true); + if (hr == E_HC_INTERNAL_STILLINUSE) + { + // If something else is still referencing libHttpClient we don't care + hr = S_OK; + } + + if (FAILED(hr)) + { + TRACE_ERROR_HR(hr, "HCCleanupAsync Failed unexpectedly!"); + + // Free CleanupContext + context.reset(); + + // Complete GlobalState::Cleanup with failure + XAsyncComplete(asyncBlock, hr, 0); + + return; + } + + context->traceStateCleanupAsyncBlock.callback = TraceStateCleanupComplete; + context->traceStateCleanupAsyncBlock.queue = context->clientAsyncBlock->queue; // Should use derived queue + context->traceStateCleanupAsyncBlock.context = context.get(); + + hr = TraceState::CleanupAsync(&context->traceStateCleanupAsyncBlock); + if (FAILED(hr)) + { + assert(false); + + // Free CleanupContext + context.reset(); + + // Complete GlobalState::Cleanup with failure + XAsyncComplete(asyncBlock, hr, 0); + + return; + } + + context.release(); +} + +void GlobalState::OnTerminated(void* c) noexcept +{ + TRACE_VERBOSE(__FUNCTION__); + + UniquePtr context{ static_cast(c) }; + XAsyncBlock* asyncBlock{ context->clientAsyncBlock }; // Keep copy of asyncBlock pointer to complete after cleaning up context + + // Free GlobalState before calling HCCleanup - 'this' will be destroyed here + context->state.reset(); + + context->lhcCleanupAsyncBlock.callback = HCCleanupComplete; + context->lhcCleanupAsyncBlock.queue = context->clientAsyncBlock->queue; // Should use derived queue + context->lhcCleanupAsyncBlock.context = context.get(); + + HRESULT hr = HCCleanupAsync(&context->lhcCleanupAsyncBlock); + if (FAILED(hr)) + { + assert(false); + + // Free CleanupContext + context.reset(); + + // Complete GlobalState::Cleanup with failure + XAsyncComplete(asyncBlock, hr, 0); + + return; + } + + context.release(); +} + +RunContext GlobalState::RunContext() const noexcept +{ + return m_runContext; +} + +ServiceConfigHandleTable& GlobalState::ServiceConfigs() noexcept +{ + return m_serviceConfigs; +} + +EntityHandleTable& GlobalState::Entities() noexcept +{ + return m_entities; +} + +EventPipelineHandleTable& GlobalState::ClientEventPipelines() noexcept +{ + return m_clientEventPipelines; +} + +TokenExpiredHandler GlobalState::TokenExpiredHandler() const noexcept +{ + return m_tokenExpiredHandler; +} + +TokenRefreshedHandler GlobalState::TokenRefreshedHandler() const noexcept +{ + return m_tokenRefreshedHandler; +} + +SharedPtr GlobalState::HttpRetrySettings() const noexcept +{ + return m_httpRetrySettings; +} + +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Common/GlobalState.h b/Source/PlayFabCore/Source/Common/GlobalState.h new file mode 100644 index 0000000..ef224a0 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/GlobalState.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include +#include "ServiceConfig.h" +#include "EventPipeline/EventPipeline.h" +#include "HandleTable.h" +#include "TokenExpiredHandler.h" +#include "TokenRefreshedHandler.h" + +namespace PlayFab +{ + +using ServiceConfigHandleTable = HandleTable; +using EntityHandleTable = HandleTable; +using EventPipelineHandleTable = HandleTable; + +// GlobalState singleton +class GlobalState : public ITerminationListener +{ +public: + ~GlobalState() noexcept; + + static HRESULT Create(XTaskQueueHandle backgroundQueue, HCInitArgs* args) noexcept; + static HRESULT Get(SharedPtr& state) noexcept; + static HRESULT CleanupAsync(XAsyncBlock* async) noexcept; + + RunContext RunContext() const noexcept; + ServiceConfigHandleTable& ServiceConfigs() noexcept; + EntityHandleTable& Entities() noexcept; + EventPipelineHandleTable& ClientEventPipelines() noexcept; + TokenExpiredHandler TokenExpiredHandler() const noexcept; + TokenRefreshedHandler TokenRefreshedHandler() const noexcept; + SharedPtr HttpRetrySettings() const noexcept; + +private: + GlobalState(XTaskQueueHandle backgroundQueue) noexcept; + + void OnTerminated(void* context) noexcept override; + static HRESULT CALLBACK CleanupAsyncProvider(XAsyncOp op, XAsyncProviderData const* data); + + PlayFab::RunContext m_runContext; + ServiceConfigHandleTable m_serviceConfigs; + EntityHandleTable m_entities; + EventPipelineHandleTable m_clientEventPipelines; + PlayFab::TokenExpiredHandler m_tokenExpiredHandler; + PlayFab::TokenRefreshedHandler m_tokenRefreshedHandler; + SharedPtr m_httpRetrySettings; + + friend struct GlobalStateBootstrapper; +}; + +} diff --git a/Source/PlayFabCore/Source/Common/HandleTable.h b/Source/PlayFabCore/Source/Common/HandleTable.h new file mode 100644 index 0000000..10b6be3 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/HandleTable.h @@ -0,0 +1,91 @@ +namespace PlayFab +{ + +// Simple handle table used to track and map open client handles +template +class HandleTable +{ +public: + static_assert(std::is_pointer_v, "HandleT must be a pointer type"); + + HandleTable(uintptr_t firstHandleValue); + HandleTable(HandleTable const&) = delete; + HandleTable(HandleTable&&) = delete; + HandleTable& operator=(HandleTable const&) = delete; + HandleTable& operator=(HandleTable&&) = delete; + ~HandleTable(); + + HRESULT MakeHandle(SharedPtr object, HandleT& handle); + HRESULT FromHandle(HandleT handle, SharedPtr& object) const; + void CloseHandle(HandleT handle); + +private: + mutable std::mutex m_mutex; + Map> m_handles; + uintptr_t m_nextHandle; +}; + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +template +HandleTable::HandleTable(uintptr_t firstHandleValue) : + m_nextHandle{ firstHandleValue } +{ +} + +template +HandleTable::~HandleTable() +{ + if (!m_handles.empty()) + { + TRACE_WARNING("Warning: Unclosed handles remain during cleanup (%s)", typeid(HandleT).name()); + } +} + +template +HRESULT HandleTable::MakeHandle(SharedPtr object, HandleT& handle) +{ + std::unique_lock lock{ m_mutex }; + RETURN_HR_IF(E_INVALIDARG, !object); + + handle = (HandleT)m_nextHandle++; + m_handles.emplace(handle, std::move(object)); + + return S_OK; +} + +template +HRESULT HandleTable::FromHandle(HandleT handle, SharedPtr& object) const +{ + std::unique_lock lock{ m_mutex }; + auto it = m_handles.find(handle); + if (it == m_handles.end()) + { + TRACE_ERROR("%s: Attempted to access invalid handle %llu", __FUNCTION__, handle); + return E_PF_INVALIDHANDLE; + } + + assert(it->second); + object = it->second; + + return S_OK; +} + +template +void HandleTable::CloseHandle(HandleT handle) +{ + std::unique_lock lock{ m_mutex }; + + auto it = m_handles.find(handle); + if (it == m_handles.end()) + { + TRACE_WARNING("%s: Attempted to close invalid handle %llu", __FUNCTION__, handle); + return; + } + + m_handles.erase(it); +} + +} diff --git a/Source/PlayFabCore/Source/Common/HttpClient.cpp b/Source/PlayFabCore/Source/Common/HttpClient.cpp new file mode 100644 index 0000000..ef917f7 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/HttpClient.cpp @@ -0,0 +1,116 @@ +#include "stdafx.h" +#include "HttpClient.h" +#include "Entity.h" +#include "SdkVersion.h" +#include "JsonUtils.h" + +namespace PlayFab +{ + +HttpClient::HttpClient(String&& apiEndpoint, SharedPtr retrySettings) : + m_apiEndpoint{ std::move(apiEndpoint) }, + m_retrySettings{ std::move(retrySettings) } +{ +} + +String HttpClient::GetUrl(const char* path) const +{ + Stringstream fullUrl; + fullUrl << m_apiEndpoint; + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return fullUrl.str(); +} + +AsyncOp HttpClient::MakePostRequest( + const char* path, + UnorderedMap headers, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext +) const +{ + auto httpCallOp = MakeUnique( + kPostMethod, + GetUrl(path), + std::move(headers), + JsonUtils::WriteToString(requestBody), + static_cast(retryCacheId), + *m_retrySettings, + std::move(runContext) + ); + + return RunOperation(std::move(httpCallOp)); +} + +AsyncOp HttpClient::MakeEntityRequest( + SharedPtr entity, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext +) const +{ + auto entityTokenResult = entity->GetEntityToken(); + RETURN_IF_FAILED(entityTokenResult.hr); + + UnorderedMap headers{}; + headers[kEntityTokenHeaderName] = entityTokenResult.Payload().token; + + return MakePostRequest(path, std::move(headers), requestBody, retryCacheId, std::move(runContext)); +} + +AsyncOp HttpClient::MakeSecretKeyRequest( + SharedPtr serviceConfig, + String const& secretKey, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext +) const +{ + UnorderedMap headers{}; + headers[kSecretKeyHeaderName] = secretKey; + + return MakePostRequest(path, std::move(headers), requestBody, retryCacheId, std::move(runContext)); +} + +AsyncOp HttpClient::MakeSecretKeyRequest( + SharedPtr entity, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheID, + RunContext&& runContext +) const +{ + auto secretKeyResult = entity->GetSecretKey(); + RETURN_IF_FAILED(secretKeyResult.hr); + + return MakeSecretKeyRequest(entity->ServiceConfig(), secretKeyResult.Payload(), path, requestBody, retryCacheID, std::move(runContext)); +} + +AsyncOp HttpClient::MakeTelemetryKeyRequest( + String const& telemetryKey, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext +) const +{ + UnorderedMap headers{}; + headers[kTelemetryKeyHeaderName] = telemetryKey; + + return MakePostRequest(path, std::move(headers), requestBody, retryCacheId, std::move(runContext)); +} + +String const& HttpClient::APIEndpoint() const noexcept +{ + return m_apiEndpoint; +} + +} diff --git a/Source/PlayFabCore/Source/Common/HttpClient.h b/Source/PlayFabCore/Source/Common/HttpClient.h new file mode 100644 index 0000000..8714b13 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/HttpClient.h @@ -0,0 +1,72 @@ +#pragma once + +#include +#include +#include +#include +#include "Generated/CacheId.h" + +namespace PlayFab +{ +class Entity; +class ServiceConfig; + +// An Http client for make PlayFab service requests +class HttpClient +{ +public: + HttpClient(String&& apiEndpoint, SharedPtr retrySettings); + HttpClient(const HttpClient&) = default; + ~HttpClient() = default; + + AsyncOp MakePostRequest( + const char* path, + UnorderedMap headers, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext + ) const; + + AsyncOp MakeEntityRequest( + SharedPtr entity, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext + ) const; + + AsyncOp MakeSecretKeyRequest( + SharedPtr serviceConfig, + String const& secretKey, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext + ) const; + + AsyncOp MakeSecretKeyRequest( + SharedPtr entity, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheID, + RunContext&& runContext + ) const; + + AsyncOp MakeTelemetryKeyRequest( + String const& telemetryKey, + const char* path, + const JsonValue& requestBody, + CacheId retryCacheId, + RunContext&& runContext + ) const; + + String const& APIEndpoint() const noexcept; + +private: + String GetUrl(const char* path) const; + + String const m_apiEndpoint; + SharedPtr const m_retrySettings; +}; + +} diff --git a/Source/PlayFabCore/Source/Common/ServiceConfig.cpp b/Source/PlayFabCore/Source/Common/ServiceConfig.cpp new file mode 100644 index 0000000..28210de --- /dev/null +++ b/Source/PlayFabCore/Source/Common/ServiceConfig.cpp @@ -0,0 +1,28 @@ +#include "stdafx.h" +#include "ServiceConfig.h" + +namespace PlayFab +{ + +ServiceConfig::ServiceConfig(String&& apiEndpoint, String&& titleId, SharedPtr retrySettings) + : m_httpClient{ MakeShared(std::move(apiEndpoint), std::move(retrySettings)) }, + m_titleId{ std::move(titleId) } +{ +} + +SharedPtr ServiceConfig::HttpClient() const noexcept +{ + return m_httpClient; +} + +String const& ServiceConfig::APIEndpoint() const noexcept +{ + return m_httpClient->APIEndpoint(); +} + +String const& ServiceConfig::TitleId() const noexcept +{ + return m_titleId; +} + +} diff --git a/Source/PlayFabCore/Source/Common/ServiceConfig.h b/Source/PlayFabCore/Source/Common/ServiceConfig.h new file mode 100644 index 0000000..e75aef7 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/ServiceConfig.h @@ -0,0 +1,24 @@ +// Configuration of a PlayFab Service connection + +#pragma once + +#include "HttpClient.h" + +namespace PlayFab +{ + +class ServiceConfig +{ +public: + ServiceConfig(String&& apiEndpoint, String&& titleId, SharedPtr httpRetrySettings); + + SharedPtr HttpClient() const noexcept; + String const& APIEndpoint() const noexcept; + String const& TitleId() const noexcept; + +private: + SharedPtr m_httpClient; + String const m_titleId; +}; + +} diff --git a/Source/PlayFabCore/Source/Common/TokenExpiredHandler.cpp b/Source/PlayFabCore/Source/Common/TokenExpiredHandler.cpp new file mode 100644 index 0000000..0ca562a --- /dev/null +++ b/Source/PlayFabCore/Source/Common/TokenExpiredHandler.cpp @@ -0,0 +1,156 @@ +#include "stdafx.h" +#include "TokenExpiredHandler.h" + +namespace PlayFab +{ + +class ClientHandler +{ +public: + ClientHandler(RunContext&& rc, void* context, PFEntityTokenExpiredEventHandler* handler) noexcept; + + RunContext RunContext() const noexcept; + void Invoke(EntityKey const& entityKey) const noexcept; + +private: + PlayFab::RunContext m_rc; + void* const m_context; + PFEntityTokenExpiredEventHandler* const m_handler; +}; + +class TokenExpiredHandler::SharedState +{ +public: + SharedState() noexcept; + SharedState(SharedState const&) = delete; + SharedState(SharedState&&) = delete; + SharedState& operator=(SharedState const&) = delete; + SharedState& operator=(SharedState&&) = delete; + ~SharedState() noexcept = default; + + HRESULT RegisterClientHandler( + RunContext&& rc, + void* context, + PFEntityTokenExpiredEventHandler* handler, + PFRegistrationToken* token + ) noexcept; + + void UnregisterClientHandler(PFRegistrationToken token) noexcept; + + void Invoke(EntityKey const& entityKey) const noexcept; + +private: + mutable std::recursive_mutex m_mutex; // recursive for unregister + + Map> m_clientHandlers; + PFRegistrationToken m_nextToken; +}; + +ClientHandler::ClientHandler(PlayFab::RunContext&& rc, void* context, PFEntityTokenExpiredEventHandler* handler) noexcept : + m_rc{ std::move(rc) }, + m_context{ context }, + m_handler{ handler } +{ +} + +RunContext ClientHandler::RunContext() const noexcept +{ + return m_rc; +} + +void ClientHandler::Invoke(EntityKey const& entityKey) const noexcept +{ + try + { + m_handler(m_context, &entityKey.Model()); + } + catch (...) + { + TRACE_ERROR("Caught unhandled exception in client TokenExpired handler"); + } +} + +namespace Detail +{ +// Arbitrary first token thats recognizable when debugging +PFRegistrationToken const kFirstCallbackToken = 0xBAC0000000000000; +} + + +TokenExpiredHandler::SharedState::SharedState() noexcept : + m_nextToken{ Detail::kFirstCallbackToken } +{ +} + +HRESULT TokenExpiredHandler::SharedState::RegisterClientHandler(RunContext&& rc, void* context, PFEntityTokenExpiredEventHandler* handler, PFRegistrationToken* token) noexcept +{ + std::unique_lock lock{ m_mutex }; + + RETURN_HR_INVALIDARG_IF_NULL(handler); + RETURN_HR_INVALIDARG_IF_NULL(token); + + *token = m_nextToken++; + m_clientHandlers.emplace(*token, MakeShared(std::move(rc), context, handler)); + + return S_OK; +} + +void TokenExpiredHandler::SharedState::UnregisterClientHandler(PFRegistrationToken token) noexcept +{ + std::unique_lock lock{ m_mutex }; + + TRACE_VERBOSE(__FUNCTION__); + + auto it = m_clientHandlers.find(token); + if (it == m_clientHandlers.end()) + { + TRACE_WARNING("%s: Attempted to unregister handler with unrecognized token", __FUNCTION__); + return; + } + + it->second->RunContext().CancellationToken().Cancel(); + + m_clientHandlers.erase(it); +} + +void TokenExpiredHandler::SharedState::Invoke(EntityKey const& entityKey) const noexcept +{ + std::unique_lock lock{ m_mutex }; + for (auto& pair : m_clientHandlers) + { + // TokenExpiredHandler handles submitting the work to the TaskQueue so that it can synchronize the event handler invocation + // and unregistration of the handler + + auto handler = pair.second; + handler->RunContext().TaskQueueSubmitWork([this, handler, key = EntityKey{ entityKey } ]() + { + std::unique_lock lock{ m_mutex }; // lock to avoid races with unregistering the handler + if (!handler->RunContext().CancellationToken().IsCancelled()) + { + handler->Invoke(key); + } + }); + } +} + +TokenExpiredHandler::TokenExpiredHandler() noexcept : + m_state{ MakeShared() } +{ +} + +HRESULT TokenExpiredHandler::RegisterClientHandler(RunContext&& rc, void* context, PFEntityTokenExpiredEventHandler* handler, PFRegistrationToken* token) noexcept +{ + return m_state->RegisterClientHandler(std::move(rc), context, handler, token); +} + +void TokenExpiredHandler::UnregisterClientHandler(PFRegistrationToken token) noexcept +{ + m_state->UnregisterClientHandler(token); +} + +void TokenExpiredHandler::Invoke(EntityKey entityKey) const noexcept +{ + m_state->Invoke(std::move(entityKey)); +} + +} diff --git a/Source/PlayFabCore/Source/Common/TokenExpiredHandler.h b/Source/PlayFabCore/Source/Common/TokenExpiredHandler.h new file mode 100644 index 0000000..9431e86 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/TokenExpiredHandler.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +namespace PlayFab +{ + +class TokenExpiredHandler +{ +public: + TokenExpiredHandler() noexcept; + TokenExpiredHandler(TokenExpiredHandler const&) noexcept = default; + TokenExpiredHandler(TokenExpiredHandler&&) noexcept = default; + TokenExpiredHandler& operator=(TokenExpiredHandler const&) noexcept = default; + TokenExpiredHandler& operator=(TokenExpiredHandler&&) noexcept = default; + ~TokenExpiredHandler() = default; + + HRESULT RegisterClientHandler( + RunContext&& rc, + void* context, + PFEntityTokenExpiredEventHandler* handler, + PFRegistrationToken* token + ) noexcept; + + void UnregisterClientHandler(PFRegistrationToken token) noexcept; + + void Invoke(EntityKey entityKey) const noexcept; + +private: + class SharedState; + + SharedPtr m_state; +}; + +} diff --git a/Source/PlayFabCore/Source/Common/TokenRefreshedHandler.cpp b/Source/PlayFabCore/Source/Common/TokenRefreshedHandler.cpp new file mode 100644 index 0000000..d025361 --- /dev/null +++ b/Source/PlayFabCore/Source/Common/TokenRefreshedHandler.cpp @@ -0,0 +1,157 @@ +#include "stdafx.h" +#include "TokenRefreshedHandler.h" + +namespace PlayFab +{ + +class TokenRefreshedClientHandler +{ +public: + TokenRefreshedClientHandler(RunContext&& rc, void* context, PFEntityTokenRefreshedEventHandler* handler) noexcept; + + RunContext RunContext() const noexcept; + void Invoke(EntityKey const& entityKey, EntityToken const& newToken) const noexcept; + +private: + PlayFab::RunContext m_rc; + void* const m_context; + PFEntityTokenRefreshedEventHandler* const m_handler; +}; + +class TokenRefreshedHandler::SharedState +{ +public: + SharedState() noexcept; + SharedState(SharedState const&) = delete; + SharedState(SharedState&&) = delete; + SharedState& operator=(SharedState const&) = delete; + SharedState& operator=(SharedState&&) = delete; + ~SharedState() noexcept = default; + + HRESULT RegisterClientHandler( + RunContext&& rc, + void* context, + PFEntityTokenRefreshedEventHandler* handler, + PFRegistrationToken* token + ) noexcept; + + void UnregisterClientHandler(PFRegistrationToken token) noexcept; + + void Invoke(EntityKey const& entityKey, EntityToken const& newToken) const noexcept; + +private: + mutable std::recursive_mutex m_mutex; // recursive for unregister + + Map> m_clientHandlers; + PFRegistrationToken m_nextToken; +}; + +TokenRefreshedClientHandler::TokenRefreshedClientHandler(PlayFab::RunContext&& rc, void* context, PFEntityTokenRefreshedEventHandler* handler) noexcept : + m_rc{ std::move(rc) }, + m_context{ context }, + m_handler{ handler } +{ +} + +RunContext TokenRefreshedClientHandler::RunContext() const noexcept +{ + return m_rc; +} + +void TokenRefreshedClientHandler::Invoke(EntityKey const& entityKey, EntityToken const& newToken) const noexcept +{ + try + { + m_handler(m_context, &entityKey.Model(), &newToken); + } + catch (...) + { + TRACE_ERROR("Caught unhandled exception in client TokenRefreshed handler"); + } +} + +namespace Detail +{ + // Arbitrary first token thats recognizable when debugging + PFRegistrationToken const kFirstCallbackToken = 0xBAC0000000000000; +} + + +TokenRefreshedHandler::SharedState::SharedState() noexcept : + m_nextToken{ Detail::kFirstCallbackToken } +{ +} + +HRESULT TokenRefreshedHandler::SharedState::RegisterClientHandler(RunContext&& rc, void* context, PFEntityTokenRefreshedEventHandler* handler, PFRegistrationToken* token) noexcept +{ + std::unique_lock lock{ m_mutex }; + + RETURN_HR_INVALIDARG_IF_NULL(handler); + RETURN_HR_INVALIDARG_IF_NULL(token); + + *token = m_nextToken++; + m_clientHandlers.emplace(*token, MakeShared(std::move(rc), context, handler)); + + return S_OK; +} + +void TokenRefreshedHandler::SharedState::UnregisterClientHandler(PFRegistrationToken token) noexcept +{ + std::unique_lock lock{ m_mutex }; + + TRACE_VERBOSE(__FUNCTION__); + + auto it = m_clientHandlers.find(token); + if (it == m_clientHandlers.end()) + { + TRACE_WARNING("%s: Attempted to unregister handler with unrecognized token", __FUNCTION__); + return; + } + + it->second->RunContext().CancellationToken().Cancel(); + + m_clientHandlers.erase(it); +} + +void TokenRefreshedHandler::SharedState::Invoke(EntityKey const& entityKey, EntityToken const& newToken) const noexcept +{ + std::unique_lock lock{ m_mutex }; + for (auto& pair : m_clientHandlers) + { + // TokenRefreshedHandler handles submitting the work to the TaskQueue so that it can synchronize the event handler invocation + // and unregistration of the handler + + auto handler = pair.second; + handler->RunContext().TaskQueueSubmitWork([this, handler, key = EntityKey{ entityKey }, token = EntityToken{ newToken }]() + { + std::unique_lock lock{ m_mutex }; // lock to avoid races with unregistering the handler + + if (!handler->RunContext().CancellationToken().IsCancelled()) + { + handler->Invoke(key, token); + } + }); + } +} + +TokenRefreshedHandler::TokenRefreshedHandler() noexcept : + m_state{ MakeShared() } +{ +} + +HRESULT TokenRefreshedHandler::RegisterClientHandler(RunContext&& rc, void* context, PFEntityTokenRefreshedEventHandler* handler, PFRegistrationToken* token) noexcept +{ + return m_state->RegisterClientHandler(std::move(rc), context, handler, token); +} + +void TokenRefreshedHandler::UnregisterClientHandler(PFRegistrationToken token) noexcept +{ + m_state->UnregisterClientHandler(token); +} + +void TokenRefreshedHandler::Invoke(EntityKey const& entityKey, EntityToken const& newToken) const noexcept +{ + m_state->Invoke(entityKey, newToken); +} + +} diff --git a/Source/PlayFabCore/Source/Common/TokenRefreshedHandler.h b/Source/PlayFabCore/Source/Common/TokenRefreshedHandler.h new file mode 100644 index 0000000..6bba4af --- /dev/null +++ b/Source/PlayFabCore/Source/Common/TokenRefreshedHandler.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include "EntityToken.h" + +namespace PlayFab +{ + +class TokenRefreshedHandler +{ +public: + TokenRefreshedHandler() noexcept; + TokenRefreshedHandler(TokenRefreshedHandler const&) noexcept = default; + TokenRefreshedHandler(TokenRefreshedHandler&&) noexcept = default; + TokenRefreshedHandler& operator=(TokenRefreshedHandler const&) noexcept = default; + TokenRefreshedHandler& operator=(TokenRefreshedHandler&&) noexcept = default; + ~TokenRefreshedHandler() = default; + + HRESULT RegisterClientHandler( + RunContext&& rc, + void* context, + PFEntityTokenRefreshedEventHandler* handler, + PFRegistrationToken* token + ) noexcept; + + void UnregisterClientHandler(PFRegistrationToken token) noexcept; + + void Invoke(EntityKey const& entityKey, EntityToken const& newToken) const noexcept; + +private: + class SharedState; + + SharedPtr m_state; +}; + +} diff --git a/Source/PlayFabCore/Source/EventPipeline/EventPipeline.cpp b/Source/PlayFabCore/Source/EventPipeline/EventPipeline.cpp new file mode 100644 index 0000000..3a28894 --- /dev/null +++ b/Source/PlayFabCore/Source/EventPipeline/EventPipeline.cpp @@ -0,0 +1,651 @@ +#include "stdafx.h" +#include "EventPipeline.h" +#include "Generated/Events.h" +#include "JsonUtils.h" + +namespace PlayFab +{ + +class WriteEventsResponse : protected ServiceResponse +{ +public: + WriteEventsResponse(ServiceResponse&& serviceResponse); + + HRESULT TranslatedHResult() { return m_translatedHResult; } + + PlayFab::Events::WriteEventsResponse const& ResultModel() { return m_resultModel; }; + + Vector FailedEventIndexes() { return m_failedEventIndexes; } + + ServiceErrorCode ServiceErrorCode() { return ServiceResponse::ErrorCode; } + + String ErrorMessage() { return ServiceResponse::ErrorMessage; } + + int HttpCode() { return ServiceResponse::HttpCode ; } + +private: + HRESULT m_translatedHResult; + PlayFab::Events::WriteEventsResponse m_resultModel; + Vector m_failedEventIndexes; +}; + +WriteEventsResponse::WriteEventsResponse(ServiceResponse&& serviceResponse) : + ServiceResponse{ serviceResponse } +{ + int httpCode = ServiceResponse::HttpCode; + + if (httpCode >= 200 && httpCode < 300) + { + m_resultModel.FromJson(serviceResponse.Data); + } + else + { + m_translatedHResult = ServiceErrorToHR(ServiceResponse::ErrorCode); + + if (httpCode >= 400 && httpCode < 500) + { + if (ServiceResponse::ErrorCode == ServiceErrorCode::InvalidParams) + { + PlayFab::Vector failedEventIndexes{}; + + for (rapidjson::Value::ConstMemberIterator iter = ServiceResponse::ErrorDetails.MemberBegin(); iter != ServiceResponse::ErrorDetails.MemberEnd(); ++iter) + { + char* errorDetail = const_cast(iter->name.GetString()); + const char* prefix = "Events["; + + if (strncmp(prefix, errorDetail, strlen(prefix)) == 0) + { + char* nextToken; + char* eventIndex = StrTok(errorDetail, "]", &nextToken); + eventIndex = StrTok(errorDetail, "[", &nextToken); + eventIndex = StrTok(NULL, " ", &nextToken); + + int index = std::atoi(eventIndex); + failedEventIndexes.push_back(index); + } + } + + m_failedEventIndexes = failedEventIndexes; + } + } + } +}; + +// Simple, thread-safe EventBuffer based on std::queue. +// Potential for optimization here with either LHC's LocklessQueue or XPlatCpp CELL-adapted EventBuffer +class EventBuffer +{ +public: + EventBuffer() = default; + EventBuffer(EventBuffer const&) = delete; + EventBuffer& operator=(EventBuffer const&) = delete; + ~EventBuffer() = default; + + HRESULT Push(Event&& event) noexcept; + HRESULT Push(Vector&& events) noexcept; + bool PopFront(Event& eventContents) noexcept; + +private: + std::mutex m_mutex; + Queue m_queue; +}; + +class EventUploader : public ITaskQueueWork, public std::enable_shared_from_this +{ +public: + EventUploader( + RunContext rc, + SharedPtr uploadingEntity, + PFEventPipelineType eventPipelineType, + SharedPtr buffer, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + EventPipelineEventHandlers eventHandlers + ); + + EventUploader( + RunContext rc, + SharedPtr serviceConfig, + const char* telemetryKey, + PFEventPipelineType eventPipelineType, + SharedPtr buffer, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + EventPipelineEventHandlers eventHandlers + ); + + void Start(); + void Stop(); + void SetUploadingEntity(SharedPtr entity); + void SetConfiguration(PFEventPipelineConfig eventPipelineConfig); + PFEventPipelineType EventPipelineType() { return m_eventPipelineType; } + PlayFab::String TelemetryKey() { return m_telemetryKey; } + SharedPtr ServiceConfig() { return m_serviceConfig; } + +private: + // ITaskQueueWork + void Run() noexcept override; + + AsyncOp WriteEvents(const Vector& events, RunContext rc); + Wrappers::ModelVector, Allocator> ConvertEvents(Vector payload); + void ProcessResponse(Result result, Vector payload, EventPipelineEventHandlers eventHandlers, bool isRetry); + void ExecutePendingRetries(); + JsonValue BuildRequestBody(Vector payload); + + RunContext m_rc; + SharedPtr m_entity; + SharedPtr m_serviceConfig; + PlayFab::String m_telemetryKey; + PFEventPipelineType m_eventPipelineType; + SharedPtr m_buffer; + uint32_t m_maxEventsPerBatch; + uint32_t m_maxWaitTimeInSeconds; + uint32_t m_pollDelayInMs; + EventPipelineEventHandlers const m_eventHandlers; + Vector m_pendingPayload; + SharedPtr>> m_retryPayloads; + time_t m_oldestEventTimeStamp; + bool m_telemetryKeyInvalid{ false }; + bool m_telemetryKeyDeactivated{ false }; + std::mutex m_mutex; + std::mutex m_configMutex; +}; + +void EventPipeline::Initialize( + RunContext rc, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext +) +{ + if (batchUploadedEventHandler) + { + m_batchUploadedHandlerToken.emplace(); + m_eventHandlers.RegisterBatchUploadSucceededHandler(rc.Derive(), handlerContext, batchUploadedEventHandler, &m_batchUploadedHandlerToken.value()); + } + if (batchFailedEventHandler) + { + m_batchFailedHandlerToken.emplace(); + m_eventHandlers.RegisterBatchUploadFailedHandler(rc.Derive(), handlerContext, batchFailedEventHandler, &m_batchFailedHandlerToken.value()); + } + + m_uploader->Start(); +} + +EventPipeline::EventPipeline( + RunContext rc, + SharedPtr uploadingEntity, + PFEventPipelineType eventPipelineType, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext +) noexcept : + m_buffer{ MakeShared() }, + m_uploader{ MakeShared(rc.Derive(), uploadingEntity, eventPipelineType, m_buffer, maxEventsPerBatch, maxWaitTimeInSeconds, pollDelayInMs, m_eventHandlers)} +{ + Initialize(rc, batchUploadedEventHandler, batchFailedEventHandler, handlerContext); +} + +EventPipeline::EventPipeline( + RunContext rc, + SharedPtr serviceConfig, + const char* telemetryKey, + PFEventPipelineType eventPipelineType, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext +) noexcept : + m_buffer{ MakeShared() }, + m_uploader{ MakeShared(rc.Derive(), serviceConfig, telemetryKey, eventPipelineType, m_buffer, maxEventsPerBatch, maxWaitTimeInSeconds, pollDelayInMs, m_eventHandlers) } +{ + Initialize(rc, batchUploadedEventHandler, batchFailedEventHandler, handlerContext); +} + +EventPipeline::~EventPipeline() +{ + if (m_batchUploadedHandlerToken.has_value()) + { + m_eventHandlers.UnregisterHandler(*m_batchUploadedHandlerToken); + } + if (m_batchFailedHandlerToken.has_value()) + { + m_eventHandlers.UnregisterHandler(*m_batchFailedHandlerToken); + } + + m_uploader->Stop(); +} + +// Should we do client side payload validation? +HRESULT EventPipeline::EmitEvent(Event&& event) noexcept +{ + return m_buffer->Push(std::move(event)); +} + +HRESULT EventPipeline::AddUploadingEntity(SharedPtr uploadingEntity) noexcept +{ + m_uploader->SetUploadingEntity(std::move(uploadingEntity)); + + return S_OK; +} + +HRESULT EventPipeline::RemoveUploadingEntity() noexcept +{ + // Telemetry Key is valid only for Telemetry Event Pipeline, does not make sense to remove entity for PlayStream Pipeline. + RETURN_HR_IF(E_FAIL, m_uploader->EventPipelineType() == PFEventPipelineType::PlayStream); + + // If there is no valid fallback auth mechanism (Telemetry Key) return error to the client. + RETURN_HR_IF(E_FAIL, !m_uploader->ServiceConfig() || m_uploader->TelemetryKey().empty() ); + + m_uploader->SetUploadingEntity(nullptr); + + return S_OK; +} + +HRESULT EventPipeline::UpdateConfiguration(PFEventPipelineConfig eventPipelineConfig) noexcept +{ + m_uploader->SetConfiguration(eventPipelineConfig); + + return S_OK; +} + +HRESULT EventBuffer::Push(Event&& event) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(event.Model().eventNamespace); + RETURN_HR_INVALIDARG_IF_NULL(event.Model().name); + RETURN_HR_INVALIDARG_IF_NULL(event.Model().payloadJson); + + // If the client didn't provide an eventId, use a default based on a counter. ID will not be unique accross multiple sessions and/or clients, + // but the service will assign a unique ID upon upload. + static std::atomic s_eventId{ 0 }; + + if (!event.Model().clientId || strlen(event.Model().clientId) == 0) + { + Stringstream eventIdStream; + eventIdStream << "PlayFabCoreSDK_Event" << ++s_eventId; + event.SetClientId(eventIdStream.str()); + } + + std::lock_guard lock{ m_mutex }; + m_queue.push(std::move(event)); + + return S_OK; +} + +HRESULT EventBuffer::Push(Vector&& events) noexcept +{ + for (size_t i = 0; i < events.size(); i++) + { + Push(std::move(events[i])); + } + + return S_OK; +} + +bool EventBuffer::PopFront(Event& event) noexcept +{ + std::lock_guard lock{ m_mutex }; + if (m_queue.empty()) + { + return false; + } + + std::swap(event, m_queue.front()); + m_queue.pop(); + return true; +} + +EventUploader::EventUploader( + RunContext rc, + SharedPtr uploadingEntity, + PFEventPipelineType eventPipelineType, + SharedPtr buffer, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + EventPipelineEventHandlers eventHandlers +) : + m_rc{ std::move(rc) }, + m_entity{ std::move(uploadingEntity) }, + m_eventPipelineType{ std::move(eventPipelineType) }, + m_buffer{ std::move(buffer) }, + m_maxEventsPerBatch{ maxEventsPerBatch }, + m_maxWaitTimeInSeconds{ maxWaitTimeInSeconds }, + m_pollDelayInMs{ pollDelayInMs }, + m_eventHandlers{ std::move(eventHandlers) }, + m_retryPayloads{ MakeShared>>() } +{ +} + +EventUploader::EventUploader( + RunContext rc, + SharedPtr serviceConfig, + const char* telemetryKey, + PFEventPipelineType eventPipelineType, + SharedPtr buffer, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + EventPipelineEventHandlers eventHandlers +) : + m_rc{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_telemetryKey{ telemetryKey }, + m_eventPipelineType{ std::move(eventPipelineType) }, + m_buffer{ std::move(buffer) }, + m_maxEventsPerBatch{ maxEventsPerBatch }, + m_maxWaitTimeInSeconds{ maxWaitTimeInSeconds }, + m_pollDelayInMs{ pollDelayInMs }, + m_eventHandlers{ std::move(eventHandlers) }, + m_retryPayloads{ MakeShared>>() } +{ +} + +void EventUploader::Start() +{ + m_rc.TaskQueueSubmitWork(shared_from_this(), 0); +} + +void EventUploader::Stop() +{ + std::unique_lock lock{ m_mutex }; + + // Cancel the uploader rather than terminating the queue. This allowed the next scheduled poll run as expected so that the remaining events + // get uploaded. + m_rc.CancellationToken().Cancel(); +} + +void EventUploader::SetUploadingEntity(SharedPtr entity) +{ + std::unique_lock lock{ m_configMutex }; + + m_entity = entity; +} + +void EventUploader::SetConfiguration(PFEventPipelineConfig eventPipelineConfig) +{ + std::unique_lock lock{ m_configMutex }; + + if (m_eventPipelineType == PFEventPipelineType::PlayStream) + { + m_maxEventsPerBatch = !eventPipelineConfig.maxEventsPerBatch ? PFPlayStreamEventPipelineMaxEventsPerBatchDefault : *eventPipelineConfig.maxEventsPerBatch; + m_maxWaitTimeInSeconds = !eventPipelineConfig.maxWaitTimeInSeconds ? PFPlayStreamEventPipelineMaxWaitTimeInSecondsDefault : *eventPipelineConfig.maxWaitTimeInSeconds; + m_pollDelayInMs = !eventPipelineConfig.pollDelayInMs ? PFPlayStreamEventPipelinePollDelayInMsDefault : *eventPipelineConfig.pollDelayInMs; + } + else + { + m_maxEventsPerBatch = !eventPipelineConfig.maxEventsPerBatch ? PFTelemetryEventPipelineMaxEventsPerBatchDefault : *eventPipelineConfig.maxEventsPerBatch; + m_maxWaitTimeInSeconds = !eventPipelineConfig.maxWaitTimeInSeconds ? PFTelemetryEventPipelineMaxWaitTimeInSecondsDefault : *eventPipelineConfig.maxWaitTimeInSeconds; + m_pollDelayInMs = !eventPipelineConfig.pollDelayInMs ? PFTelemetryEventPipelinePollDelayInMsDefault : *eventPipelineConfig.pollDelayInMs; + } +} + +JsonValue EventUploader::BuildRequestBody(Vector events) +{ + Events::WriteEventsRequest request; + Wrappers::ModelVector, Allocator> eventContents = ConvertEvents(events); + + request.SetEvents(eventContents); + JsonValue requestBody{ request.ToJson() }; + + return requestBody; +} + +AsyncOp EventUploader::WriteEvents( + const Vector& events, + RunContext rc +) +{ + std::unique_lock lock{ m_configMutex }; + JsonValue requestBody = BuildRequestBody(events); + + const char* path{ m_eventPipelineType == PFEventPipelineType::PlayStream ? "/Event/WriteEvents" : "/Event/WriteTelemetryEvents" }; + CacheId retryCacheId = m_eventPipelineType == PFEventPipelineType::PlayStream ? CacheId::EventsWriteEvents : CacheId::EventsWriteTelemetryEvents; + + if (m_entity) + { + auto requestOp = m_entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + m_entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + // Release lock after making entity request to avoid crashes if entity is removed. + lock.unlock(); + + return requestOp.Then([](Result result) -> Result + { + auto serviceResponse = result.ExtractPayload(); + return WriteEventsResponse{ std::move(serviceResponse) }; + } + ); + } + else if (!m_telemetryKey.empty() && (!m_telemetryKeyInvalid && !m_telemetryKeyDeactivated)) + { + auto requestOp = m_serviceConfig->HttpClient()->MakeTelemetryKeyRequest( + m_telemetryKey, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + auto serviceResponse = result.ExtractPayload(); + return WriteEventsResponse{ std::move(serviceResponse) }; + } + ); + } + else + { + // Simulating getting an error response back from the service and return events to failed event handler. + ServiceResponse response; + response.HttpCode = 403; + response.ErrorCode = m_telemetryKeyDeactivated ? ServiceErrorCode::TelemetryKeyDeactivated : ServiceErrorCode::TelemetryKeyInvalid; + + return AsyncOp{ WriteEventsResponse{ std::move(response) }}; + } +} + +void EventUploader::ProcessResponse(Result result, Vector payload, EventPipelineEventHandlers eventHandlers, bool isRetry) +{ + WriteEventsResponse response = result.ExtractPayload(); + + if (response.HttpCode() < 200 || response.HttpCode() >= 300) + { + if (response.HttpCode() >= 400 && response.HttpCode() < 500) // Client-side error + { + if (response.ServiceErrorCode() == ServiceErrorCode::TelemetryKeyInvalid || response.ServiceErrorCode() == ServiceErrorCode::TelemetryKeyDeactivated) + { + if (response.ServiceErrorCode() == ServiceErrorCode::TelemetryKeyInvalid) + { + if (!m_telemetryKeyInvalid) + { + m_telemetryKeyInvalid = true; + TRACE_ERROR("EventPipeline EventUploader failed, Telemetry Key is invalid (hr=0x%08x)", result.hr); + } + } + else + { + if (!m_telemetryKeyDeactivated) + { + m_telemetryKeyDeactivated = true; + TRACE_ERROR("EventPipeline EventUploader failed, Telemetry Key is deactivated (hr=0x%08x)", result.hr); + } + } + } + else if (response.ServiceErrorCode() == ServiceErrorCode::InvalidParams) // If Invalid Params, we can identify failed events, so strip out failed events from payload and do a retry with the remaining + { + if (!isRetry) + { + Vector failedEventIndexes = response.FailedEventIndexes(); + Vector failedEvents, retryEvents; + + for (size_t i = 0; i < payload.size(); i++) + { + if (std::find(failedEventIndexes.begin(), failedEventIndexes.end(), static_cast(i)) != failedEventIndexes.end()) + { + failedEvents.push_back(std::move(payload[i])); + } + else + { + retryEvents.push_back(std::move(payload[i])); + } + } + + if (!retryEvents.empty() && retryEvents.size() < payload.size()) + { + m_retryPayloads->push(std::move(retryEvents)); + } + + payload = std::move(failedEvents); + } + } + + const char* eventsApi = m_eventPipelineType == PFEventPipelineType::PlayStream ? "WriteEvents" : "WriteTelemetryEvents"; + TRACE_ERROR("EventPipeline EventUploader %s failed, invoking event handler. (hr=0x%08x)", eventsApi, result.hr); + + eventHandlers.InvokeBatchFailed(response.TranslatedHResult(), response.ErrorMessage(), FailedBatch{ std::move(payload) }); + } + else // Server-side error + { + if (isRetry) // If this is a retry, return the whole batch back to the failure handler + { + const char* eventsApi = m_eventPipelineType == PFEventPipelineType::PlayStream ? "WriteEvents" : "WriteTelemetryEvents"; + TRACE_ERROR("EventPipeline EventUploader %s failed, invoking event handler. (hr=0x%08x)", eventsApi, result.hr); + + eventHandlers.InvokeBatchFailed(response.TranslatedHResult(), response.ErrorMessage(), FailedBatch{ std::move(payload) }); + } + else // Insert into list of retry payloads + { + m_retryPayloads->push(std::move(payload)); + } + } + } + else if (response.ResultModel().Model().assignedEventIdsCount != payload.size()) + { + // The service only responds with service assignedEventIds and the mapping of clientIds to serviceIds is just based on the order of the ids in the request + // and response. We don't have a way to handle a case where the lists are different sizes, so we'll consider the entire batch failed. + + constexpr char s_mismatchedAssignedEventIdsError[]{ "EventPipeline EventUploader WriteEventsResponse contained mismatched number of AssignedEventIds." }; + + TRACE_ERROR("%s, invoking event handler", s_mismatchedAssignedEventIdsError); + eventHandlers.InvokeBatchFailed(E_FAIL, s_mismatchedAssignedEventIdsError, FailedBatch{ std::move(payload) }); + } + else + { + // WriteEvents Succeeded + auto& model = response.ResultModel().Model(); + Vector assignedEventIds{ model.assignedEventIds, model.assignedEventIds + model.assignedEventIdsCount }; + eventHandlers.InvokeBatchSucceeded(UploadedBatch{ std::move(payload), std::move(assignedEventIds) }); + } +} + +void EventUploader::ExecutePendingRetries() +{ + if (!m_retryPayloads->empty()) // Are there any payloads pending for retry? If so, proceed to do the retry + { + for (size_t i = 0; i < m_retryPayloads->size(); i++) + { + Vector payload = m_retryPayloads->front(); + + m_retryPayloads->pop(); + + WriteEvents(std::move(payload), m_rc.Derive()).Finally([payload, sharedThis = shared_from_this(), eventHandlers = m_eventHandlers ](Result result) mutable + { + sharedThis->ProcessResponse(std::move(result), std::move(payload), eventHandlers, true); + } + ); + } + } +} + +// Translate Event to Events::EventContents +Wrappers::ModelVector, Allocator> EventUploader::ConvertEvents(Vector payload) +{ + Wrappers::ModelVector, Allocator> events; + + for (auto& payloadEvent : payload) + { + Wrappers::PFEventsEventContentsWrapper eventModel; + eventModel.SetEntity(payloadEvent.Model().entity ? std::optional { *payloadEvent.Model().entity } : std::nullopt); + eventModel.SetEventNamespace(payloadEvent.Model().eventNamespace); + eventModel.SetName(payloadEvent.Model().name); + eventModel.SetOriginalId(payloadEvent.Model().clientId); + eventModel.SetOriginalTimestamp(payloadEvent.EmitTime()); + eventModel.SetPayloadJSON(payloadEvent.Model().payloadJson); + events.push_back(eventModel); + } + + return events; +} + +void EventUploader::Run() noexcept +{ + std::unique_lock lock{ m_mutex }; + + // Check if we've been cancelled. If so, drain the buffer and upload all remaining events, but don't schedule another poll. + bool cancelled = m_rc.CancellationToken().IsCancelled(); + + for (bool haveEvents = true; haveEvents; ) + { + ExecutePendingRetries(); + + Event event; + haveEvents = m_buffer->PopFront(event); + + if (haveEvents) + { + if (m_pendingPayload.empty()) + { + m_oldestEventTimeStamp = event.EmitTime(); + } + + m_pendingPayload.push_back(std::move(event)); + } + + std::unique_lock configLock{ m_configMutex }; + + // Upload the batch if: a) The oldest event in the batch has been pending for at least m_maxWaitTimeInSeconds, b) the batch size has reached + // m_maxEventsPerBatch, or c) the uploader has been cancelled and this was the last event in the buffer + if ((!m_pendingPayload.empty() && std::time(nullptr) - m_oldestEventTimeStamp >= m_maxWaitTimeInSeconds) || + (m_pendingPayload.size() >= m_maxEventsPerBatch) || + (!m_pendingPayload.empty() && cancelled && !haveEvents) + ) + { + configLock.unlock(); + + // Keep track of eventIds of the batch for use in callbacks + Vector payload{ std::move(m_pendingPayload) }; + assert(m_pendingPayload.empty()); + + WriteEvents(std::move(payload), m_rc.Derive()).Finally([payload, sharedThis = shared_from_this(), eventHandlers = m_eventHandlers](Result result) mutable + { + sharedThis->ProcessResponse(std::move(result), std::move(payload), eventHandlers, false); + } + ); + } + } + + // Release lock before scheduling next poll just in case Run() is synchronously re-entered (ie. with an immediate queue) + lock.unlock(); + + // Using a polling model to check EventBuffer again after we've emptied it. This is the same algorithm used by XPlatCpp Event Pipeline. + // Only schedule next poll if the EventUploader has not been cancelled. If it has been cancelled, 'this' may be destroyed here. + if (!cancelled) + { + m_rc.TaskQueueSubmitWork(shared_from_this(), m_pollDelayInMs); + } +} + +} diff --git a/Source/PlayFabCore/Source/EventPipeline/EventPipeline.h b/Source/PlayFabCore/Source/EventPipeline/EventPipeline.h new file mode 100644 index 0000000..176bcf3 --- /dev/null +++ b/Source/PlayFabCore/Source/EventPipeline/EventPipeline.h @@ -0,0 +1,61 @@ +#pragma once + +#include "Common/Entity.h" +#include "EventPipelineTypes.h" +#include + +namespace PlayFab +{ + +class EventPipeline +{ +public: + EventPipeline( + RunContext rc, + SharedPtr uploadingEntity, + PFEventPipelineType eventPipelineType, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext + ) noexcept; + + EventPipeline( + RunContext rc, + SharedPtr serviceConfig, + const char* telemetryKey, + PFEventPipelineType eventPipelineType, + uint32_t maxEventsPerBatch, + uint32_t maxWaitTimeInSeconds, + uint32_t pollDelayInMs, + PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, + PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, + void* handlerContext + ) noexcept; + + EventPipeline(EventPipeline const&) = delete; + EventPipeline& operator=(EventPipeline) = delete; + virtual ~EventPipeline(); + + HRESULT EmitEvent(Event&& event) noexcept; + + HRESULT AddUploadingEntity(SharedPtr uploadingEntity) noexcept; + + HRESULT RemoveUploadingEntity() noexcept; + + HRESULT UpdateConfiguration(PFEventPipelineConfig eventPipelineConfig) noexcept; + +private: + void Initialize(RunContext rc, PFEventPipelineBatchUploadSucceededEventHandler* batchUploadedEventHandler, PFEventPipelineBatchUploadFailedEventHandler* batchFailedEventHandler, void* handlerContext); + + EventPipelineEventHandlers m_eventHandlers; + std::optional m_batchUploadedHandlerToken; + std::optional m_batchFailedHandlerToken; + + SharedPtr m_buffer; + SharedPtr m_uploader; +}; + +} diff --git a/Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.cpp b/Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.cpp new file mode 100644 index 0000000..ca6f41d --- /dev/null +++ b/Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.cpp @@ -0,0 +1,384 @@ +#include "stdafx.h" +#include "EventPipelineTypes.h" + +namespace PlayFab +{ + +Event::Event(PFEvent const& src) : + Wrappers::ModelWrapper{ src }, + m_entity{ src.entity ? std::optional{*src.entity} : std::nullopt }, + m_eventNamespace{ SafeString(src.eventNamespace) }, + m_name{ SafeString(src.name) }, + m_clientId{ SafeString(src.clientId) }, + m_payloadJson{ SafeString(src.payloadJson) }, + m_emitTime{ time(nullptr) } +{ + SetModelPointers(); +} + +Event::Event(Event const& src) : Event{ src.Model() } +{ +} + +Event::Event(Event&& src) : Event{} +{ + swap(*this, src); +} + +Event& Event::operator=(Event src) +{ + swap(*this, src); + return *this; +} + +void swap(Event& lhs, Event& rhs) +{ + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eventNamespace, rhs.m_eventNamespace); + swap(lhs.m_name, rhs.m_name); + swap(lhs.m_clientId, rhs.m_clientId); + swap(lhs.m_payloadJson, rhs.m_payloadJson); + swap(lhs.m_emitTime, rhs.m_emitTime); + rhs.SetModelPointers(); + lhs.SetModelPointers(); +} + +time_t Event::EmitTime() const +{ + return m_emitTime; +} + +void Event::SetClientId(String&& clientId) +{ + m_clientId = std::move(clientId); + m_model.clientId = m_clientId.empty() ? nullptr : m_clientId.data(); +} + +void Event::SetModelPointers() +{ + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eventNamespace = m_eventNamespace.empty() ? nullptr : m_eventNamespace.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + this->m_model.clientId = m_clientId.empty() ? nullptr : m_clientId.data(); + this->m_model.payloadJson = m_payloadJson.empty() ? nullptr : m_payloadJson.data(); +} + +UploadedEvent::UploadedEvent(String&& clientId, String&& serviceId) + : m_clientId{ std::move(clientId) }, + m_serviceId{ std::move(serviceId) } +{ + SetModelPointers(); +} + +UploadedEvent::UploadedEvent(UploadedEvent const& src) : UploadedEvent{ src.Model().clientId, src.Model().serviceId } +{ +} + +UploadedEvent::UploadedEvent(UploadedEvent&& src) +{ + swap(*this, src); +} + +UploadedEvent& UploadedEvent::operator=(UploadedEvent src) +{ + swap(*this, src); + return *this; +} + +void swap(UploadedEvent& lhs, UploadedEvent& rhs) +{ + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_clientId, rhs.m_clientId); + swap(lhs.m_serviceId, rhs.m_serviceId); + rhs.SetModelPointers(); + lhs.SetModelPointers(); +} + +void UploadedEvent::SetModelPointers() +{ + this->m_model.clientId = m_clientId.empty() ? nullptr : m_clientId.data(); + this->m_model.serviceId = m_serviceId.empty() ? nullptr : m_serviceId.data(); +} + +UploadedBatch::UploadedBatch(Vector const& events, Vector&& serviceIds) +{ + assert(events.size() == serviceIds.size()); + + reserve(events.size()); + for (size_t i = 0; i < events.size(); ++i) + { + push_back(UploadedEvent{ events[i].Model().clientId, std::move(serviceIds[i])}); + } +} + +FailedBatch::FailedBatch(Vector&& events) +{ + reserve(events.size()); + std::for_each(events.begin(), events.end(), [this](Event& e) { push_back(e); }); +} + +// EventPipelineEventHandlers and its internal SharedState +class BatchUploadSucceededHandler +{ +public: + BatchUploadSucceededHandler(RunContext&& rc, void* handlerContext, PFEventPipelineBatchUploadSucceededEventHandler* clientHandler) noexcept; + + RunContext RunContext() const noexcept; + void Invoke(UploadedBatch const& batch) const noexcept; + +private: + PlayFab::RunContext m_rc; + void* const m_context; + PFEventPipelineBatchUploadSucceededEventHandler* const m_handler; +}; + +class BatchUploadFailedHandler +{ +public: + BatchUploadFailedHandler(RunContext&& rc, void* handlerContext, PFEventPipelineBatchUploadFailedEventHandler* clientHandler) noexcept; + + RunContext RunContext() const noexcept; + void Invoke(HRESULT translatedError, String const& errorMessage, FailedBatch const& batch) const noexcept; + +private: + PlayFab::RunContext m_rc; + void* const m_context; + PFEventPipelineBatchUploadFailedEventHandler* const m_handler; +}; + +class EventPipelineEventHandlers::SharedState : public std::enable_shared_from_this +{ +public: + SharedState() = default; + SharedState(SharedState const&) = delete; + SharedState(SharedState&&) = delete; + SharedState& operator=(SharedState const&) = delete; + SharedState& operator=(SharedState&&) = delete; + ~SharedState() noexcept = default; + + HRESULT RegisterBatchUploadSucceededHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadSucceededEventHandler* succeededHandler, + PFRegistrationToken* token + ) noexcept; + + HRESULT RegisterBatchUploadFailedHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadFailedEventHandler* failedHandler, + PFRegistrationToken* token + ) noexcept; + + void UnregisterHandler(PFRegistrationToken token) noexcept; + + void InvokeBatchSucceeded(UploadedBatch&& batch); + void InvokeBatchFailed(HRESULT translatedError, String&& errorMessage, FailedBatch&& batch); + +private: + mutable std::recursive_mutex m_mutex; // recursive to allow unregistering within callbacks + + Map> m_batchUploadedSucceededHandlers; + Map> m_batchUploadFailedHandlers; + + static PFRegistrationToken const s_firstToken{ 0xBAC1100000000000 }; + PFRegistrationToken m_nextToken{ s_firstToken }; +}; + +BatchUploadSucceededHandler::BatchUploadSucceededHandler(PlayFab::RunContext&& rc, void* handlerContext, PFEventPipelineBatchUploadSucceededEventHandler* clientHandler) noexcept : + m_rc{ std::move(rc) }, + m_context{ handlerContext }, + m_handler{ clientHandler } +{ +} + +RunContext BatchUploadSucceededHandler::RunContext() const noexcept +{ + return m_rc; +} + +void BatchUploadSucceededHandler::Invoke(UploadedBatch const& batch) const noexcept +{ + try + { + m_handler(m_context, batch.data(), batch.size()); + } + catch (...) + { + TRACE_WARNING("Caught unhandled exception in client PFEventPipelineBatchUploadSucceededEventHandler"); + } +} + +BatchUploadFailedHandler::BatchUploadFailedHandler(PlayFab::RunContext&& rc, void* handlerContext, PFEventPipelineBatchUploadFailedEventHandler* clientHandler) noexcept : + m_rc{ std::move(rc) }, + m_context{ handlerContext }, + m_handler{ clientHandler } +{ +} + +RunContext BatchUploadFailedHandler::RunContext() const noexcept +{ + return m_rc; +} + +void BatchUploadFailedHandler::Invoke(HRESULT translatedError, String const& errorMessage, FailedBatch const& batch) const noexcept +{ + try + { + m_handler(m_context, translatedError, errorMessage.data(), batch.data(), batch.size()); + } + catch (...) + { + TRACE_WARNING("Caught unhandled exception in client PFEventPipelineBatchUploadSucceededEventHandler"); + } +} + +HRESULT EventPipelineEventHandlers::SharedState::RegisterBatchUploadSucceededHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadSucceededEventHandler* succeededHandler, + PFRegistrationToken* token +) noexcept +{ + std::unique_lock lock{ m_mutex }; + + RETURN_HR_INVALIDARG_IF_NULL(succeededHandler); + RETURN_HR_INVALIDARG_IF_NULL(token); + + *token = m_nextToken++; + m_batchUploadedSucceededHandlers.emplace(*token, MakeShared(std::move(rc), handlerContext, succeededHandler)); + + return S_OK; +} + +HRESULT EventPipelineEventHandlers::SharedState::RegisterBatchUploadFailedHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadFailedEventHandler* failedHandler, + PFRegistrationToken* token +) noexcept +{ + std::unique_lock lock{ m_mutex }; + + RETURN_HR_INVALIDARG_IF_NULL(failedHandler); + RETURN_HR_INVALIDARG_IF_NULL(token); + + *token = m_nextToken++; + m_batchUploadFailedHandlers.emplace(*token, MakeShared(std::move(rc), handlerContext, failedHandler)); + + return S_OK; +} + +void EventPipelineEventHandlers::SharedState::UnregisterHandler(PFRegistrationToken token) noexcept +{ + std::unique_lock lock{ m_mutex }; + + TRACE_VERBOSE(__FUNCTION__); + + auto successHandlersIter = m_batchUploadedSucceededHandlers.find(token); + if (successHandlersIter != m_batchUploadedSucceededHandlers.end()) + { + successHandlersIter->second->RunContext().CancellationToken().Cancel(); + m_batchUploadedSucceededHandlers.erase(successHandlersIter); + return; + } + + auto failedHandlersIter = m_batchUploadFailedHandlers.find(token); + if (failedHandlersIter != m_batchUploadFailedHandlers.end()) + { + failedHandlersIter->second->RunContext().CancellationToken().Cancel(); + m_batchUploadFailedHandlers.erase(failedHandlersIter); + return; + } + + TRACE_WARNING("%s: Attempted to unregister handler with unrecognized token", __FUNCTION__); +} + +void EventPipelineEventHandlers::SharedState::InvokeBatchSucceeded(UploadedBatch&& batch) +{ + std::unique_lock lock{ m_mutex }; + auto sharedThis{ shared_from_this() }; + + for (auto& pair : m_batchUploadedSucceededHandlers) + { + // EventPipelineEventHandlers::SharedState handles submitting the work to the TaskQueue so that it can synchronize the event handler invocation + // and unregistration of the handler + + auto handler = pair.second; + handler->RunContext().TaskQueueSubmitWork([sharedThis, handler, batch]() + { + std::unique_lock lock{ sharedThis->m_mutex }; // lock to avoid races with unregistering the handler + if (!handler->RunContext().CancellationToken().IsCancelled()) + { + handler->Invoke(batch); + } + }); + } +} + +void EventPipelineEventHandlers::SharedState::InvokeBatchFailed(HRESULT translatedError, String&& errorMessage, FailedBatch&& batch) +{ + std::unique_lock lock{ m_mutex }; + auto sharedThis{ shared_from_this() }; + + for (auto& pair : m_batchUploadFailedHandlers) + { + // EventPipelineEventHandlers::SharedState handles submitting the work to the TaskQueue so that it can synchronize the event handler invocation + // and unregistration of the handler + + auto handler = pair.second; + handler->RunContext().TaskQueueSubmitWork([sharedThis, handler, translatedError, errorMessage, batch]() + { + std::unique_lock lock{ sharedThis->m_mutex }; // lock to avoid races with unregistering the handler + if (!handler->RunContext().CancellationToken().IsCancelled()) + { + handler->Invoke(translatedError, errorMessage, batch); + } + }); + } +} + +EventPipelineEventHandlers::EventPipelineEventHandlers() noexcept : + m_state{ MakeShared() } +{ +} + +HRESULT EventPipelineEventHandlers::RegisterBatchUploadSucceededHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadSucceededEventHandler* succeededHandler, + PFRegistrationToken* token +) noexcept +{ + return m_state->RegisterBatchUploadSucceededHandler(std::move(rc), handlerContext, succeededHandler, token); +} + +HRESULT EventPipelineEventHandlers::RegisterBatchUploadFailedHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadFailedEventHandler* failedHandler, + PFRegistrationToken* token +) noexcept +{ + return m_state->RegisterBatchUploadFailedHandler(std::move(rc), handlerContext, failedHandler, token); +} + +void EventPipelineEventHandlers::UnregisterHandler(PFRegistrationToken token) noexcept +{ + return m_state->UnregisterHandler(token); +} + +void EventPipelineEventHandlers::InvokeBatchSucceeded(UploadedBatch&& batch) +{ + m_state->InvokeBatchSucceeded(std::move(batch)); +} + +void EventPipelineEventHandlers::InvokeBatchFailed(HRESULT translatedError, String&& errorMessage, FailedBatch&& batch) +{ + m_state->InvokeBatchFailed(translatedError, std::move(errorMessage), std::move(batch)); +} + +} \ No newline at end of file diff --git a/Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.h b/Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.h new file mode 100644 index 0000000..85acf5e --- /dev/null +++ b/Source/PlayFabCore/Source/EventPipeline/EventPipelineTypes.h @@ -0,0 +1,107 @@ +#pragma once + +#include + +namespace PlayFab +{ + +class Event : public Wrappers::ModelWrapper +{ +public: + using ModelType = PFEvent; + + Event() = default; + Event(PFEvent const& src); + Event(Event const& src); + Event(Event&& src); + Event& operator=(Event src); + ~Event() = default; + + friend void swap(Event& lhs, Event& rhs); + + time_t EmitTime() const; + void SetClientId(String&& clientId); + +private: + void SetModelPointers(); + + std::optional m_entity; + String m_eventNamespace; + String m_name; + String m_clientId; + String m_payloadJson; + time_t m_emitTime; +}; + +class UploadedEvent : public Wrappers::ModelWrapper +{ +public: + using ModelType = PFUploadedEvent; + + UploadedEvent(String&& clientId, String&& serviceId); + UploadedEvent(UploadedEvent const& src); + UploadedEvent(UploadedEvent&& src); + UploadedEvent& operator=(UploadedEvent src); + ~UploadedEvent() = default; + + friend void swap(UploadedEvent& lhs, UploadedEvent& rhs); + +private: + void SetModelPointers(); + + String m_clientId; + String m_serviceId; +}; + +class UploadedBatch : public Wrappers::ModelVector +{ +public: + UploadedBatch(Vector const& events, Vector&& serviceIds); +}; + +class FailedBatch : public Wrappers::ModelVector +{ +public: + FailedBatch(Vector&& events); +}; + +// Class the manages client pipeline event handlers. This pattern is a little tricky because the client doesn't directly control lifetime +// of the EventUploader that will be invoking the handlers. This class allows the EventPipeline (which the client does control the lifetime of) +// to unregister the client's handlers during EventPipeline destruction, ensuring they will never be invoked after pipeline is destroyed. +// This means that if there are still events awaiting upload when the client cleans up the pipeline, they will still be uploaded in the background +// but the client will not receive callbacks upon completion. +class EventPipelineEventHandlers +{ +public: + EventPipelineEventHandlers() noexcept; + EventPipelineEventHandlers(EventPipelineEventHandlers const&) = default; + EventPipelineEventHandlers(EventPipelineEventHandlers&&) = default; + EventPipelineEventHandlers& operator=(EventPipelineEventHandlers) = delete; + ~EventPipelineEventHandlers() = default; + + HRESULT RegisterBatchUploadSucceededHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadSucceededEventHandler* succeededHandler, + PFRegistrationToken* token + ) noexcept; + + HRESULT RegisterBatchUploadFailedHandler( + RunContext&& rc, + void* handlerContext, + PFEventPipelineBatchUploadFailedEventHandler* failedHandler, + PFRegistrationToken* token + ) noexcept; + + void UnregisterHandler(PFRegistrationToken token) noexcept; + + void InvokeBatchSucceeded(UploadedBatch&& batch); + void InvokeBatchFailed(HRESULT translatedError, String&& errorMessage, FailedBatch&& batch); + +private: + class SharedState; + + SharedPtr m_state; +}; + +} diff --git a/Source/PlayFabCore/Source/Generated/Authentication.cpp b/Source/PlayFabCore/Source/Generated/Authentication.cpp new file mode 100644 index 0000000..09af088 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/Authentication.cpp @@ -0,0 +1,1958 @@ +#include "stdafx.h" +#include "Authentication.h" +#include "GlobalState.h" +#include "JsonUtils.h" + +namespace PlayFab +{ +namespace Authentication +{ + + +AsyncOp AuthenticationAPI::GetPhotonAuthenticationToken( + SharedPtr entity, + const GetPhotonAuthenticationTokenRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPhotonAuthenticationToken" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationGetPhotonAuthenticationToken; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPhotonAuthenticationTokenResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::GetTitlePublicKey( + SharedPtr serviceConfig, + const GetTitlePublicKeyRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetTitlePublicKey" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationGetTitlePublicKey; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitlePublicKeyResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithAndroidDeviceID( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithAndroidDeviceIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithAndroidDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithAndroidDeviceID; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithAndroidDeviceID( + SharedPtr entity, + const LoginWithAndroidDeviceIDRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithAndroidDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithAndroidDeviceID; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithApple( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithAppleRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithApple" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithApple; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithApple( + SharedPtr entity, + const LoginWithAppleRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithApple" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithApple; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithCustomID( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithCustomIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithCustomID" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithCustomID; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithCustomID( + SharedPtr entity, + const LoginWithCustomIDRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithCustomID" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithCustomID; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithEmailAddress( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithEmailAddressRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithEmailAddress" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithEmailAddress; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithEmailAddress( + SharedPtr entity, + const LoginWithEmailAddressRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithEmailAddress" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithEmailAddress; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithFacebook( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithFacebookRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithFacebook" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithFacebook; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithFacebook( + SharedPtr entity, + const LoginWithFacebookRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithFacebook" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithFacebook; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithFacebookInstantGamesId( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithFacebookInstantGamesIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithFacebookInstantGamesId" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithFacebookInstantGamesId; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithFacebookInstantGamesId( + SharedPtr entity, + const LoginWithFacebookInstantGamesIdRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithFacebookInstantGamesId" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithFacebookInstantGamesId; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithGameCenter( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithGameCenterRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithGameCenter" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithGameCenter; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithGameCenter( + SharedPtr entity, + const LoginWithGameCenterRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithGameCenter" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithGameCenter; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithGoogleAccount( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithGoogleAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithGoogleAccount" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithGoogleAccount; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithGoogleAccount( + SharedPtr entity, + const LoginWithGoogleAccountRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithGoogleAccount" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithGoogleAccount; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithGooglePlayGamesServices( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithGooglePlayGamesServicesRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithGooglePlayGamesServices" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithGooglePlayGamesServices; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithGooglePlayGamesServices( + SharedPtr entity, + const LoginWithGooglePlayGamesServicesRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithGooglePlayGamesServices" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithGooglePlayGamesServices; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithIOSDeviceID( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithIOSDeviceIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithIOSDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithIOSDeviceID; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithIOSDeviceID( + SharedPtr entity, + const LoginWithIOSDeviceIDRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithIOSDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithIOSDeviceID; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithKongregate( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithKongregateRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithKongregate" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithKongregate; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithKongregate( + SharedPtr entity, + const LoginWithKongregateRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithKongregate" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithKongregate; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithNintendoServiceAccount( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithNintendoServiceAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithNintendoServiceAccount" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithNintendoServiceAccount; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithNintendoServiceAccount( + SharedPtr entity, + const LoginWithNintendoServiceAccountRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithNintendoServiceAccount" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithNintendoServiceAccount; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithNintendoSwitchDeviceId( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithNintendoSwitchDeviceIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithNintendoSwitchDeviceId" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithNintendoSwitchDeviceId; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithNintendoSwitchDeviceId( + SharedPtr entity, + const LoginWithNintendoSwitchDeviceIdRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithNintendoSwitchDeviceId" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithNintendoSwitchDeviceId; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithOpenIdConnect( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithOpenIdConnectRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithOpenIdConnect" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithOpenIdConnect; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithOpenIdConnect( + SharedPtr entity, + const LoginWithOpenIdConnectRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithOpenIdConnect" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithOpenIdConnect; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithPlayFab( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithPlayFabRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithPlayFab" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithPlayFab; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithPlayFab( + SharedPtr entity, + const LoginWithPlayFabRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithPlayFab" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithPlayFab; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithPSN( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithPSNRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithPSN" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithPSN; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithPSN( + SharedPtr entity, + const LoginWithPSNRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithPSN" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithPSN; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithSteam( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithSteamRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithSteam" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithSteam; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithSteam( + SharedPtr entity, + const LoginWithSteamRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithSteam" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithSteam; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithTwitch( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithTwitchRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithTwitch" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithTwitch; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithTwitch( + SharedPtr entity, + const LoginWithTwitchRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithTwitch" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithTwitch; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::LoginWithXbox( + SharedPtr state, + SharedPtr serviceConfig, + const LoginWithXboxRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LoginWithXbox" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationLoginWithXbox; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return CombinedLoginResult::FromJson(serviceResponse.Data, state, serviceConfig, loginContext); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ReLoginWithXbox( + SharedPtr entity, + const LoginWithXboxRequest& request, + RunContext rc) +{ + const char* path{ "/Client/LoginWithXbox" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", entity->ServiceConfig()->TitleId())); + + CacheId retryCacheId = CacheId::AuthenticationLoginWithXbox; + auto requestOp = entity->ServiceConfig()->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + std::move(requestBody), + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([entity, loginContext](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode == 200) + { + EntityTokenResponse entityToken; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(serviceResponse.Data, "EntityToken", entityToken)); + RETURN_IF_FAILED(entity->OnEntityTokenRefreshed(entityToken)); + RETURN_IF_FAILED(entity->OnLoginContextUpdated(loginContext)); + + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::RegisterPlayFabUser( + SharedPtr serviceConfig, + const RegisterPlayFabUserRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/RegisterPlayFabUser" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationRegisterPlayFabUser; + + auto requestOp = serviceConfig->HttpClient()->MakePostRequest( + path, + UnorderedMap{}, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RegisterPlayFabUserResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::SetPlayerSecret( + SharedPtr entity, + const SetPlayerSecretRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/SetPlayerSecret" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationSetPlayerSecret; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ServerLoginWithServerCustomId( + SharedPtr state, + SharedPtr serviceConfig, + String&& secretKey, + const LoginWithServerCustomIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LoginWithServerCustomId" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationServerLoginWithServerCustomId; + + auto requestOp = serviceConfig->HttpClient()->MakeSecretKeyRequest( + serviceConfig, + secretKey, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext, secretKey](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return ServerCombinedLoginResult::FromJson(serviceResponse.Data); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ServerLoginWithSteamId( + SharedPtr state, + SharedPtr serviceConfig, + String&& secretKey, + const LoginWithSteamIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LoginWithSteamId" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationServerLoginWithSteamId; + + auto requestOp = serviceConfig->HttpClient()->MakeSecretKeyRequest( + serviceConfig, + secretKey, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext, secretKey](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return ServerCombinedLoginResult::FromJson(serviceResponse.Data); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ServerLoginWithXbox( + SharedPtr state, + SharedPtr serviceConfig, + String&& secretKey, + const ServerLoginWithXboxRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LoginWithXbox" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationServerLoginWithXbox; + + auto requestOp = serviceConfig->HttpClient()->MakeSecretKeyRequest( + serviceConfig, + secretKey, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext, secretKey](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return ServerCombinedLoginResult::FromJson(serviceResponse.Data); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ServerLoginWithXboxId( + SharedPtr state, + SharedPtr serviceConfig, + String&& secretKey, + const LoginWithXboxIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LoginWithXboxId" }; + JsonValue requestBody{ request.ToJson() }; + RETURN_IF_FAILED(JsonUtils::ObjectAddMember(requestBody, "TitleId", serviceConfig->TitleId())); + CacheId retryCacheId = CacheId::AuthenticationServerLoginWithXboxId; + + auto requestOp = serviceConfig->HttpClient()->MakeSecretKeyRequest( + serviceConfig, + secretKey, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + SharedPtr loginContext = MakeShared(path, std::move(requestBody), retryCacheId); + return requestOp.Then([state, serviceConfig, loginContext, secretKey](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return ServerCombinedLoginResult::FromJson(serviceResponse.Data); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +AsyncOp AuthenticationAPI::AuthenticateGameServerWithCustomId( + SharedPtr entity, + const AuthenticateCustomIdRequest& request, + RunContext rc +) +{ + const char* path{ "/GameServerIdentity/AuthenticateGameServerWithCustomId" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationAuthenticateGameServerWithCustomId; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + AuthenticateCustomIdResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} +#endif + +AsyncOp AuthenticationAPI::Delete( + SharedPtr entity, + const DeleteRequest& request, + RunContext rc +) +{ + const char* path{ "/GameServerIdentity/Delete" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationDelete; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp> AuthenticationAPI::GetEntity( + SharedPtr state, + SharedPtr entity, + const GetEntityRequest& request, + RunContext rc +) +{ + const char* path{ "/Authentication/GetEntityToken" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationGetEntity; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([state, serviceConfig{ entity->ServiceConfig() }](Result result) -> Result> + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetEntityTokenResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return Entity::Make(std::move(resultModel), serviceConfig, state->RunContext(), state->TokenExpiredHandler(), state->TokenRefreshedHandler()); + } + else + { + return Result>{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp> AuthenticationAPI::GetEntityWithSecretKey( + SharedPtr state, + SharedPtr serviceConfig, + String&& secretKey, + const GetEntityRequest& request, + RunContext rc +) +{ + const char* path{ "/Authentication/GetEntityToken" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationGetEntityWithSecretKey; + + auto requestOp = serviceConfig->HttpClient()->MakeSecretKeyRequest( + serviceConfig, + secretKey, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([state, serviceConfig, secretKey](Result result) -> Result> + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetEntityTokenResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return Entity::Make(std::move(resultModel), serviceConfig, state->RunContext(), state->TokenExpiredHandler(), state->TokenRefreshedHandler(), secretKey); + } + else + { + return Result>{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AuthenticationAPI::ValidateEntityToken( + SharedPtr entity, + const ValidateEntityTokenRequest& request, + RunContext rc +) +{ + const char* path{ "/Authentication/ValidateEntityToken" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::AuthenticationValidateEntityToken; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ValidateEntityTokenResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Authentication +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/Authentication.h b/Source/PlayFabCore/Source/Generated/Authentication.h new file mode 100644 index 0000000..c737684 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/Authentication.h @@ -0,0 +1,82 @@ +#pragma once + +#include "AuthenticationTypes.h" +#include "Common/Entity.h" +#include "Common/GlobalState.h" +#include "Authentication/CombinedLoginResult.h" + +namespace PlayFab +{ +namespace Authentication +{ + +class AuthenticationAPI +{ +public: + AuthenticationAPI() = delete; + AuthenticationAPI(const AuthenticationAPI& source) = delete; + AuthenticationAPI& operator=(const AuthenticationAPI& source) = delete; + ~AuthenticationAPI() = default; + + // ------------ Generated API calls + static AsyncOp GetPhotonAuthenticationToken(SharedPtr entity, const GetPhotonAuthenticationTokenRequest& request, RunContext rc); + static AsyncOp GetTitlePublicKey(SharedPtr config, const GetTitlePublicKeyRequest& request, RunContext rc); + static AsyncOp LoginWithAndroidDeviceID(SharedPtr state, SharedPtr config, const LoginWithAndroidDeviceIDRequest& request, RunContext rc); + static AsyncOp ReLoginWithAndroidDeviceID(SharedPtr entity, const LoginWithAndroidDeviceIDRequest& request, RunContext rc); + static AsyncOp LoginWithApple(SharedPtr state, SharedPtr config, const LoginWithAppleRequest& request, RunContext rc); + static AsyncOp ReLoginWithApple(SharedPtr entity, const LoginWithAppleRequest& request, RunContext rc); + static AsyncOp LoginWithCustomID(SharedPtr state, SharedPtr config, const LoginWithCustomIDRequest& request, RunContext rc); + static AsyncOp ReLoginWithCustomID(SharedPtr entity, const LoginWithCustomIDRequest& request, RunContext rc); + static AsyncOp LoginWithEmailAddress(SharedPtr state, SharedPtr config, const LoginWithEmailAddressRequest& request, RunContext rc); + static AsyncOp ReLoginWithEmailAddress(SharedPtr entity, const LoginWithEmailAddressRequest& request, RunContext rc); + static AsyncOp LoginWithFacebook(SharedPtr state, SharedPtr config, const LoginWithFacebookRequest& request, RunContext rc); + static AsyncOp ReLoginWithFacebook(SharedPtr entity, const LoginWithFacebookRequest& request, RunContext rc); + static AsyncOp LoginWithFacebookInstantGamesId(SharedPtr state, SharedPtr config, const LoginWithFacebookInstantGamesIdRequest& request, RunContext rc); + static AsyncOp ReLoginWithFacebookInstantGamesId(SharedPtr entity, const LoginWithFacebookInstantGamesIdRequest& request, RunContext rc); + static AsyncOp LoginWithGameCenter(SharedPtr state, SharedPtr config, const LoginWithGameCenterRequest& request, RunContext rc); + static AsyncOp ReLoginWithGameCenter(SharedPtr entity, const LoginWithGameCenterRequest& request, RunContext rc); + static AsyncOp LoginWithGoogleAccount(SharedPtr state, SharedPtr config, const LoginWithGoogleAccountRequest& request, RunContext rc); + static AsyncOp ReLoginWithGoogleAccount(SharedPtr entity, const LoginWithGoogleAccountRequest& request, RunContext rc); + static AsyncOp LoginWithGooglePlayGamesServices(SharedPtr state, SharedPtr config, const LoginWithGooglePlayGamesServicesRequest& request, RunContext rc); + static AsyncOp ReLoginWithGooglePlayGamesServices(SharedPtr entity, const LoginWithGooglePlayGamesServicesRequest& request, RunContext rc); + static AsyncOp LoginWithIOSDeviceID(SharedPtr state, SharedPtr config, const LoginWithIOSDeviceIDRequest& request, RunContext rc); + static AsyncOp ReLoginWithIOSDeviceID(SharedPtr entity, const LoginWithIOSDeviceIDRequest& request, RunContext rc); + static AsyncOp LoginWithKongregate(SharedPtr state, SharedPtr config, const LoginWithKongregateRequest& request, RunContext rc); + static AsyncOp ReLoginWithKongregate(SharedPtr entity, const LoginWithKongregateRequest& request, RunContext rc); + static AsyncOp LoginWithNintendoServiceAccount(SharedPtr state, SharedPtr config, const LoginWithNintendoServiceAccountRequest& request, RunContext rc); + static AsyncOp ReLoginWithNintendoServiceAccount(SharedPtr entity, const LoginWithNintendoServiceAccountRequest& request, RunContext rc); + static AsyncOp LoginWithNintendoSwitchDeviceId(SharedPtr state, SharedPtr config, const LoginWithNintendoSwitchDeviceIdRequest& request, RunContext rc); + static AsyncOp ReLoginWithNintendoSwitchDeviceId(SharedPtr entity, const LoginWithNintendoSwitchDeviceIdRequest& request, RunContext rc); + static AsyncOp LoginWithOpenIdConnect(SharedPtr state, SharedPtr config, const LoginWithOpenIdConnectRequest& request, RunContext rc); + static AsyncOp ReLoginWithOpenIdConnect(SharedPtr entity, const LoginWithOpenIdConnectRequest& request, RunContext rc); + static AsyncOp LoginWithPlayFab(SharedPtr state, SharedPtr config, const LoginWithPlayFabRequest& request, RunContext rc); + static AsyncOp ReLoginWithPlayFab(SharedPtr entity, const LoginWithPlayFabRequest& request, RunContext rc); + static AsyncOp LoginWithPSN(SharedPtr state, SharedPtr config, const LoginWithPSNRequest& request, RunContext rc); + static AsyncOp ReLoginWithPSN(SharedPtr entity, const LoginWithPSNRequest& request, RunContext rc); + static AsyncOp LoginWithSteam(SharedPtr state, SharedPtr config, const LoginWithSteamRequest& request, RunContext rc); + static AsyncOp ReLoginWithSteam(SharedPtr entity, const LoginWithSteamRequest& request, RunContext rc); + static AsyncOp LoginWithTwitch(SharedPtr state, SharedPtr config, const LoginWithTwitchRequest& request, RunContext rc); + static AsyncOp ReLoginWithTwitch(SharedPtr entity, const LoginWithTwitchRequest& request, RunContext rc); + static AsyncOp LoginWithXbox(SharedPtr state, SharedPtr config, const LoginWithXboxRequest& request, RunContext rc); + static AsyncOp ReLoginWithXbox(SharedPtr entity, const LoginWithXboxRequest& request, RunContext rc); +#if HC_PLATFORM == HC_PLATFORM_GDK + static AsyncOp LoginWithXUser(SharedPtr state, SharedPtr config, const LoginWithXUserRequest& request, RunContext rc); + static AsyncOp ReLoginWithXUser(SharedPtr entity, const LoginWithXUserRequest& request, RunContext rc); +#endif + static AsyncOp RegisterPlayFabUser(SharedPtr config, const RegisterPlayFabUserRequest& request, RunContext rc); + static AsyncOp SetPlayerSecret(SharedPtr entity, const SetPlayerSecretRequest& request, RunContext rc); + static AsyncOp ServerLoginWithServerCustomId(SharedPtr state, SharedPtr config, String&& secretKey, const LoginWithServerCustomIdRequest& request, RunContext rc); + static AsyncOp ServerLoginWithSteamId(SharedPtr state, SharedPtr config, String&& secretKey, const LoginWithSteamIdRequest& request, RunContext rc); + static AsyncOp ServerLoginWithXbox(SharedPtr state, SharedPtr config, String&& secretKey, const ServerLoginWithXboxRequest& request, RunContext rc); + static AsyncOp ServerLoginWithXboxId(SharedPtr state, SharedPtr config, String&& secretKey, const LoginWithXboxIdRequest& request, RunContext rc); +#if HC_PLATFORM != HC_PLATFORM_GDK + static AsyncOp AuthenticateGameServerWithCustomId(SharedPtr entity, const AuthenticateCustomIdRequest& request, RunContext rc); +#endif + static AsyncOp Delete(SharedPtr entity, const DeleteRequest& request, RunContext rc); + static AsyncOp> GetEntity(SharedPtr state, SharedPtr entity, const GetEntityRequest& request, RunContext rc); + static AsyncOp> GetEntityWithSecretKey(SharedPtr state, SharedPtr config, String&& secretKey, const GetEntityRequest& request, RunContext rc); + static AsyncOp ValidateEntityToken(SharedPtr entity, const ValidateEntityTokenRequest& request, RunContext rc); +}; + +} // namespace Authentication +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/AuthenticationTypes.cpp b/Source/PlayFabCore/Source/Generated/AuthenticationTypes.cpp new file mode 100644 index 0000000..1325031 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/AuthenticationTypes.cpp @@ -0,0 +1,1027 @@ +#include "stdafx.h" +#include "AuthenticationTypes.h" +#include "JsonUtils.h" + +namespace PlayFab +{ +namespace Authentication +{ + +JsonValue GetPhotonAuthenticationTokenRequest::ToJson() const +{ + return GetPhotonAuthenticationTokenRequest::ToJson(this->Model()); +} + +JsonValue GetPhotonAuthenticationTokenRequest::ToJson(const PFAuthenticationGetPhotonAuthenticationTokenRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "PhotonApplicationId", input.photonApplicationId); + return output; +} + +HRESULT GetPhotonAuthenticationTokenResult::FromJson(const JsonValue& input) +{ + String photonCustomAuthenticationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PhotonCustomAuthenticationToken", photonCustomAuthenticationToken)); + this->SetPhotonCustomAuthenticationToken(std::move(photonCustomAuthenticationToken)); + + return S_OK; +} + +size_t GetPhotonAuthenticationTokenResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPhotonAuthenticationTokenResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPhotonAuthenticationTokenResult::RequiredBufferSize(const PFAuthenticationGetPhotonAuthenticationTokenResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.photonCustomAuthenticationToken) + { + requiredSize += (std::strlen(model.photonCustomAuthenticationToken) + 1); + } + return requiredSize; +} + +HRESULT GetPhotonAuthenticationTokenResult::Copy(const PFAuthenticationGetPhotonAuthenticationTokenResult& input, PFAuthenticationGetPhotonAuthenticationTokenResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.photonCustomAuthenticationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.photonCustomAuthenticationToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetTitlePublicKeyRequest::ToJson() const +{ + return GetTitlePublicKeyRequest::ToJson(this->Model()); +} + +JsonValue GetTitlePublicKeyRequest::ToJson(const PFAuthenticationGetTitlePublicKeyRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "TitleId", input.titleId); + JsonUtils::ObjectAddMember(output, "TitleSharedSecret", input.titleSharedSecret); + return output; +} + +HRESULT GetTitlePublicKeyResult::FromJson(const JsonValue& input) +{ + String RSAPublicKey{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RSAPublicKey", RSAPublicKey)); + this->SetRSAPublicKey(std::move(RSAPublicKey)); + + return S_OK; +} + +size_t GetTitlePublicKeyResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTitlePublicKeyResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTitlePublicKeyResult::RequiredBufferSize(const PFAuthenticationGetTitlePublicKeyResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.RSAPublicKey) + { + requiredSize += (std::strlen(model.RSAPublicKey) + 1); + } + return requiredSize; +} + +HRESULT GetTitlePublicKeyResult::Copy(const PFAuthenticationGetTitlePublicKeyResult& input, PFAuthenticationGetTitlePublicKeyResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.RSAPublicKey); + RETURN_IF_FAILED(propCopyResult.hr); + output.RSAPublicKey = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue LoginWithAndroidDeviceIDRequest::ToJson() const +{ + return LoginWithAndroidDeviceIDRequest::ToJson(this->Model()); +} + +JsonValue LoginWithAndroidDeviceIDRequest::ToJson(const PFAuthenticationLoginWithAndroidDeviceIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AndroidDevice", input.androidDevice); + JsonUtils::ObjectAddMember(output, "AndroidDeviceId", input.androidDeviceId); + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "OS", input.OS); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +HRESULT UserSettings::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GatherDeviceInfo", this->m_model.gatherDeviceInfo)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GatherFocusInfo", this->m_model.gatherFocusInfo)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NeedsAttribution", this->m_model.needsAttribution)); + + return S_OK; +} + +size_t UserSettings::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserSettings::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserSettings::RequiredBufferSize(const PFAuthenticationUserSettings& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT UserSettings::Copy(const PFAuthenticationUserSettings& input, PFAuthenticationUserSettings& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +HRESULT LoginResult::FromJson(const JsonValue& input) +{ + std::optional infoResultPayload{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "InfoResultPayload", infoResultPayload)); + if (infoResultPayload) + { + this->SetInfoResultPayload(std::move(*infoResultPayload)); + } + + std::optional lastLoginTime{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastLoginTime", lastLoginTime)); + this->SetLastLoginTime(std::move(lastLoginTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NewlyCreated", this->m_model.newlyCreated)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + std::optional settingsForUser{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SettingsForUser", settingsForUser)); + if (settingsForUser) + { + this->SetSettingsForUser(std::move(*settingsForUser)); + } + + std::optional treatmentAssignment{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TreatmentAssignment", treatmentAssignment)); + if (treatmentAssignment) + { + this->SetTreatmentAssignment(std::move(*treatmentAssignment)); + } + + return S_OK; +} + +size_t LoginResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result LoginResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t LoginResult::RequiredBufferSize(const PFAuthenticationLoginResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.infoResultPayload) + { + requiredSize += GetPlayerCombinedInfoResultPayload::RequiredBufferSize(*model.infoResultPayload); + } + if (model.lastLoginTime) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.settingsForUser) + { + requiredSize += UserSettings::RequiredBufferSize(*model.settingsForUser); + } + if (model.treatmentAssignment) + { + requiredSize += TreatmentAssignment::RequiredBufferSize(*model.treatmentAssignment); + } + return requiredSize; +} + +HRESULT LoginResult::Copy(const PFAuthenticationLoginResult& input, PFAuthenticationLoginResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.infoResultPayload); + RETURN_IF_FAILED(propCopyResult.hr); + output.infoResultPayload = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastLoginTime); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastLoginTime = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.settingsForUser); + RETURN_IF_FAILED(propCopyResult.hr); + output.settingsForUser = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.treatmentAssignment); + RETURN_IF_FAILED(propCopyResult.hr); + output.treatmentAssignment = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue LoginWithAppleRequest::ToJson() const +{ + return LoginWithAppleRequest::ToJson(this->Model()); +} + +JsonValue LoginWithAppleRequest::ToJson(const PFAuthenticationLoginWithAppleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "IdentityToken", input.identityToken); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithCustomIDRequest::ToJson() const +{ + return LoginWithCustomIDRequest::ToJson(this->Model()); +} + +JsonValue LoginWithCustomIDRequest::ToJson(const PFAuthenticationLoginWithCustomIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMember(output, "CustomId", input.customId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithEmailAddressRequest::ToJson() const +{ + return LoginWithEmailAddressRequest::ToJson(this->Model()); +} + +JsonValue LoginWithEmailAddressRequest::ToJson(const PFAuthenticationLoginWithEmailAddressRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Email", input.email); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "Password", input.password); + return output; +} + +JsonValue LoginWithFacebookRequest::ToJson() const +{ + return LoginWithFacebookRequest::ToJson(this->Model()); +} + +JsonValue LoginWithFacebookRequest::ToJson(const PFAuthenticationLoginWithFacebookRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AccessToken", input.accessToken); + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithFacebookInstantGamesIdRequest::ToJson() const +{ + return LoginWithFacebookInstantGamesIdRequest::ToJson(this->Model()); +} + +JsonValue LoginWithFacebookInstantGamesIdRequest::ToJson(const PFAuthenticationLoginWithFacebookInstantGamesIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "FacebookInstantGamesSignature", input.facebookInstantGamesSignature); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithGameCenterRequest::ToJson() const +{ + return LoginWithGameCenterRequest::ToJson(this->Model()); +} + +JsonValue LoginWithGameCenterRequest::ToJson(const PFAuthenticationLoginWithGameCenterRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerId", input.playerId); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "PublicKeyUrl", input.publicKeyUrl); + JsonUtils::ObjectAddMember(output, "Salt", input.salt); + JsonUtils::ObjectAddMember(output, "Signature", input.signature); + JsonUtils::ObjectAddMember(output, "Timestamp", input.timestamp); + return output; +} + +JsonValue LoginWithGoogleAccountRequest::ToJson() const +{ + return LoginWithGoogleAccountRequest::ToJson(this->Model()); +} + +JsonValue LoginWithGoogleAccountRequest::ToJson(const PFAuthenticationLoginWithGoogleAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "ServerAuthCode", input.serverAuthCode); + JsonUtils::ObjectAddMember(output, "SetEmail", input.setEmail); + return output; +} + +JsonValue LoginWithGooglePlayGamesServicesRequest::ToJson() const +{ + return LoginWithGooglePlayGamesServicesRequest::ToJson(this->Model()); +} + +JsonValue LoginWithGooglePlayGamesServicesRequest::ToJson(const PFAuthenticationLoginWithGooglePlayGamesServicesRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "ServerAuthCode", input.serverAuthCode); + return output; +} + +JsonValue LoginWithIOSDeviceIDRequest::ToJson() const +{ + return LoginWithIOSDeviceIDRequest::ToJson(this->Model()); +} + +JsonValue LoginWithIOSDeviceIDRequest::ToJson(const PFAuthenticationLoginWithIOSDeviceIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DeviceId", input.deviceId); + JsonUtils::ObjectAddMember(output, "DeviceModel", input.deviceModel); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "OS", input.OS); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithKongregateRequest::ToJson() const +{ + return LoginWithKongregateRequest::ToJson(this->Model()); +} + +JsonValue LoginWithKongregateRequest::ToJson(const PFAuthenticationLoginWithKongregateRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AuthTicket", input.authTicket); + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "KongregateId", input.kongregateId); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithNintendoServiceAccountRequest::ToJson() const +{ + return LoginWithNintendoServiceAccountRequest::ToJson(this->Model()); +} + +JsonValue LoginWithNintendoServiceAccountRequest::ToJson(const PFAuthenticationLoginWithNintendoServiceAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "IdentityToken", input.identityToken); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithNintendoSwitchDeviceIdRequest::ToJson() const +{ + return LoginWithNintendoSwitchDeviceIdRequest::ToJson(this->Model()); +} + +JsonValue LoginWithNintendoSwitchDeviceIdRequest::ToJson(const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "NintendoSwitchDeviceId", input.nintendoSwitchDeviceId); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithOpenIdConnectRequest::ToJson() const +{ + return LoginWithOpenIdConnectRequest::ToJson(this->Model()); +} + +JsonValue LoginWithOpenIdConnectRequest::ToJson(const PFAuthenticationLoginWithOpenIdConnectRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ConnectionId", input.connectionId); + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "IdToken", input.idToken); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithPlayFabRequest::ToJson() const +{ + return LoginWithPlayFabRequest::ToJson(this->Model()); +} + +JsonValue LoginWithPlayFabRequest::ToJson(const PFAuthenticationLoginWithPlayFabRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "Password", input.password); + JsonUtils::ObjectAddMember(output, "Username", input.username); + return output; +} + +JsonValue LoginWithPSNRequest::ToJson() const +{ + return LoginWithPSNRequest::ToJson(this->Model()); +} + +JsonValue LoginWithPSNRequest::ToJson(const PFAuthenticationLoginWithPSNRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AuthCode", input.authCode); + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "IssuerId", input.issuerId); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "RedirectUri", input.redirectUri); + return output; +} + +JsonValue LoginWithSteamRequest::ToJson() const +{ + return LoginWithSteamRequest::ToJson(this->Model()); +} + +JsonValue LoginWithSteamRequest::ToJson(const PFAuthenticationLoginWithSteamRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "SteamTicket", input.steamTicket); + JsonUtils::ObjectAddMember(output, "TicketIsServiceSpecific", input.ticketIsServiceSpecific); + return output; +} + +JsonValue LoginWithTwitchRequest::ToJson() const +{ + return LoginWithTwitchRequest::ToJson(this->Model()); +} + +JsonValue LoginWithTwitchRequest::ToJson(const PFAuthenticationLoginWithTwitchRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AccessToken", input.accessToken); + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithXboxRequest::ToJson() const +{ + return LoginWithXboxRequest::ToJson(this->Model()); +} + +JsonValue LoginWithXboxRequest::ToJson(const PFAuthenticationLoginWithXboxRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "XboxToken", input.xboxToken); + return output; +} + +#if HC_PLATFORM == HC_PLATFORM_GDK +JsonValue LoginWithXUserRequest::ToJson() const +{ + return LoginWithXUserRequest::ToJson(this->Model()); +} + +JsonValue LoginWithXUserRequest::ToJson(const PFAuthenticationLoginWithXUserRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} +#endif + +JsonValue RegisterPlayFabUserRequest::ToJson() const +{ + return RegisterPlayFabUserRequest::ToJson(this->Model()); +} + +JsonValue RegisterPlayFabUserRequest::ToJson(const PFAuthenticationRegisterPlayFabUserRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DisplayName", input.displayName); + JsonUtils::ObjectAddMember(output, "Email", input.email); + JsonUtils::ObjectAddMember(output, "EncryptedRequest", input.encryptedRequest); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "Password", input.password); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "RequireBothUsernameAndEmail", input.requireBothUsernameAndEmail); + JsonUtils::ObjectAddMember(output, "TitleId", input.titleId); + JsonUtils::ObjectAddMember(output, "Username", input.username); + return output; +} + +HRESULT RegisterPlayFabUserResult::FromJson(const JsonValue& input) +{ + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + std::optional settingsForUser{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SettingsForUser", settingsForUser)); + if (settingsForUser) + { + this->SetSettingsForUser(std::move(*settingsForUser)); + } + + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + return S_OK; +} + +size_t RegisterPlayFabUserResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RegisterPlayFabUserResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RegisterPlayFabUserResult::RequiredBufferSize(const PFAuthenticationRegisterPlayFabUserResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.settingsForUser) + { + requiredSize += UserSettings::RequiredBufferSize(*model.settingsForUser); + } + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + return requiredSize; +} + +HRESULT RegisterPlayFabUserResult::Copy(const PFAuthenticationRegisterPlayFabUserResult& input, PFAuthenticationRegisterPlayFabUserResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.settingsForUser); + RETURN_IF_FAILED(propCopyResult.hr); + output.settingsForUser = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SetPlayerSecretRequest::ToJson() const +{ + return SetPlayerSecretRequest::ToJson(this->Model()); +} + +JsonValue SetPlayerSecretRequest::ToJson(const PFAuthenticationSetPlayerSecretRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "EncryptedRequest", input.encryptedRequest); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + return output; +} + +JsonValue LoginWithServerCustomIdRequest::ToJson() const +{ + return LoginWithServerCustomIdRequest::ToJson(this->Model()); +} + +JsonValue LoginWithServerCustomIdRequest::ToJson(const PFAuthenticationLoginWithServerCustomIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayerSecret", input.playerSecret); + JsonUtils::ObjectAddMember(output, "ServerCustomId", input.serverCustomId); + return output; +} + +JsonValue LoginWithSteamIdRequest::ToJson() const +{ + return LoginWithSteamIdRequest::ToJson(this->Model()); +} + +JsonValue LoginWithSteamIdRequest::ToJson(const PFAuthenticationLoginWithSteamIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "SteamId", input.steamId); + return output; +} + +JsonValue ServerLoginWithXboxRequest::ToJson() const +{ + return ServerLoginWithXboxRequest::ToJson(this->Model()); +} + +JsonValue ServerLoginWithXboxRequest::ToJson(const PFAuthenticationServerLoginWithXboxRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "XboxToken", input.xboxToken); + return output; +} + +JsonValue LoginWithXboxIdRequest::ToJson() const +{ + return LoginWithXboxIdRequest::ToJson(this->Model()); +} + +JsonValue LoginWithXboxIdRequest::ToJson(const PFAuthenticationLoginWithXboxIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CreateAccount", input.createAccount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "Sandbox", input.sandbox); + JsonUtils::ObjectAddMember(output, "XboxId", input.xboxId); + return output; +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +JsonValue AuthenticateCustomIdRequest::ToJson() const +{ + return AuthenticateCustomIdRequest::ToJson(this->Model()); +} + +JsonValue AuthenticateCustomIdRequest::ToJson(const PFAuthenticationAuthenticateCustomIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CustomId", input.customId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +#endif +HRESULT EntityTokenResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + String entityToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EntityToken", entityToken)); + this->SetEntityToken(std::move(entityToken)); + + std::optional tokenExpiration{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "TokenExpiration", tokenExpiration)); + this->SetTokenExpiration(std::move(tokenExpiration)); + + return S_OK; +} + +size_t EntityTokenResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityTokenResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityTokenResponse::RequiredBufferSize(const PFAuthenticationEntityTokenResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + if (model.entityToken) + { + requiredSize += (std::strlen(model.entityToken) + 1); + } + if (model.tokenExpiration) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + return requiredSize; +} + +HRESULT EntityTokenResponse::Copy(const PFAuthenticationEntityTokenResponse& input, PFAuthenticationEntityTokenResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.entityToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.entityToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.tokenExpiration); + RETURN_IF_FAILED(propCopyResult.hr); + output.tokenExpiration = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +HRESULT AuthenticateCustomIdResult::FromJson(const JsonValue& input) +{ + std::optional entityToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EntityToken", entityToken)); + if (entityToken) + { + this->SetEntityToken(std::move(*entityToken)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NewlyCreated", this->m_model.newlyCreated)); + + return S_OK; +} + +size_t AuthenticateCustomIdResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AuthenticateCustomIdResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AuthenticateCustomIdResult::RequiredBufferSize(const PFAuthenticationAuthenticateCustomIdResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entityToken) + { + requiredSize += EntityTokenResponse::RequiredBufferSize(*model.entityToken); + } + return requiredSize; +} + +HRESULT AuthenticateCustomIdResult::Copy(const PFAuthenticationAuthenticateCustomIdResult& input, PFAuthenticationAuthenticateCustomIdResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entityToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.entityToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +#endif +JsonValue DeleteRequest::ToJson() const +{ + return DeleteRequest::ToJson(this->Model()); +} + +JsonValue DeleteRequest::ToJson(const PFAuthenticationDeleteRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +JsonValue GetEntityRequest::ToJson() const +{ + return GetEntityRequest::ToJson(this->Model()); +} + +JsonValue GetEntityRequest::ToJson(const PFAuthenticationGetEntityRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT GetEntityTokenResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EntityToken", entityToken)); + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "TokenExpiration", tokenExpiration)); + return S_OK; +} + +JsonValue ValidateEntityTokenRequest::ToJson() const +{ + return ValidateEntityTokenRequest::ToJson(this->Model()); +} + +JsonValue ValidateEntityTokenRequest::ToJson(const PFAuthenticationValidateEntityTokenRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "EntityToken", input.entityToken); + return output; +} + +HRESULT ValidateEntityTokenResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + std::optional identifiedDeviceType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdentifiedDeviceType", identifiedDeviceType)); + this->SetIdentifiedDeviceType(std::move(identifiedDeviceType)); + + std::optional identityProvider{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdentityProvider", identityProvider)); + this->SetIdentityProvider(std::move(identityProvider)); + + String identityProviderIssuedId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdentityProviderIssuedId", identityProviderIssuedId)); + this->SetIdentityProviderIssuedId(std::move(identityProviderIssuedId)); + + std::optional lineage{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Lineage", lineage)); + if (lineage) + { + this->SetLineage(std::move(*lineage)); + } + + return S_OK; +} + +size_t ValidateEntityTokenResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ValidateEntityTokenResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ValidateEntityTokenResponse::RequiredBufferSize(const PFAuthenticationValidateEntityTokenResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + if (model.identifiedDeviceType) + { + requiredSize += (alignof(PFAuthenticationIdentifiedDeviceType) + sizeof(PFAuthenticationIdentifiedDeviceType)); + } + if (model.identityProvider) + { + requiredSize += (alignof(PFLoginIdentityProvider) + sizeof(PFLoginIdentityProvider)); + } + if (model.identityProviderIssuedId) + { + requiredSize += (std::strlen(model.identityProviderIssuedId) + 1); + } + if (model.lineage) + { + requiredSize += EntityLineage::RequiredBufferSize(*model.lineage); + } + return requiredSize; +} + +HRESULT ValidateEntityTokenResponse::Copy(const PFAuthenticationValidateEntityTokenResponse& input, PFAuthenticationValidateEntityTokenResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.identifiedDeviceType); + RETURN_IF_FAILED(propCopyResult.hr); + output.identifiedDeviceType = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.identityProvider); + RETURN_IF_FAILED(propCopyResult.hr); + output.identityProvider = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.identityProviderIssuedId); + RETURN_IF_FAILED(propCopyResult.hr); + output.identityProviderIssuedId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lineage); + RETURN_IF_FAILED(propCopyResult.hr); + output.lineage = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Authentication +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/AuthenticationTypes.h b/Source/PlayFabCore/Source/Generated/AuthenticationTypes.h new file mode 100644 index 0000000..fd9b779 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/AuthenticationTypes.h @@ -0,0 +1,630 @@ +#pragma once + +#include +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Authentication +{ + +// Authentication Classes +class GetPhotonAuthenticationTokenRequest : public Wrappers::PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationGetPhotonAuthenticationTokenRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationGetPhotonAuthenticationTokenRequest& input); +}; + +class GetPhotonAuthenticationTokenResult : public Wrappers::PFAuthenticationGetPhotonAuthenticationTokenResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationGetPhotonAuthenticationTokenResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationGetPhotonAuthenticationTokenResult& model); + static HRESULT Copy(const PFAuthenticationGetPhotonAuthenticationTokenResult& input, PFAuthenticationGetPhotonAuthenticationTokenResult& output, ModelBuffer& buffer); +}; + +class GetTitlePublicKeyRequest : public Wrappers::PFAuthenticationGetTitlePublicKeyRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationGetTitlePublicKeyRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationGetTitlePublicKeyRequest& input); +}; + +class GetTitlePublicKeyResult : public Wrappers::PFAuthenticationGetTitlePublicKeyResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationGetTitlePublicKeyResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationGetTitlePublicKeyResult& model); + static HRESULT Copy(const PFAuthenticationGetTitlePublicKeyResult& input, PFAuthenticationGetTitlePublicKeyResult& output, ModelBuffer& buffer); +}; + +class LoginWithAndroidDeviceIDRequest : public Wrappers::PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithAndroidDeviceIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithAndroidDeviceIDRequest& input); +}; + +class UserSettings : public Wrappers::PFAuthenticationUserSettingsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationUserSettingsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationUserSettings& model); + static HRESULT Copy(const PFAuthenticationUserSettings& input, PFAuthenticationUserSettings& output, ModelBuffer& buffer); +}; + +class LoginResult : public Wrappers::PFAuthenticationLoginResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationLoginResult& model); + static HRESULT Copy(const PFAuthenticationLoginResult& input, PFAuthenticationLoginResult& output, ModelBuffer& buffer); +}; + +class LoginWithAppleRequest : public Wrappers::PFAuthenticationLoginWithAppleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithAppleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithAppleRequest& input); +}; + +class LoginWithCustomIDRequest : public Wrappers::PFAuthenticationLoginWithCustomIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithCustomIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithCustomIDRequest& input); +}; + +class LoginWithEmailAddressRequest : public Wrappers::PFAuthenticationLoginWithEmailAddressRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithEmailAddressRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithEmailAddressRequest& input); +}; + +class LoginWithFacebookRequest : public Wrappers::PFAuthenticationLoginWithFacebookRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithFacebookRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithFacebookRequest& input); +}; + +class LoginWithFacebookInstantGamesIdRequest : public Wrappers::PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithFacebookInstantGamesIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithFacebookInstantGamesIdRequest& input); +}; + +class LoginWithGameCenterRequest : public Wrappers::PFAuthenticationLoginWithGameCenterRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithGameCenterRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithGameCenterRequest& input); +}; + +class LoginWithGoogleAccountRequest : public Wrappers::PFAuthenticationLoginWithGoogleAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithGoogleAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithGoogleAccountRequest& input); +}; + +class LoginWithGooglePlayGamesServicesRequest : public Wrappers::PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithGooglePlayGamesServicesRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithGooglePlayGamesServicesRequest& input); +}; + +class LoginWithIOSDeviceIDRequest : public Wrappers::PFAuthenticationLoginWithIOSDeviceIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithIOSDeviceIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithIOSDeviceIDRequest& input); +}; + +class LoginWithKongregateRequest : public Wrappers::PFAuthenticationLoginWithKongregateRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithKongregateRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithKongregateRequest& input); +}; + +class LoginWithNintendoServiceAccountRequest : public Wrappers::PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithNintendoServiceAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithNintendoServiceAccountRequest& input); +}; + +class LoginWithNintendoSwitchDeviceIdRequest : public Wrappers::PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithNintendoSwitchDeviceIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest& input); +}; + +class LoginWithOpenIdConnectRequest : public Wrappers::PFAuthenticationLoginWithOpenIdConnectRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithOpenIdConnectRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithOpenIdConnectRequest& input); +}; + +class LoginWithPlayFabRequest : public Wrappers::PFAuthenticationLoginWithPlayFabRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithPlayFabRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithPlayFabRequest& input); +}; + +class LoginWithPSNRequest : public Wrappers::PFAuthenticationLoginWithPSNRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithPSNRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithPSNRequest& input); +}; + +class LoginWithSteamRequest : public Wrappers::PFAuthenticationLoginWithSteamRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithSteamRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithSteamRequest& input); +}; + +class LoginWithTwitchRequest : public Wrappers::PFAuthenticationLoginWithTwitchRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithTwitchRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithTwitchRequest& input); +}; + +class LoginWithXboxRequest : public Wrappers::PFAuthenticationLoginWithXboxRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithXboxRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithXboxRequest& input); +}; + +#if HC_PLATFORM == HC_PLATFORM_GDK +class LoginWithXUserRequest : public Wrappers::PFAuthenticationLoginWithXUserRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithXUserRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithXUserRequest& input); +}; +#endif + +class RegisterPlayFabUserRequest : public Wrappers::PFAuthenticationRegisterPlayFabUserRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationRegisterPlayFabUserRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationRegisterPlayFabUserRequest& input); +}; + +class RegisterPlayFabUserResult : public Wrappers::PFAuthenticationRegisterPlayFabUserResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationRegisterPlayFabUserResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationRegisterPlayFabUserResult& model); + static HRESULT Copy(const PFAuthenticationRegisterPlayFabUserResult& input, PFAuthenticationRegisterPlayFabUserResult& output, ModelBuffer& buffer); +}; + +class SetPlayerSecretRequest : public Wrappers::PFAuthenticationSetPlayerSecretRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationSetPlayerSecretRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationSetPlayerSecretRequest& input); +}; + +class LoginWithServerCustomIdRequest : public Wrappers::PFAuthenticationLoginWithServerCustomIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithServerCustomIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithServerCustomIdRequest& input); +}; + +class LoginWithSteamIdRequest : public Wrappers::PFAuthenticationLoginWithSteamIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithSteamIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithSteamIdRequest& input); +}; + +class ServerLoginWithXboxRequest : public Wrappers::PFAuthenticationServerLoginWithXboxRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationServerLoginWithXboxRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationServerLoginWithXboxRequest& input); +}; + +class LoginWithXboxIdRequest : public Wrappers::PFAuthenticationLoginWithXboxIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationLoginWithXboxIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationLoginWithXboxIdRequest& input); +}; + +#if HC_PLATFORM != HC_PLATFORM_GDK +class AuthenticateCustomIdRequest : public Wrappers::PFAuthenticationAuthenticateCustomIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationAuthenticateCustomIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationAuthenticateCustomIdRequest& input); +}; +#endif + +class EntityTokenResponse : public Wrappers::PFAuthenticationEntityTokenResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationEntityTokenResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationEntityTokenResponse& model); + static HRESULT Copy(const PFAuthenticationEntityTokenResponse& input, PFAuthenticationEntityTokenResponse& output, ModelBuffer& buffer); +}; + +#if HC_PLATFORM != HC_PLATFORM_GDK +class AuthenticateCustomIdResult : public Wrappers::PFAuthenticationAuthenticateCustomIdResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationAuthenticateCustomIdResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationAuthenticateCustomIdResult& model); + static HRESULT Copy(const PFAuthenticationAuthenticateCustomIdResult& input, PFAuthenticationAuthenticateCustomIdResult& output, ModelBuffer& buffer); +}; +#endif + +class DeleteRequest : public Wrappers::PFAuthenticationDeleteRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationDeleteRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationDeleteRequest& input); +}; + +class GetEntityRequest : public Wrappers::PFAuthenticationGetEntityRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationGetEntityRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationGetEntityRequest& input); +}; + +class GetEntityTokenResponse : public ServiceOutputModel +{ +public: + HRESULT FromJson(const JsonValue& input); + + std::optional entity; + String entityToken; + std::optional tokenExpiration; +}; + +class ValidateEntityTokenRequest : public Wrappers::PFAuthenticationValidateEntityTokenRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationValidateEntityTokenRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAuthenticationValidateEntityTokenRequest& input); +}; + +class ValidateEntityTokenResponse : public Wrappers::PFAuthenticationValidateEntityTokenResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAuthenticationValidateEntityTokenResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAuthenticationValidateEntityTokenResponse& model); + static HRESULT Copy(const PFAuthenticationValidateEntityTokenResponse& input, PFAuthenticationValidateEntityTokenResponse& output, ModelBuffer& buffer); +}; + +} // namespace Authentication +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/CacheId.h b/Source/PlayFabCore/Source/Generated/CacheId.h new file mode 100644 index 0000000..52d5681 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/CacheId.h @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +namespace PlayFab +{ + +/// +/// Internal cacheId used by libHttpClient for Retry-After caching +/// +enum class CacheId : uint32_t +{ + AuthenticationGetPhotonAuthenticationToken = 1001, + AuthenticationGetTitlePublicKey = 1002, + AuthenticationLoginWithAndroidDeviceID = 1003, + AuthenticationLoginWithApple = 1004, + AuthenticationLoginWithCustomID = 1005, + AuthenticationLoginWithEmailAddress = 1006, + AuthenticationLoginWithFacebook = 1007, + AuthenticationLoginWithFacebookInstantGamesId = 1008, + AuthenticationLoginWithGameCenter = 1009, + AuthenticationLoginWithGoogleAccount = 1010, + AuthenticationLoginWithGooglePlayGamesServices = 1011, + AuthenticationLoginWithIOSDeviceID = 1012, + AuthenticationLoginWithKongregate = 1013, + AuthenticationLoginWithNintendoServiceAccount = 1014, + AuthenticationLoginWithNintendoSwitchDeviceId = 1015, + AuthenticationLoginWithOpenIdConnect = 1016, + AuthenticationLoginWithPlayFab = 1017, + AuthenticationLoginWithPSN = 1018, + AuthenticationLoginWithSteam = 1019, + AuthenticationLoginWithTwitch = 1020, + AuthenticationLoginWithXbox = 1021, + AuthenticationRegisterPlayFabUser = 1022, + AuthenticationSetPlayerSecret = 1023, + AuthenticationServerLoginWithServerCustomId = 1024, + AuthenticationServerLoginWithSteamId = 1025, + AuthenticationServerLoginWithXbox = 1026, + AuthenticationServerLoginWithXboxId = 1027, + AuthenticationAuthenticateGameServerWithCustomId = 1028, + AuthenticationDelete = 1029, + AuthenticationGetEntity = 1030, + AuthenticationGetEntityWithSecretKey = 1031, + AuthenticationValidateEntityToken = 1032, + EventsCreateTelemetryKey = 1033, + EventsDeleteTelemetryKey = 1034, + EventsGetTelemetryKey = 1035, + EventsListTelemetryKeys = 1036, + EventsSetTelemetryKeyActive = 1037, + EventsWriteEvents = 1038, + EventsWriteTelemetryEvents = 1039, +}; + +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/Events.cpp b/Source/PlayFabCore/Source/Generated/Events.cpp new file mode 100644 index 0000000..32e4ada --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/Events.cpp @@ -0,0 +1,264 @@ +#include "stdafx.h" +#include "Events.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Events +{ + + +AsyncOp EventsAPI::CreateTelemetryKey( + SharedPtr entity, + const CreateTelemetryKeyRequest& request, + RunContext rc +) +{ + const char* path{ "/Event/CreateTelemetryKey" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::EventsCreateTelemetryKey; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + CreateTelemetryKeyResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp EventsAPI::DeleteTelemetryKey( + SharedPtr entity, + const DeleteTelemetryKeyRequest& request, + RunContext rc +) +{ + const char* path{ "/Event/DeleteTelemetryKey" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::EventsDeleteTelemetryKey; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + DeleteTelemetryKeyResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp EventsAPI::GetTelemetryKey( + SharedPtr entity, + const GetTelemetryKeyRequest& request, + RunContext rc +) +{ + const char* path{ "/Event/GetTelemetryKey" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::EventsGetTelemetryKey; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTelemetryKeyResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp EventsAPI::ListTelemetryKeys( + SharedPtr entity, + const ListTelemetryKeysRequest& request, + RunContext rc +) +{ + const char* path{ "/Event/ListTelemetryKeys" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::EventsListTelemetryKeys; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListTelemetryKeysResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp EventsAPI::SetTelemetryKeyActive( + SharedPtr entity, + const SetTelemetryKeyActiveRequest& request, + RunContext rc +) +{ + const char* path{ "/Event/SetTelemetryKeyActive" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::EventsSetTelemetryKeyActive; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + SetTelemetryKeyActiveResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp EventsAPI::WriteEvents( + SharedPtr entity, + const WriteEventsRequest& request, + RunContext rc +) +{ + const char* path{ "/Event/WriteEvents" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::EventsWriteEvents; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + WriteEventsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp EventsAPI::WriteTelemetryEvents( + SharedPtr entity, + const WriteEventsRequest& request, + RunContext rc +) +{ + const char* path{ "/Event/WriteTelemetryEvents" }; + JsonValue requestBody{ request.ToJson() }; + CacheId retryCacheId = CacheId::EventsWriteTelemetryEvents; + + auto requestOp = entity->ServiceConfig()->HttpClient()->MakeEntityRequest( + entity, + path, + requestBody, + retryCacheId, + rc.Derive() + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + WriteEventsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Events +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/Events.h b/Source/PlayFabCore/Source/Generated/Events.h new file mode 100644 index 0000000..0d54e2b --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/Events.h @@ -0,0 +1,31 @@ +#pragma once + +#include "EventsTypes.h" +#include "Common/Entity.h" +#include "Common/GlobalState.h" + +namespace PlayFab +{ +namespace Events +{ + +class EventsAPI +{ +public: + EventsAPI() = delete; + EventsAPI(const EventsAPI& source) = delete; + EventsAPI& operator=(const EventsAPI& source) = delete; + ~EventsAPI() = default; + + // ------------ Generated API calls + static AsyncOp CreateTelemetryKey(SharedPtr entity, const CreateTelemetryKeyRequest& request, RunContext rc); + static AsyncOp DeleteTelemetryKey(SharedPtr entity, const DeleteTelemetryKeyRequest& request, RunContext rc); + static AsyncOp GetTelemetryKey(SharedPtr entity, const GetTelemetryKeyRequest& request, RunContext rc); + static AsyncOp ListTelemetryKeys(SharedPtr entity, const ListTelemetryKeysRequest& request, RunContext rc); + static AsyncOp SetTelemetryKeyActive(SharedPtr entity, const SetTelemetryKeyActiveRequest& request, RunContext rc); + static AsyncOp WriteEvents(SharedPtr entity, const WriteEventsRequest& request, RunContext rc); + static AsyncOp WriteTelemetryEvents(SharedPtr entity, const WriteEventsRequest& request, RunContext rc); +}; + +} // namespace Events +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/EventsTypes.cpp b/Source/PlayFabCore/Source/Generated/EventsTypes.cpp new file mode 100644 index 0000000..dc2e5a0 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/EventsTypes.cpp @@ -0,0 +1,415 @@ +#include "stdafx.h" +#include "EventsTypes.h" +#include "JsonUtils.h" + +namespace PlayFab +{ +namespace Events +{ + +JsonValue CreateTelemetryKeyRequest::ToJson() const +{ + return CreateTelemetryKeyRequest::ToJson(this->Model()); +} + +JsonValue CreateTelemetryKeyRequest::ToJson(const PFEventsCreateTelemetryKeyRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "KeyName", input.keyName); + return output; +} + +HRESULT TelemetryKeyDetails::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "CreateTime", this->m_model.createTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsActive", this->m_model.isActive)); + + String keyValue{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KeyValue", keyValue)); + this->SetKeyValue(std::move(keyValue)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastUpdateTime", this->m_model.lastUpdateTime)); + + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + return S_OK; +} + +size_t TelemetryKeyDetails::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TelemetryKeyDetails::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TelemetryKeyDetails::RequiredBufferSize(const PFEventsTelemetryKeyDetails& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.keyValue) + { + requiredSize += (std::strlen(model.keyValue) + 1); + } + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + return requiredSize; +} + +HRESULT TelemetryKeyDetails::Copy(const PFEventsTelemetryKeyDetails& input, PFEventsTelemetryKeyDetails& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.keyValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.keyValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT CreateTelemetryKeyResponse::FromJson(const JsonValue& input) +{ + std::optional newKeyDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NewKeyDetails", newKeyDetails)); + if (newKeyDetails) + { + this->SetNewKeyDetails(std::move(*newKeyDetails)); + } + + return S_OK; +} + +size_t CreateTelemetryKeyResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CreateTelemetryKeyResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CreateTelemetryKeyResponse::RequiredBufferSize(const PFEventsCreateTelemetryKeyResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.newKeyDetails) + { + requiredSize += TelemetryKeyDetails::RequiredBufferSize(*model.newKeyDetails); + } + return requiredSize; +} + +HRESULT CreateTelemetryKeyResponse::Copy(const PFEventsCreateTelemetryKeyResponse& input, PFEventsCreateTelemetryKeyResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.newKeyDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.newKeyDetails = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeleteTelemetryKeyRequest::ToJson() const +{ + return DeleteTelemetryKeyRequest::ToJson(this->Model()); +} + +JsonValue DeleteTelemetryKeyRequest::ToJson(const PFEventsDeleteTelemetryKeyRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "KeyName", input.keyName); + return output; +} + +HRESULT DeleteTelemetryKeyResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "WasKeyDeleted", this->m_model.wasKeyDeleted)); + + return S_OK; +} + +size_t DeleteTelemetryKeyResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DeleteTelemetryKeyResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DeleteTelemetryKeyResponse::RequiredBufferSize(const PFEventsDeleteTelemetryKeyResponse& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT DeleteTelemetryKeyResponse::Copy(const PFEventsDeleteTelemetryKeyResponse& input, PFEventsDeleteTelemetryKeyResponse& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +JsonValue GetTelemetryKeyRequest::ToJson() const +{ + return GetTelemetryKeyRequest::ToJson(this->Model()); +} + +JsonValue GetTelemetryKeyRequest::ToJson(const PFEventsGetTelemetryKeyRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "KeyName", input.keyName); + return output; +} + +HRESULT GetTelemetryKeyResponse::FromJson(const JsonValue& input) +{ + std::optional keyDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KeyDetails", keyDetails)); + if (keyDetails) + { + this->SetKeyDetails(std::move(*keyDetails)); + } + + return S_OK; +} + +size_t GetTelemetryKeyResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTelemetryKeyResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTelemetryKeyResponse::RequiredBufferSize(const PFEventsGetTelemetryKeyResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.keyDetails) + { + requiredSize += TelemetryKeyDetails::RequiredBufferSize(*model.keyDetails); + } + return requiredSize; +} + +HRESULT GetTelemetryKeyResponse::Copy(const PFEventsGetTelemetryKeyResponse& input, PFEventsGetTelemetryKeyResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.keyDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.keyDetails = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListTelemetryKeysRequest::ToJson() const +{ + return ListTelemetryKeysRequest::ToJson(this->Model()); +} + +JsonValue ListTelemetryKeysRequest::ToJson(const PFEventsListTelemetryKeysRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT ListTelemetryKeysResponse::FromJson(const JsonValue& input) +{ + ModelVector keyDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KeyDetails", keyDetails)); + this->SetKeyDetails(std::move(keyDetails)); + + return S_OK; +} + +size_t ListTelemetryKeysResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListTelemetryKeysResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListTelemetryKeysResponse::RequiredBufferSize(const PFEventsListTelemetryKeysResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFEventsTelemetryKeyDetails*) + sizeof(PFEventsTelemetryKeyDetails*) * model.keyDetailsCount); + for (size_t i = 0; i < model.keyDetailsCount; ++i) + { + requiredSize += TelemetryKeyDetails::RequiredBufferSize(*model.keyDetails[i]); + } + return requiredSize; +} + +HRESULT ListTelemetryKeysResponse::Copy(const PFEventsListTelemetryKeysResponse& input, PFEventsListTelemetryKeysResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.keyDetails, input.keyDetailsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.keyDetails = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SetTelemetryKeyActiveRequest::ToJson() const +{ + return SetTelemetryKeyActiveRequest::ToJson(this->Model()); +} + +JsonValue SetTelemetryKeyActiveRequest::ToJson(const PFEventsSetTelemetryKeyActiveRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Active", input.active); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "KeyName", input.keyName); + return output; +} + +HRESULT SetTelemetryKeyActiveResponse::FromJson(const JsonValue& input) +{ + std::optional keyDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KeyDetails", keyDetails)); + if (keyDetails) + { + this->SetKeyDetails(std::move(*keyDetails)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "WasKeyUpdated", this->m_model.wasKeyUpdated)); + + return S_OK; +} + +size_t SetTelemetryKeyActiveResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SetTelemetryKeyActiveResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SetTelemetryKeyActiveResponse::RequiredBufferSize(const PFEventsSetTelemetryKeyActiveResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.keyDetails) + { + requiredSize += TelemetryKeyDetails::RequiredBufferSize(*model.keyDetails); + } + return requiredSize; +} + +HRESULT SetTelemetryKeyActiveResponse::Copy(const PFEventsSetTelemetryKeyActiveResponse& input, PFEventsSetTelemetryKeyActiveResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.keyDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.keyDetails = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue EventContents::ToJson() const +{ + return EventContents::ToJson(this->Model()); +} + +JsonValue EventContents::ToJson(const PFEventsEventContents& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "EventNamespace", input.eventNamespace); + JsonUtils::ObjectAddMember(output, "Name", input.name); + JsonUtils::ObjectAddMember(output, "OriginalId", input.originalId); + JsonUtils::ObjectAddMemberTime(output, "OriginalTimestamp", input.originalTimestamp); + JsonUtils::ObjectAddMember(output, "Payload", input.payload); + JsonUtils::ObjectAddMember(output, "PayloadJSON", input.payloadJSON); + return output; +} + +JsonValue WriteEventsRequest::ToJson() const +{ + return WriteEventsRequest::ToJson(this->Model()); +} + +JsonValue WriteEventsRequest::ToJson(const PFEventsWriteEventsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberArray(output, "Events", input.events, input.eventsCount); + return output; +} + +HRESULT WriteEventsResponse::FromJson(const JsonValue& input) +{ + CStringVector assignedEventIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AssignedEventIds", assignedEventIds)); + this->SetAssignedEventIds(std::move(assignedEventIds)); + + return S_OK; +} + +size_t WriteEventsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result WriteEventsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t WriteEventsResponse::RequiredBufferSize(const PFEventsWriteEventsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.assignedEventIdsCount); + for (size_t i = 0; i < model.assignedEventIdsCount; ++i) + { + requiredSize += (std::strlen(model.assignedEventIds[i]) + 1); + } + return requiredSize; +} + +HRESULT WriteEventsResponse::Copy(const PFEventsWriteEventsResponse& input, PFEventsWriteEventsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.assignedEventIds, input.assignedEventIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.assignedEventIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Events +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/EventsTypes.h b/Source/PlayFabCore/Source/Generated/EventsTypes.h new file mode 100644 index 0000000..53f0b78 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/EventsTypes.h @@ -0,0 +1,245 @@ +#pragma once + +#include +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Events +{ + +// Events Classes +class CreateTelemetryKeyRequest : public Wrappers::PFEventsCreateTelemetryKeyRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsCreateTelemetryKeyRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEventsCreateTelemetryKeyRequest& input); +}; + +class TelemetryKeyDetails : public Wrappers::PFEventsTelemetryKeyDetailsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsTelemetryKeyDetailsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEventsTelemetryKeyDetails& model); + static HRESULT Copy(const PFEventsTelemetryKeyDetails& input, PFEventsTelemetryKeyDetails& output, ModelBuffer& buffer); +}; + +class CreateTelemetryKeyResponse : public Wrappers::PFEventsCreateTelemetryKeyResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsCreateTelemetryKeyResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEventsCreateTelemetryKeyResponse& model); + static HRESULT Copy(const PFEventsCreateTelemetryKeyResponse& input, PFEventsCreateTelemetryKeyResponse& output, ModelBuffer& buffer); +}; + +class DeleteTelemetryKeyRequest : public Wrappers::PFEventsDeleteTelemetryKeyRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsDeleteTelemetryKeyRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEventsDeleteTelemetryKeyRequest& input); +}; + +class DeleteTelemetryKeyResponse : public Wrappers::PFEventsDeleteTelemetryKeyResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsDeleteTelemetryKeyResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEventsDeleteTelemetryKeyResponse& model); + static HRESULT Copy(const PFEventsDeleteTelemetryKeyResponse& input, PFEventsDeleteTelemetryKeyResponse& output, ModelBuffer& buffer); +}; + +class GetTelemetryKeyRequest : public Wrappers::PFEventsGetTelemetryKeyRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsGetTelemetryKeyRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEventsGetTelemetryKeyRequest& input); +}; + +class GetTelemetryKeyResponse : public Wrappers::PFEventsGetTelemetryKeyResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsGetTelemetryKeyResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEventsGetTelemetryKeyResponse& model); + static HRESULT Copy(const PFEventsGetTelemetryKeyResponse& input, PFEventsGetTelemetryKeyResponse& output, ModelBuffer& buffer); +}; + +class ListTelemetryKeysRequest : public Wrappers::PFEventsListTelemetryKeysRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsListTelemetryKeysRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEventsListTelemetryKeysRequest& input); +}; + +class ListTelemetryKeysResponse : public Wrappers::PFEventsListTelemetryKeysResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsListTelemetryKeysResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEventsListTelemetryKeysResponse& model); + static HRESULT Copy(const PFEventsListTelemetryKeysResponse& input, PFEventsListTelemetryKeysResponse& output, ModelBuffer& buffer); +}; + +class SetTelemetryKeyActiveRequest : public Wrappers::PFEventsSetTelemetryKeyActiveRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsSetTelemetryKeyActiveRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEventsSetTelemetryKeyActiveRequest& input); +}; + +class SetTelemetryKeyActiveResponse : public Wrappers::PFEventsSetTelemetryKeyActiveResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsSetTelemetryKeyActiveResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEventsSetTelemetryKeyActiveResponse& model); + static HRESULT Copy(const PFEventsSetTelemetryKeyActiveResponse& input, PFEventsSetTelemetryKeyActiveResponse& output, ModelBuffer& buffer); +}; + +class EventContents : public Wrappers::PFEventsEventContentsWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsEventContentsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEventsEventContents& input); +}; + +class WriteEventsRequest : public Wrappers::PFEventsWriteEventsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsWriteEventsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEventsWriteEventsRequest& input); +}; + +class WriteEventsResponse : public Wrappers::PFEventsWriteEventsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEventsWriteEventsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEventsWriteEventsResponse& model); + static HRESULT Copy(const PFEventsWriteEventsResponse& input, PFEventsWriteEventsResponse& output, ModelBuffer& buffer); +}; + +} // namespace Events +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/PFAuthentication.cpp b/Source/PlayFabCore/Source/Generated/PFAuthentication.cpp new file mode 100644 index 0000000..53443e1 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/PFAuthentication.cpp @@ -0,0 +1,1926 @@ +#include "stdafx.h" +#include +#include "Authentication.h" +#include "ApiXAsyncProvider.h" +#include "ApiHelpers.h" +#include "Authentication/GetEntityAsyncProvider.h" + +using namespace PlayFab; +using namespace PlayFab::Authentication; + +HRESULT PFAuthenticationLoginGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + + Vector tempBuffer; + if (!bufferSize || !buffer) + { + // The buffer for the extended LoginResult is optional, but we report the result size to XAsync when the async + // call completes (not when the client requests the result). XAsyncGetResult requires the specified buffer size + // so create and pass it a temporary one if the client didn't provide one + + RETURN_HR_IF(E_INVALIDARG, result); + RETURN_IF_FAILED(XAsyncGetResultSize(async, &bufferSize)); + tempBuffer.resize(bufferSize); + buffer = tempBuffer.data(); + } + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + PFCombinedLoginResult* combinedLoginResult = reinterpret_cast(buffer); + *entityHandle = combinedLoginResult->entityHandle; + + if (result) + { + *result = combinedLoginResult->loginResult; + } + + return S_OK; +} + +HRESULT PFAuthenticationServerLoginGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityTokenResponse); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + PFServerCombinedLoginResult* combinedLoginResult = reinterpret_cast(buffer); + *entityTokenResponse = combinedLoginResult->entityTokenResponse; + + if (result) + { + *result = combinedLoginResult->loginResult; + } + + return S_OK; +} + +#if 0 +PF_API PFAuthenticationGetPhotonAuthenticationTokenAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationGetPhotonAuthenticationTokenRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetPhotonAuthenticationTokenAsync), + std::bind(&AuthenticationAPI::GetPhotonAuthenticationToken, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetPhotonAuthenticationTokenGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationGetPhotonAuthenticationTokenGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationGetPhotonAuthenticationTokenResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAuthenticationGetTitlePublicKeyAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationGetTitlePublicKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetTitlePublicKeyAsync), + std::bind(&AuthenticationAPI::GetTitlePublicKey, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetTitlePublicKeyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationGetTitlePublicKeyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationGetTitlePublicKeyResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithAndroidDeviceIDAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithAndroidDeviceIDAsync), + std::bind(&AuthenticationAPI::LoginWithAndroidDeviceID, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithAndroidDeviceIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithAndroidDeviceIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithAndroidDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithAndroidDeviceID, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithAppleAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithAppleAsync), + std::bind(&AuthenticationAPI::LoginWithApple, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithAppleGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithAppleGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithAppleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithApple, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAuthenticationLoginWithCustomIDAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithCustomIDAsync), + std::bind(&AuthenticationAPI::LoginWithCustomID, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithCustomIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithCustomIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithCustomIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithCustomID, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFAuthenticationLoginWithEmailAddressAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithEmailAddressRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithEmailAddressAsync), + std::bind(&AuthenticationAPI::LoginWithEmailAddress, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithEmailAddressGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithEmailAddressGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithEmailAddressAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithEmailAddressRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithEmailAddress, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithFacebookAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithFacebookRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithFacebookAsync), + std::bind(&AuthenticationAPI::LoginWithFacebook, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithFacebookGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithFacebookGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithFacebookAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithFacebookRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithFacebook, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithFacebookInstantGamesIdAsync), + std::bind(&AuthenticationAPI::LoginWithFacebookInstantGamesId, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithFacebookInstantGamesIdGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithFacebookInstantGamesIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithFacebookInstantGamesId, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithGameCenterAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithGameCenterRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithGameCenterAsync), + std::bind(&AuthenticationAPI::LoginWithGameCenter, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithGameCenterGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithGameCenterGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithGameCenterAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGameCenterRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithGameCenter, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithGoogleAccountAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithGoogleAccountAsync), + std::bind(&AuthenticationAPI::LoginWithGoogleAccount, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithGoogleAccountGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithGoogleAccountGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithGoogleAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithGoogleAccount, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithGooglePlayGamesServicesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithGooglePlayGamesServicesAsync), + std::bind(&AuthenticationAPI::LoginWithGooglePlayGamesServices, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithGooglePlayGamesServicesGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithGooglePlayGamesServicesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithGooglePlayGamesServicesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithGooglePlayGamesServices, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithIOSDeviceIDAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithIOSDeviceIDAsync), + std::bind(&AuthenticationAPI::LoginWithIOSDeviceID, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithIOSDeviceIDGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithIOSDeviceIDGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithIOSDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithIOSDeviceID, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithKongregateAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithKongregateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithKongregateAsync), + std::bind(&AuthenticationAPI::LoginWithKongregate, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithKongregateGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithKongregateGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithKongregateAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithKongregateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithKongregate, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +PF_API PFAuthenticationLoginWithNintendoServiceAccountAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithNintendoServiceAccountAsync), + std::bind(&AuthenticationAPI::LoginWithNintendoServiceAccount, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithNintendoServiceAccountGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithNintendoServiceAccountGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithNintendoServiceAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithNintendoServiceAccount, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithNintendoSwitchDeviceIdAsync), + std::bind(&AuthenticationAPI::LoginWithNintendoSwitchDeviceId, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithNintendoSwitchDeviceIdGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithNintendoSwitchDeviceId, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAuthenticationLoginWithOpenIdConnectAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithOpenIdConnectAsync), + std::bind(&AuthenticationAPI::LoginWithOpenIdConnect, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithOpenIdConnectGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithOpenIdConnectGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithOpenIdConnectAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithOpenIdConnect, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFAuthenticationLoginWithPlayFabAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithPlayFabRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithPlayFabAsync), + std::bind(&AuthenticationAPI::LoginWithPlayFab, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithPlayFabGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithPlayFabGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithPlayFabAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithPlayFabRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithPlayFab, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFAuthenticationLoginWithPSNAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithPSNRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithPSNAsync), + std::bind(&AuthenticationAPI::LoginWithPSN, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithPSNGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithPSNGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithPSNAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithPSNRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithPSN, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +PF_API PFAuthenticationLoginWithSteamAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithSteamRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithSteamAsync), + std::bind(&AuthenticationAPI::LoginWithSteam, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithSteamGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithSteamGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithSteamAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithSteamRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithSteam, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationLoginWithTwitchAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithTwitchRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithTwitchAsync), + std::bind(&AuthenticationAPI::LoginWithTwitch, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithTwitchGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithTwitchGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithTwitchAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithTwitchRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithTwitch, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +PF_API PFAuthenticationLoginWithXboxAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithXboxAsync), + std::bind(&AuthenticationAPI::LoginWithXbox, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithXboxGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithXboxGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithXboxAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithXbox, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFAuthenticationLoginWithXUserAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationLoginWithXUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationLoginWithXUserAsync), + std::bind(&AuthenticationAPI::LoginWithXUser, state, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationLoginWithXUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationLoginWithXUserGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* entityHandle, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationLoginGetResult(async, entityHandle, bufferSize, buffer, result, bufferUsed); +} + +PF_API PFAuthenticationReLoginWithXUserAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAuthenticationLoginWithXUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(entityHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr entity; + RETURN_IF_FAILED(state->Entities().FromHandle(entityHandle, entity)); + + auto provider = MakeProvider(state->RunContext().DeriveOnQueue(async->queue), async, __FUNCTION__, std::bind(&AuthenticationAPI::ReLoginWithXUser, std::move(entity), *request, std::placeholders::_1)); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationRegisterPlayFabUserAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAuthenticationRegisterPlayFabUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationRegisterPlayFabUserAsync), + std::bind(&AuthenticationAPI::RegisterPlayFabUser, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationRegisterPlayFabUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationRegisterPlayFabUserGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationRegisterPlayFabUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAuthenticationSetPlayerSecretAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationSetPlayerSecretRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationSetPlayerSecretAsync), + std::bind(&AuthenticationAPI::SetPlayerSecret, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationServerLoginWithServerCustomIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithServerCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithServerCustomIdAsync), + std::bind(&AuthenticationAPI::ServerLoginWithServerCustomId, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithServerCustomIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithServerCustomIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if 0 +PF_API PFAuthenticationServerLoginWithSteamIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithSteamIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithSteamIdAsync), + std::bind(&AuthenticationAPI::ServerLoginWithSteamId, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithSteamIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithSteamIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if 0 +PF_API PFAuthenticationServerLoginWithXboxAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationServerLoginWithXboxRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithXboxAsync), + std::bind(&AuthenticationAPI::ServerLoginWithXbox, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithXboxGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithXboxGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if 0 +PF_API PFAuthenticationServerLoginWithXboxIdAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationLoginWithXboxIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationServerLoginWithXboxIdAsync), + std::bind(&AuthenticationAPI::ServerLoginWithXboxId, state, std::move(context), secretKey, *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationServerLoginWithXboxIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationServerLoginWithXboxIdGetResult( + _Inout_ XAsyncBlock* async, + _Outptr_ PFAuthenticationEntityTokenResponse const** entityTokenResponse, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_opt_ PFAuthenticationLoginResult const** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return PFAuthenticationServerLoginGetResult(async, entityTokenResponse, bufferSize, buffer, result, bufferUsed); +} +#endif + +#if 0 +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationAuthenticateCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationAuthenticateGameServerWithCustomIdAsync), + std::bind(&AuthenticationAPI::AuthenticateGameServerWithCustomId, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationAuthenticateGameServerWithCustomIdGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationAuthenticateCustomIdResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAuthenticationDeleteAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationDeleteRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationDeleteAsync), + std::bind(&AuthenticationAPI::Delete, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAuthenticationGetEntityAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationGetEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeGetEntityProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetEntityAsync), + std::bind(&AuthenticationAPI::GetEntity, state, std::move(context), *request, std::placeholders::_1), + state + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetEntityGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFEntityHandle), result, nullptr); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +PF_API PFAuthenticationGetEntityWithSecretKeyAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_z_ const char* secretKey, + _In_ const PFAuthenticationGetEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->ServiceConfigs().FromHandle(contextHandle, context)); + + auto provider = MakeGetEntityProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationGetEntityWithSecretKeyAsync), + std::bind(&AuthenticationAPI::GetEntityWithSecretKey, state, std::move(context), secretKey, *request, std::placeholders::_1), + state + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationGetEntityWithSecretKeyGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEntityHandle* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFEntityHandle), result, nullptr); +} +#endif + +#if 0 +PF_API PFAuthenticationValidateEntityTokenAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAuthenticationValidateEntityTokenRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAuthenticationValidateEntityTokenAsync), + std::bind(&AuthenticationAPI::ValidateEntityToken, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAuthenticationValidateEntityTokenGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAuthenticationValidateEntityTokenGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAuthenticationValidateEntityTokenResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + diff --git a/Source/PlayFabCore/Source/Generated/PFEvents.cpp b/Source/PlayFabCore/Source/Generated/PFEvents.cpp new file mode 100644 index 0000000..7249b52 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/PFEvents.cpp @@ -0,0 +1,339 @@ +#include "stdafx.h" +#include +#include "Events.h" +#include "ApiXAsyncProvider.h" +#include "ApiHelpers.h" + +using namespace PlayFab; +using namespace PlayFab::Events; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFEventsCreateTelemetryKeyAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsCreateTelemetryKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsCreateTelemetryKeyAsync), + std::bind(&EventsAPI::CreateTelemetryKey, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsCreateTelemetryKeyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsCreateTelemetryKeyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsCreateTelemetryKeyResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFEventsDeleteTelemetryKeyAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsDeleteTelemetryKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsDeleteTelemetryKeyAsync), + std::bind(&EventsAPI::DeleteTelemetryKey, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsDeleteTelemetryKeyGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFEventsDeleteTelemetryKeyResponse* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFEventsDeleteTelemetryKeyResponse), result, nullptr); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFEventsGetTelemetryKeyAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsGetTelemetryKeyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsGetTelemetryKeyAsync), + std::bind(&EventsAPI::GetTelemetryKey, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsGetTelemetryKeyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsGetTelemetryKeyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsGetTelemetryKeyResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFEventsListTelemetryKeysAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsListTelemetryKeysRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsListTelemetryKeysAsync), + std::bind(&EventsAPI::ListTelemetryKeys, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsListTelemetryKeysGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsListTelemetryKeysGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsListTelemetryKeysResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFEventsSetTelemetryKeyActiveAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsSetTelemetryKeyActiveRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsSetTelemetryKeyActiveAsync), + std::bind(&EventsAPI::SetTelemetryKeyActive, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsSetTelemetryKeyActiveGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsSetTelemetryKeyActiveGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsSetTelemetryKeyActiveResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +PF_API PFEventsWriteEventsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsWriteEventsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsWriteEventsAsync), + std::bind(&EventsAPI::WriteEvents, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsWriteEventsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsWriteEventsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsWriteEventsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFEventsWriteTelemetryEventsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFEventsWriteEventsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(contextHandle); + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + SharedPtr context; + RETURN_IF_FAILED(state->Entities().FromHandle(contextHandle, context)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFEventsWriteTelemetryEventsAsync), + std::bind(&EventsAPI::WriteTelemetryEvents, std::move(context), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFEventsWriteTelemetryEventsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFEventsWriteTelemetryEventsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFEventsWriteEventsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabCore/Source/Generated/Types.cpp b/Source/PlayFabCore/Source/Generated/Types.cpp new file mode 100644 index 0000000..d33c9d2 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/Types.cpp @@ -0,0 +1,3549 @@ +#include "stdafx.h" +#include "Types.h" +#include "JsonUtils.h" + +namespace PlayFab +{ + +JsonValue PlayerProfileViewConstraints::ToJson() const +{ + return PlayerProfileViewConstraints::ToJson(this->Model()); +} + +JsonValue PlayerProfileViewConstraints::ToJson(const PFPlayerProfileViewConstraints& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ShowAvatarUrl", input.showAvatarUrl); + JsonUtils::ObjectAddMember(output, "ShowBannedUntil", input.showBannedUntil); + JsonUtils::ObjectAddMember(output, "ShowCampaignAttributions", input.showCampaignAttributions); + JsonUtils::ObjectAddMember(output, "ShowContactEmailAddresses", input.showContactEmailAddresses); + JsonUtils::ObjectAddMember(output, "ShowCreated", input.showCreated); + JsonUtils::ObjectAddMember(output, "ShowDisplayName", input.showDisplayName); + JsonUtils::ObjectAddMember(output, "ShowExperimentVariants", input.showExperimentVariants); + JsonUtils::ObjectAddMember(output, "ShowLastLogin", input.showLastLogin); + JsonUtils::ObjectAddMember(output, "ShowLinkedAccounts", input.showLinkedAccounts); + JsonUtils::ObjectAddMember(output, "ShowLocations", input.showLocations); + JsonUtils::ObjectAddMember(output, "ShowMemberships", input.showMemberships); + JsonUtils::ObjectAddMember(output, "ShowOrigination", input.showOrigination); + JsonUtils::ObjectAddMember(output, "ShowPushNotificationRegistrations", input.showPushNotificationRegistrations); + JsonUtils::ObjectAddMember(output, "ShowStatistics", input.showStatistics); + JsonUtils::ObjectAddMember(output, "ShowTags", input.showTags); + JsonUtils::ObjectAddMember(output, "ShowTotalValueToDateInUsd", input.showTotalValueToDateInUsd); + JsonUtils::ObjectAddMember(output, "ShowValuesToDate", input.showValuesToDate); + return output; +} + +JsonValue GetPlayerCombinedInfoRequestParams::ToJson() const +{ + return GetPlayerCombinedInfoRequestParams::ToJson(this->Model()); +} + +JsonValue GetPlayerCombinedInfoRequestParams::ToJson(const PFGetPlayerCombinedInfoRequestParams& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "GetCharacterInventories", input.getCharacterInventories); + JsonUtils::ObjectAddMember(output, "GetCharacterList", input.getCharacterList); + JsonUtils::ObjectAddMember(output, "GetPlayerProfile", input.getPlayerProfile); + JsonUtils::ObjectAddMember(output, "GetPlayerStatistics", input.getPlayerStatistics); + JsonUtils::ObjectAddMember(output, "GetTitleData", input.getTitleData); + JsonUtils::ObjectAddMember(output, "GetUserAccountInfo", input.getUserAccountInfo); + JsonUtils::ObjectAddMember(output, "GetUserData", input.getUserData); + JsonUtils::ObjectAddMember(output, "GetUserInventory", input.getUserInventory); + JsonUtils::ObjectAddMember(output, "GetUserReadOnlyData", input.getUserReadOnlyData); + JsonUtils::ObjectAddMember(output, "GetUserVirtualCurrency", input.getUserVirtualCurrency); + JsonUtils::ObjectAddMemberArray(output, "PlayerStatisticNames", input.playerStatisticNames, input.playerStatisticNamesCount); + JsonUtils::ObjectAddMember(output, "ProfileConstraints", input.profileConstraints); + JsonUtils::ObjectAddMemberArray(output, "TitleDataKeys", input.titleDataKeys, input.titleDataKeysCount); + JsonUtils::ObjectAddMemberArray(output, "UserDataKeys", input.userDataKeys, input.userDataKeysCount); + JsonUtils::ObjectAddMemberArray(output, "UserReadOnlyDataKeys", input.userReadOnlyDataKeys, input.userReadOnlyDataKeysCount); + return output; +} + +HRESULT UserAndroidDeviceInfo::FromJson(const JsonValue& input) +{ + String androidDeviceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AndroidDeviceId", androidDeviceId)); + this->SetAndroidDeviceId(std::move(androidDeviceId)); + + return S_OK; +} + +size_t UserAndroidDeviceInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserAndroidDeviceInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserAndroidDeviceInfo::RequiredBufferSize(const PFUserAndroidDeviceInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.androidDeviceId) + { + requiredSize += (std::strlen(model.androidDeviceId) + 1); + } + return requiredSize; +} + +HRESULT UserAndroidDeviceInfo::Copy(const PFUserAndroidDeviceInfo& input, PFUserAndroidDeviceInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.androidDeviceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.androidDeviceId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserAppleIdInfo::FromJson(const JsonValue& input) +{ + String appleSubjectId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AppleSubjectId", appleSubjectId)); + this->SetAppleSubjectId(std::move(appleSubjectId)); + + return S_OK; +} + +size_t UserAppleIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserAppleIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserAppleIdInfo::RequiredBufferSize(const PFUserAppleIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.appleSubjectId) + { + requiredSize += (std::strlen(model.appleSubjectId) + 1); + } + return requiredSize; +} + +HRESULT UserAppleIdInfo::Copy(const PFUserAppleIdInfo& input, PFUserAppleIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.appleSubjectId); + RETURN_IF_FAILED(propCopyResult.hr); + output.appleSubjectId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserCustomIdInfo::FromJson(const JsonValue& input) +{ + String customId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CustomId", customId)); + this->SetCustomId(std::move(customId)); + + return S_OK; +} + +size_t UserCustomIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserCustomIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserCustomIdInfo::RequiredBufferSize(const PFUserCustomIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.customId) + { + requiredSize += (std::strlen(model.customId) + 1); + } + return requiredSize; +} + +HRESULT UserCustomIdInfo::Copy(const PFUserCustomIdInfo& input, PFUserCustomIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.customId); + RETURN_IF_FAILED(propCopyResult.hr); + output.customId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserFacebookInfo::FromJson(const JsonValue& input) +{ + String facebookId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookId", facebookId)); + this->SetFacebookId(std::move(facebookId)); + + String fullName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FullName", fullName)); + this->SetFullName(std::move(fullName)); + + return S_OK; +} + +size_t UserFacebookInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserFacebookInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserFacebookInfo::RequiredBufferSize(const PFUserFacebookInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.facebookId) + { + requiredSize += (std::strlen(model.facebookId) + 1); + } + if (model.fullName) + { + requiredSize += (std::strlen(model.fullName) + 1); + } + return requiredSize; +} + +HRESULT UserFacebookInfo::Copy(const PFUserFacebookInfo& input, PFUserFacebookInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.facebookId); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.fullName); + RETURN_IF_FAILED(propCopyResult.hr); + output.fullName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserFacebookInstantGamesIdInfo::FromJson(const JsonValue& input) +{ + String facebookInstantGamesId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInstantGamesId", facebookInstantGamesId)); + this->SetFacebookInstantGamesId(std::move(facebookInstantGamesId)); + + return S_OK; +} + +size_t UserFacebookInstantGamesIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserFacebookInstantGamesIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserFacebookInstantGamesIdInfo::RequiredBufferSize(const PFUserFacebookInstantGamesIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.facebookInstantGamesId) + { + requiredSize += (std::strlen(model.facebookInstantGamesId) + 1); + } + return requiredSize; +} + +HRESULT UserFacebookInstantGamesIdInfo::Copy(const PFUserFacebookInstantGamesIdInfo& input, PFUserFacebookInstantGamesIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.facebookInstantGamesId); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInstantGamesId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserGameCenterInfo::FromJson(const JsonValue& input) +{ + String gameCenterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GameCenterId", gameCenterId)); + this->SetGameCenterId(std::move(gameCenterId)); + + return S_OK; +} + +size_t UserGameCenterInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserGameCenterInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserGameCenterInfo::RequiredBufferSize(const PFUserGameCenterInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.gameCenterId) + { + requiredSize += (std::strlen(model.gameCenterId) + 1); + } + return requiredSize; +} + +HRESULT UserGameCenterInfo::Copy(const PFUserGameCenterInfo& input, PFUserGameCenterInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.gameCenterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.gameCenterId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserGoogleInfo::FromJson(const JsonValue& input) +{ + String googleEmail{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleEmail", googleEmail)); + this->SetGoogleEmail(std::move(googleEmail)); + + String googleGender{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleGender", googleGender)); + this->SetGoogleGender(std::move(googleGender)); + + String googleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleId", googleId)); + this->SetGoogleId(std::move(googleId)); + + String googleLocale{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleLocale", googleLocale)); + this->SetGoogleLocale(std::move(googleLocale)); + + String googleName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleName", googleName)); + this->SetGoogleName(std::move(googleName)); + + return S_OK; +} + +size_t UserGoogleInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserGoogleInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserGoogleInfo::RequiredBufferSize(const PFUserGoogleInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.googleEmail) + { + requiredSize += (std::strlen(model.googleEmail) + 1); + } + if (model.googleGender) + { + requiredSize += (std::strlen(model.googleGender) + 1); + } + if (model.googleId) + { + requiredSize += (std::strlen(model.googleId) + 1); + } + if (model.googleLocale) + { + requiredSize += (std::strlen(model.googleLocale) + 1); + } + if (model.googleName) + { + requiredSize += (std::strlen(model.googleName) + 1); + } + return requiredSize; +} + +HRESULT UserGoogleInfo::Copy(const PFUserGoogleInfo& input, PFUserGoogleInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.googleEmail); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleEmail = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleGender); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleGender = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleLocale); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleLocale = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleName); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserGooglePlayGamesInfo::FromJson(const JsonValue& input) +{ + String googlePlayGamesPlayerAvatarImageUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesPlayerAvatarImageUrl", googlePlayGamesPlayerAvatarImageUrl)); + this->SetGooglePlayGamesPlayerAvatarImageUrl(std::move(googlePlayGamesPlayerAvatarImageUrl)); + + String googlePlayGamesPlayerDisplayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesPlayerDisplayName", googlePlayGamesPlayerDisplayName)); + this->SetGooglePlayGamesPlayerDisplayName(std::move(googlePlayGamesPlayerDisplayName)); + + String googlePlayGamesPlayerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesPlayerId", googlePlayGamesPlayerId)); + this->SetGooglePlayGamesPlayerId(std::move(googlePlayGamesPlayerId)); + + return S_OK; +} + +size_t UserGooglePlayGamesInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserGooglePlayGamesInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserGooglePlayGamesInfo::RequiredBufferSize(const PFUserGooglePlayGamesInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.googlePlayGamesPlayerAvatarImageUrl) + { + requiredSize += (std::strlen(model.googlePlayGamesPlayerAvatarImageUrl) + 1); + } + if (model.googlePlayGamesPlayerDisplayName) + { + requiredSize += (std::strlen(model.googlePlayGamesPlayerDisplayName) + 1); + } + if (model.googlePlayGamesPlayerId) + { + requiredSize += (std::strlen(model.googlePlayGamesPlayerId) + 1); + } + return requiredSize; +} + +HRESULT UserGooglePlayGamesInfo::Copy(const PFUserGooglePlayGamesInfo& input, PFUserGooglePlayGamesInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesPlayerAvatarImageUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesPlayerAvatarImageUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesPlayerDisplayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesPlayerDisplayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesPlayerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesPlayerId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserIosDeviceInfo::FromJson(const JsonValue& input) +{ + String iosDeviceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IosDeviceId", iosDeviceId)); + this->SetIosDeviceId(std::move(iosDeviceId)); + + return S_OK; +} + +size_t UserIosDeviceInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserIosDeviceInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserIosDeviceInfo::RequiredBufferSize(const PFUserIosDeviceInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.iosDeviceId) + { + requiredSize += (std::strlen(model.iosDeviceId) + 1); + } + return requiredSize; +} + +HRESULT UserIosDeviceInfo::Copy(const PFUserIosDeviceInfo& input, PFUserIosDeviceInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.iosDeviceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.iosDeviceId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserKongregateInfo::FromJson(const JsonValue& input) +{ + String kongregateId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KongregateId", kongregateId)); + this->SetKongregateId(std::move(kongregateId)); + + String kongregateName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KongregateName", kongregateName)); + this->SetKongregateName(std::move(kongregateName)); + + return S_OK; +} + +size_t UserKongregateInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserKongregateInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserKongregateInfo::RequiredBufferSize(const PFUserKongregateInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.kongregateId) + { + requiredSize += (std::strlen(model.kongregateId) + 1); + } + if (model.kongregateName) + { + requiredSize += (std::strlen(model.kongregateName) + 1); + } + return requiredSize; +} + +HRESULT UserKongregateInfo::Copy(const PFUserKongregateInfo& input, PFUserKongregateInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.kongregateId); + RETURN_IF_FAILED(propCopyResult.hr); + output.kongregateId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.kongregateName); + RETURN_IF_FAILED(propCopyResult.hr); + output.kongregateName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserNintendoSwitchAccountIdInfo::FromJson(const JsonValue& input) +{ + String nintendoSwitchAccountSubjectId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchAccountSubjectId", nintendoSwitchAccountSubjectId)); + this->SetNintendoSwitchAccountSubjectId(std::move(nintendoSwitchAccountSubjectId)); + + return S_OK; +} + +size_t UserNintendoSwitchAccountIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserNintendoSwitchAccountIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserNintendoSwitchAccountIdInfo::RequiredBufferSize(const PFUserNintendoSwitchAccountIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.nintendoSwitchAccountSubjectId) + { + requiredSize += (std::strlen(model.nintendoSwitchAccountSubjectId) + 1); + } + return requiredSize; +} + +HRESULT UserNintendoSwitchAccountIdInfo::Copy(const PFUserNintendoSwitchAccountIdInfo& input, PFUserNintendoSwitchAccountIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchAccountSubjectId); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchAccountSubjectId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserNintendoSwitchDeviceIdInfo::FromJson(const JsonValue& input) +{ + String nintendoSwitchDeviceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchDeviceId", nintendoSwitchDeviceId)); + this->SetNintendoSwitchDeviceId(std::move(nintendoSwitchDeviceId)); + + return S_OK; +} + +size_t UserNintendoSwitchDeviceIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserNintendoSwitchDeviceIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserNintendoSwitchDeviceIdInfo::RequiredBufferSize(const PFUserNintendoSwitchDeviceIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.nintendoSwitchDeviceId) + { + requiredSize += (std::strlen(model.nintendoSwitchDeviceId) + 1); + } + return requiredSize; +} + +HRESULT UserNintendoSwitchDeviceIdInfo::Copy(const PFUserNintendoSwitchDeviceIdInfo& input, PFUserNintendoSwitchDeviceIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchDeviceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchDeviceId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserOpenIdInfo::FromJson(const JsonValue& input) +{ + String connectionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ConnectionId", connectionId)); + this->SetConnectionId(std::move(connectionId)); + + String issuer{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Issuer", issuer)); + this->SetIssuer(std::move(issuer)); + + String subject{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Subject", subject)); + this->SetSubject(std::move(subject)); + + return S_OK; +} + +size_t UserOpenIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserOpenIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserOpenIdInfo::RequiredBufferSize(const PFUserOpenIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.connectionId) + { + requiredSize += (std::strlen(model.connectionId) + 1); + } + if (model.issuer) + { + requiredSize += (std::strlen(model.issuer) + 1); + } + if (model.subject) + { + requiredSize += (std::strlen(model.subject) + 1); + } + return requiredSize; +} + +HRESULT UserOpenIdInfo::Copy(const PFUserOpenIdInfo& input, PFUserOpenIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.connectionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.connectionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.issuer); + RETURN_IF_FAILED(propCopyResult.hr); + output.issuer = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subject); + RETURN_IF_FAILED(propCopyResult.hr); + output.subject = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserPrivateAccountInfo::FromJson(const JsonValue& input) +{ + String email{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Email", email)); + this->SetEmail(std::move(email)); + + return S_OK; +} + +size_t UserPrivateAccountInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserPrivateAccountInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserPrivateAccountInfo::RequiredBufferSize(const PFUserPrivateAccountInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.email) + { + requiredSize += (std::strlen(model.email) + 1); + } + return requiredSize; +} + +HRESULT UserPrivateAccountInfo::Copy(const PFUserPrivateAccountInfo& input, PFUserPrivateAccountInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.email); + RETURN_IF_FAILED(propCopyResult.hr); + output.email = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserPsnInfo::FromJson(const JsonValue& input) +{ + String psnAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PsnAccountId", psnAccountId)); + this->SetPsnAccountId(std::move(psnAccountId)); + + String psnOnlineId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PsnOnlineId", psnOnlineId)); + this->SetPsnOnlineId(std::move(psnOnlineId)); + + return S_OK; +} + +size_t UserPsnInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserPsnInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserPsnInfo::RequiredBufferSize(const PFUserPsnInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.psnAccountId) + { + requiredSize += (std::strlen(model.psnAccountId) + 1); + } + if (model.psnOnlineId) + { + requiredSize += (std::strlen(model.psnOnlineId) + 1); + } + return requiredSize; +} + +HRESULT UserPsnInfo::Copy(const PFUserPsnInfo& input, PFUserPsnInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.psnAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.psnAccountId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.psnOnlineId); + RETURN_IF_FAILED(propCopyResult.hr); + output.psnOnlineId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserSteamInfo::FromJson(const JsonValue& input) +{ + std::optional steamActivationStatus{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamActivationStatus", steamActivationStatus)); + this->SetSteamActivationStatus(std::move(steamActivationStatus)); + + String steamCountry{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamCountry", steamCountry)); + this->SetSteamCountry(std::move(steamCountry)); + + std::optional steamCurrency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamCurrency", steamCurrency)); + this->SetSteamCurrency(std::move(steamCurrency)); + + String steamId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamId", steamId)); + this->SetSteamId(std::move(steamId)); + + String steamName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamName", steamName)); + this->SetSteamName(std::move(steamName)); + + return S_OK; +} + +size_t UserSteamInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserSteamInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserSteamInfo::RequiredBufferSize(const PFUserSteamInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.steamActivationStatus) + { + requiredSize += (alignof(PFTitleActivationStatus) + sizeof(PFTitleActivationStatus)); + } + if (model.steamCountry) + { + requiredSize += (std::strlen(model.steamCountry) + 1); + } + if (model.steamCurrency) + { + requiredSize += (alignof(PFCurrency) + sizeof(PFCurrency)); + } + if (model.steamId) + { + requiredSize += (std::strlen(model.steamId) + 1); + } + if (model.steamName) + { + requiredSize += (std::strlen(model.steamName) + 1); + } + return requiredSize; +} + +HRESULT UserSteamInfo::Copy(const PFUserSteamInfo& input, PFUserSteamInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.steamActivationStatus); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamActivationStatus = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamCountry); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamCountry = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamCurrency); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamCurrency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamId); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamName); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue EntityKey::ToJson() const +{ + return EntityKey::ToJson(this->Model()); +} + +JsonValue EntityKey::ToJson(const PFEntityKey& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "Type", input.type); + return output; +} + +HRESULT EntityKey::FromJson(const JsonValue& input) +{ + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + return S_OK; +} + +size_t EntityKey::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityKey::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityKey::RequiredBufferSize(const PFEntityKey& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + return requiredSize; +} + +HRESULT EntityKey::Copy(const PFEntityKey& input, PFEntityKey& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserTitleInfo::FromJson(const JsonValue& input) +{ + String avatarUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AvatarUrl", avatarUrl)); + this->SetAvatarUrl(std::move(avatarUrl)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", this->m_model.created)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + std::optional firstLogin{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "FirstLogin", firstLogin)); + this->SetFirstLogin(std::move(firstLogin)); + + std::optional isBanned{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "isBanned", isBanned)); + this->SetisBanned(std::move(isBanned)); + + std::optional lastLogin{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastLogin", lastLogin)); + this->SetLastLogin(std::move(lastLogin)); + + std::optional origination{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Origination", origination)); + this->SetOrigination(std::move(origination)); + + std::optional titlePlayerAccount{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitlePlayerAccount", titlePlayerAccount)); + if (titlePlayerAccount) + { + this->SetTitlePlayerAccount(std::move(*titlePlayerAccount)); + } + + return S_OK; +} + +size_t UserTitleInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserTitleInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserTitleInfo::RequiredBufferSize(const PFUserTitleInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.avatarUrl) + { + requiredSize += (std::strlen(model.avatarUrl) + 1); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + if (model.firstLogin) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.isBanned) + { + requiredSize += (alignof(bool) + sizeof(bool)); + } + if (model.lastLogin) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.origination) + { + requiredSize += (alignof(PFUserOrigination) + sizeof(PFUserOrigination)); + } + if (model.titlePlayerAccount) + { + requiredSize += EntityKey::RequiredBufferSize(*model.titlePlayerAccount); + } + return requiredSize; +} + +HRESULT UserTitleInfo::Copy(const PFUserTitleInfo& input, PFUserTitleInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.avatarUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.avatarUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.firstLogin); + RETURN_IF_FAILED(propCopyResult.hr); + output.firstLogin = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.isBanned); + RETURN_IF_FAILED(propCopyResult.hr); + output.isBanned = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastLogin); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastLogin = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.origination); + RETURN_IF_FAILED(propCopyResult.hr); + output.origination = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titlePlayerAccount); + RETURN_IF_FAILED(propCopyResult.hr); + output.titlePlayerAccount = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserTwitchInfo::FromJson(const JsonValue& input) +{ + String twitchId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TwitchId", twitchId)); + this->SetTwitchId(std::move(twitchId)); + + String twitchUserName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TwitchUserName", twitchUserName)); + this->SetTwitchUserName(std::move(twitchUserName)); + + return S_OK; +} + +size_t UserTwitchInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserTwitchInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserTwitchInfo::RequiredBufferSize(const PFUserTwitchInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.twitchId) + { + requiredSize += (std::strlen(model.twitchId) + 1); + } + if (model.twitchUserName) + { + requiredSize += (std::strlen(model.twitchUserName) + 1); + } + return requiredSize; +} + +HRESULT UserTwitchInfo::Copy(const PFUserTwitchInfo& input, PFUserTwitchInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.twitchId); + RETURN_IF_FAILED(propCopyResult.hr); + output.twitchId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.twitchUserName); + RETURN_IF_FAILED(propCopyResult.hr); + output.twitchUserName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserXboxInfo::FromJson(const JsonValue& input) +{ + String xboxUserId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxUserId", xboxUserId)); + this->SetXboxUserId(std::move(xboxUserId)); + + String xboxUserSandbox{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxUserSandbox", xboxUserSandbox)); + this->SetXboxUserSandbox(std::move(xboxUserSandbox)); + + return S_OK; +} + +size_t UserXboxInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserXboxInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserXboxInfo::RequiredBufferSize(const PFUserXboxInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.xboxUserId) + { + requiredSize += (std::strlen(model.xboxUserId) + 1); + } + if (model.xboxUserSandbox) + { + requiredSize += (std::strlen(model.xboxUserSandbox) + 1); + } + return requiredSize; +} + +HRESULT UserXboxInfo::Copy(const PFUserXboxInfo& input, PFUserXboxInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.xboxUserId); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxUserId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.xboxUserSandbox); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxUserSandbox = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserAccountInfo::FromJson(const JsonValue& input) +{ + std::optional androidDeviceInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AndroidDeviceInfo", androidDeviceInfo)); + if (androidDeviceInfo) + { + this->SetAndroidDeviceInfo(std::move(*androidDeviceInfo)); + } + + std::optional appleAccountInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AppleAccountInfo", appleAccountInfo)); + if (appleAccountInfo) + { + this->SetAppleAccountInfo(std::move(*appleAccountInfo)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", this->m_model.created)); + + std::optional customIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CustomIdInfo", customIdInfo)); + if (customIdInfo) + { + this->SetCustomIdInfo(std::move(*customIdInfo)); + } + + std::optional facebookInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInfo", facebookInfo)); + if (facebookInfo) + { + this->SetFacebookInfo(std::move(*facebookInfo)); + } + + std::optional facebookInstantGamesIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInstantGamesIdInfo", facebookInstantGamesIdInfo)); + if (facebookInstantGamesIdInfo) + { + this->SetFacebookInstantGamesIdInfo(std::move(*facebookInstantGamesIdInfo)); + } + + std::optional gameCenterInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GameCenterInfo", gameCenterInfo)); + if (gameCenterInfo) + { + this->SetGameCenterInfo(std::move(*gameCenterInfo)); + } + + std::optional googleInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleInfo", googleInfo)); + if (googleInfo) + { + this->SetGoogleInfo(std::move(*googleInfo)); + } + + std::optional googlePlayGamesInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesInfo", googlePlayGamesInfo)); + if (googlePlayGamesInfo) + { + this->SetGooglePlayGamesInfo(std::move(*googlePlayGamesInfo)); + } + + std::optional iosDeviceInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IosDeviceInfo", iosDeviceInfo)); + if (iosDeviceInfo) + { + this->SetIosDeviceInfo(std::move(*iosDeviceInfo)); + } + + std::optional kongregateInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KongregateInfo", kongregateInfo)); + if (kongregateInfo) + { + this->SetKongregateInfo(std::move(*kongregateInfo)); + } + + std::optional nintendoSwitchAccountInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchAccountInfo", nintendoSwitchAccountInfo)); + if (nintendoSwitchAccountInfo) + { + this->SetNintendoSwitchAccountInfo(std::move(*nintendoSwitchAccountInfo)); + } + + std::optional nintendoSwitchDeviceIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchDeviceIdInfo", nintendoSwitchDeviceIdInfo)); + if (nintendoSwitchDeviceIdInfo) + { + this->SetNintendoSwitchDeviceIdInfo(std::move(*nintendoSwitchDeviceIdInfo)); + } + + ModelVector openIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OpenIdInfo", openIdInfo)); + this->SetOpenIdInfo(std::move(openIdInfo)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + std::optional privateInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PrivateInfo", privateInfo)); + if (privateInfo) + { + this->SetPrivateInfo(std::move(*privateInfo)); + } + + std::optional psnInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PsnInfo", psnInfo)); + if (psnInfo) + { + this->SetPsnInfo(std::move(*psnInfo)); + } + + std::optional steamInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamInfo", steamInfo)); + if (steamInfo) + { + this->SetSteamInfo(std::move(*steamInfo)); + } + + std::optional titleInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleInfo", titleInfo)); + if (titleInfo) + { + this->SetTitleInfo(std::move(*titleInfo)); + } + + std::optional twitchInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TwitchInfo", twitchInfo)); + if (twitchInfo) + { + this->SetTwitchInfo(std::move(*twitchInfo)); + } + + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + std::optional xboxInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxInfo", xboxInfo)); + if (xboxInfo) + { + this->SetXboxInfo(std::move(*xboxInfo)); + } + + return S_OK; +} + +size_t UserAccountInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserAccountInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserAccountInfo::RequiredBufferSize(const PFUserAccountInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.androidDeviceInfo) + { + requiredSize += UserAndroidDeviceInfo::RequiredBufferSize(*model.androidDeviceInfo); + } + if (model.appleAccountInfo) + { + requiredSize += UserAppleIdInfo::RequiredBufferSize(*model.appleAccountInfo); + } + if (model.customIdInfo) + { + requiredSize += UserCustomIdInfo::RequiredBufferSize(*model.customIdInfo); + } + if (model.facebookInfo) + { + requiredSize += UserFacebookInfo::RequiredBufferSize(*model.facebookInfo); + } + if (model.facebookInstantGamesIdInfo) + { + requiredSize += UserFacebookInstantGamesIdInfo::RequiredBufferSize(*model.facebookInstantGamesIdInfo); + } + if (model.gameCenterInfo) + { + requiredSize += UserGameCenterInfo::RequiredBufferSize(*model.gameCenterInfo); + } + if (model.googleInfo) + { + requiredSize += UserGoogleInfo::RequiredBufferSize(*model.googleInfo); + } + if (model.googlePlayGamesInfo) + { + requiredSize += UserGooglePlayGamesInfo::RequiredBufferSize(*model.googlePlayGamesInfo); + } + if (model.iosDeviceInfo) + { + requiredSize += UserIosDeviceInfo::RequiredBufferSize(*model.iosDeviceInfo); + } + if (model.kongregateInfo) + { + requiredSize += UserKongregateInfo::RequiredBufferSize(*model.kongregateInfo); + } + if (model.nintendoSwitchAccountInfo) + { + requiredSize += UserNintendoSwitchAccountIdInfo::RequiredBufferSize(*model.nintendoSwitchAccountInfo); + } + if (model.nintendoSwitchDeviceIdInfo) + { + requiredSize += UserNintendoSwitchDeviceIdInfo::RequiredBufferSize(*model.nintendoSwitchDeviceIdInfo); + } + requiredSize += (alignof(PFUserOpenIdInfo*) + sizeof(PFUserOpenIdInfo*) * model.openIdInfoCount); + for (size_t i = 0; i < model.openIdInfoCount; ++i) + { + requiredSize += UserOpenIdInfo::RequiredBufferSize(*model.openIdInfo[i]); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.privateInfo) + { + requiredSize += UserPrivateAccountInfo::RequiredBufferSize(*model.privateInfo); + } + if (model.psnInfo) + { + requiredSize += UserPsnInfo::RequiredBufferSize(*model.psnInfo); + } + if (model.steamInfo) + { + requiredSize += UserSteamInfo::RequiredBufferSize(*model.steamInfo); + } + if (model.titleInfo) + { + requiredSize += UserTitleInfo::RequiredBufferSize(*model.titleInfo); + } + if (model.twitchInfo) + { + requiredSize += UserTwitchInfo::RequiredBufferSize(*model.twitchInfo); + } + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + if (model.xboxInfo) + { + requiredSize += UserXboxInfo::RequiredBufferSize(*model.xboxInfo); + } + return requiredSize; +} + +HRESULT UserAccountInfo::Copy(const PFUserAccountInfo& input, PFUserAccountInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.androidDeviceInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.androidDeviceInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.appleAccountInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.appleAccountInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.customIdInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.customIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.facebookInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.facebookInstantGamesIdInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInstantGamesIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.gameCenterInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.gameCenterInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.iosDeviceInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.iosDeviceInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.kongregateInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.kongregateInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchAccountInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchAccountInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchDeviceIdInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchDeviceIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.openIdInfo, input.openIdInfoCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.openIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.privateInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.privateInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.psnInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.psnInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.twitchInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.twitchInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.xboxInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxInfo = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ItemInstance::FromJson(const JsonValue& input) +{ + String annotation{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Annotation", annotation)); + this->SetAnnotation(std::move(annotation)); + + CStringVector bundleContents{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BundleContents", bundleContents)); + this->SetBundleContents(std::move(bundleContents)); + + String bundleParent{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BundleParent", bundleParent)); + this->SetBundleParent(std::move(bundleParent)); + + String catalogVersion{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CatalogVersion", catalogVersion)); + this->SetCatalogVersion(std::move(catalogVersion)); + + StringDictionaryEntryVector customData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CustomData", customData)); + this->SetCustomData(std::move(customData)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + std::optional expiration{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expiration", expiration)); + this->SetExpiration(std::move(expiration)); + + String itemClass{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemClass", itemClass)); + this->SetItemClass(std::move(itemClass)); + + String itemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemId", itemId)); + this->SetItemId(std::move(itemId)); + + String itemInstanceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemInstanceId", itemInstanceId)); + this->SetItemInstanceId(std::move(itemInstanceId)); + + std::optional purchaseDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "PurchaseDate", purchaseDate)); + this->SetPurchaseDate(std::move(purchaseDate)); + + std::optional remainingUses{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RemainingUses", remainingUses)); + this->SetRemainingUses(std::move(remainingUses)); + + String unitCurrency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UnitCurrency", unitCurrency)); + this->SetUnitCurrency(std::move(unitCurrency)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UnitPrice", this->m_model.unitPrice)); + + std::optional usesIncrementedBy{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UsesIncrementedBy", usesIncrementedBy)); + this->SetUsesIncrementedBy(std::move(usesIncrementedBy)); + + return S_OK; +} + +size_t ItemInstance::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ItemInstance::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ItemInstance::RequiredBufferSize(const PFItemInstance& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.annotation) + { + requiredSize += (std::strlen(model.annotation) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.bundleContentsCount); + for (size_t i = 0; i < model.bundleContentsCount; ++i) + { + requiredSize += (std::strlen(model.bundleContents[i]) + 1); + } + if (model.bundleParent) + { + requiredSize += (std::strlen(model.bundleParent) + 1); + } + if (model.catalogVersion) + { + requiredSize += (std::strlen(model.catalogVersion) + 1); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.customDataCount); + for (size_t i = 0; i < model.customDataCount; ++i) + { + requiredSize += (std::strlen(model.customData[i].key) + 1); + requiredSize += (std::strlen(model.customData[i].value) + 1); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + if (model.expiration) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.itemClass) + { + requiredSize += (std::strlen(model.itemClass) + 1); + } + if (model.itemId) + { + requiredSize += (std::strlen(model.itemId) + 1); + } + if (model.itemInstanceId) + { + requiredSize += (std::strlen(model.itemInstanceId) + 1); + } + if (model.purchaseDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.remainingUses) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.unitCurrency) + { + requiredSize += (std::strlen(model.unitCurrency) + 1); + } + if (model.usesIncrementedBy) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + return requiredSize; +} + +HRESULT ItemInstance::Copy(const PFItemInstance& input, PFItemInstance& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.annotation); + RETURN_IF_FAILED(propCopyResult.hr); + output.annotation = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.bundleContents, input.bundleContentsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.bundleContents = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.bundleParent); + RETURN_IF_FAILED(propCopyResult.hr); + output.bundleParent = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.catalogVersion); + RETURN_IF_FAILED(propCopyResult.hr); + output.catalogVersion = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.customData, input.customDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.customData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.expiration); + RETURN_IF_FAILED(propCopyResult.hr); + output.expiration = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemClass); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemClass = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemInstanceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemInstanceId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.purchaseDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.purchaseDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.remainingUses); + RETURN_IF_FAILED(propCopyResult.hr); + output.remainingUses = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.unitCurrency); + RETURN_IF_FAILED(propCopyResult.hr); + output.unitCurrency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.usesIncrementedBy); + RETURN_IF_FAILED(propCopyResult.hr); + output.usesIncrementedBy = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT CharacterInventory::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + ModelVector inventory{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Inventory", inventory)); + this->SetInventory(std::move(inventory)); + + return S_OK; +} + +size_t CharacterInventory::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CharacterInventory::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CharacterInventory::RequiredBufferSize(const PFCharacterInventory& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + requiredSize += (alignof(PFItemInstance*) + sizeof(PFItemInstance*) * model.inventoryCount); + for (size_t i = 0; i < model.inventoryCount; ++i) + { + requiredSize += ItemInstance::RequiredBufferSize(*model.inventory[i]); + } + return requiredSize; +} + +HRESULT CharacterInventory::Copy(const PFCharacterInventory& input, PFCharacterInventory& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.inventory, input.inventoryCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.inventory = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT CharacterResult::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + String characterName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterName", characterName)); + this->SetCharacterName(std::move(characterName)); + + String characterType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterType", characterType)); + this->SetCharacterType(std::move(characterType)); + + return S_OK; +} + +size_t CharacterResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CharacterResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CharacterResult::RequiredBufferSize(const PFCharacterResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + if (model.characterName) + { + requiredSize += (std::strlen(model.characterName) + 1); + } + if (model.characterType) + { + requiredSize += (std::strlen(model.characterType) + 1); + } + return requiredSize; +} + +HRESULT CharacterResult::Copy(const PFCharacterResult& input, PFCharacterResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.characterName); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.characterType); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterType = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue AdCampaignAttributionModel::ToJson() const +{ + return AdCampaignAttributionModel::ToJson(this->Model()); +} + +JsonValue AdCampaignAttributionModel::ToJson(const PFAdCampaignAttributionModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberTime(output, "AttributedAt", input.attributedAt); + JsonUtils::ObjectAddMember(output, "CampaignId", input.campaignId); + JsonUtils::ObjectAddMember(output, "Platform", input.platform); + return output; +} + +HRESULT AdCampaignAttributionModel::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "AttributedAt", this->m_model.attributedAt)); + + String campaignId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CampaignId", campaignId)); + this->SetCampaignId(std::move(campaignId)); + + String platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + return S_OK; +} + +size_t AdCampaignAttributionModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AdCampaignAttributionModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AdCampaignAttributionModel::RequiredBufferSize(const PFAdCampaignAttributionModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.campaignId) + { + requiredSize += (std::strlen(model.campaignId) + 1); + } + if (model.platform) + { + requiredSize += (std::strlen(model.platform) + 1); + } + return requiredSize; +} + +HRESULT AdCampaignAttributionModel::Copy(const PFAdCampaignAttributionModel& input, PFAdCampaignAttributionModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.campaignId); + RETURN_IF_FAILED(propCopyResult.hr); + output.campaignId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ContactEmailInfoModel::ToJson() const +{ + return ContactEmailInfoModel::ToJson(this->Model()); +} + +JsonValue ContactEmailInfoModel::ToJson(const PFContactEmailInfoModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "EmailAddress", input.emailAddress); + JsonUtils::ObjectAddMember(output, "Name", input.name); + JsonUtils::ObjectAddMember(output, "VerificationStatus", input.verificationStatus); + return output; +} + +HRESULT ContactEmailInfoModel::FromJson(const JsonValue& input) +{ + String emailAddress{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EmailAddress", emailAddress)); + this->SetEmailAddress(std::move(emailAddress)); + + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + std::optional verificationStatus{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VerificationStatus", verificationStatus)); + this->SetVerificationStatus(std::move(verificationStatus)); + + return S_OK; +} + +size_t ContactEmailInfoModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ContactEmailInfoModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ContactEmailInfoModel::RequiredBufferSize(const PFContactEmailInfoModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.emailAddress) + { + requiredSize += (std::strlen(model.emailAddress) + 1); + } + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + if (model.verificationStatus) + { + requiredSize += (alignof(PFEmailVerificationStatus) + sizeof(PFEmailVerificationStatus)); + } + return requiredSize; +} + +HRESULT ContactEmailInfoModel::Copy(const PFContactEmailInfoModel& input, PFContactEmailInfoModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.emailAddress); + RETURN_IF_FAILED(propCopyResult.hr); + output.emailAddress = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.verificationStatus); + RETURN_IF_FAILED(propCopyResult.hr); + output.verificationStatus = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue LinkedPlatformAccountModel::ToJson() const +{ + return LinkedPlatformAccountModel::ToJson(this->Model()); +} + +JsonValue LinkedPlatformAccountModel::ToJson(const PFLinkedPlatformAccountModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Email", input.email); + JsonUtils::ObjectAddMember(output, "Platform", input.platform); + JsonUtils::ObjectAddMember(output, "PlatformUserId", input.platformUserId); + JsonUtils::ObjectAddMember(output, "Username", input.username); + return output; +} + +HRESULT LinkedPlatformAccountModel::FromJson(const JsonValue& input) +{ + String email{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Email", email)); + this->SetEmail(std::move(email)); + + std::optional platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + String platformUserId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlatformUserId", platformUserId)); + this->SetPlatformUserId(std::move(platformUserId)); + + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + return S_OK; +} + +size_t LinkedPlatformAccountModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result LinkedPlatformAccountModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t LinkedPlatformAccountModel::RequiredBufferSize(const PFLinkedPlatformAccountModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.email) + { + requiredSize += (std::strlen(model.email) + 1); + } + if (model.platform) + { + requiredSize += (alignof(PFLoginIdentityProvider) + sizeof(PFLoginIdentityProvider)); + } + if (model.platformUserId) + { + requiredSize += (std::strlen(model.platformUserId) + 1); + } + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + return requiredSize; +} + +HRESULT LinkedPlatformAccountModel::Copy(const PFLinkedPlatformAccountModel& input, PFLinkedPlatformAccountModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.email); + RETURN_IF_FAILED(propCopyResult.hr); + output.email = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platformUserId); + RETURN_IF_FAILED(propCopyResult.hr); + output.platformUserId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue LocationModel::ToJson() const +{ + return LocationModel::ToJson(this->Model()); +} + +JsonValue LocationModel::ToJson(const PFLocationModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "City", input.city); + JsonUtils::ObjectAddMember(output, "ContinentCode", input.continentCode); + JsonUtils::ObjectAddMember(output, "CountryCode", input.countryCode); + JsonUtils::ObjectAddMember(output, "Latitude", input.latitude); + JsonUtils::ObjectAddMember(output, "Longitude", input.longitude); + return output; +} + +HRESULT LocationModel::FromJson(const JsonValue& input) +{ + String city{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "City", city)); + this->SetCity(std::move(city)); + + std::optional continentCode{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinentCode", continentCode)); + this->SetContinentCode(std::move(continentCode)); + + std::optional countryCode{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CountryCode", countryCode)); + this->SetCountryCode(std::move(countryCode)); + + std::optional latitude{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Latitude", latitude)); + this->SetLatitude(std::move(latitude)); + + std::optional longitude{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Longitude", longitude)); + this->SetLongitude(std::move(longitude)); + + return S_OK; +} + +size_t LocationModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result LocationModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t LocationModel::RequiredBufferSize(const PFLocationModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.city) + { + requiredSize += (std::strlen(model.city) + 1); + } + if (model.continentCode) + { + requiredSize += (alignof(PFContinentCode) + sizeof(PFContinentCode)); + } + if (model.countryCode) + { + requiredSize += (alignof(PFCountryCode) + sizeof(PFCountryCode)); + } + if (model.latitude) + { + requiredSize += (alignof(double) + sizeof(double)); + } + if (model.longitude) + { + requiredSize += (alignof(double) + sizeof(double)); + } + return requiredSize; +} + +HRESULT LocationModel::Copy(const PFLocationModel& input, PFLocationModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.city); + RETURN_IF_FAILED(propCopyResult.hr); + output.city = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.continentCode); + RETURN_IF_FAILED(propCopyResult.hr); + output.continentCode = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.countryCode); + RETURN_IF_FAILED(propCopyResult.hr); + output.countryCode = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.latitude); + RETURN_IF_FAILED(propCopyResult.hr); + output.latitude = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.longitude); + RETURN_IF_FAILED(propCopyResult.hr); + output.longitude = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SubscriptionModel::ToJson() const +{ + return SubscriptionModel::ToJson(this->Model()); +} + +JsonValue SubscriptionModel::ToJson(const PFSubscriptionModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberTime(output, "Expiration", input.expiration); + JsonUtils::ObjectAddMemberTime(output, "InitialSubscriptionTime", input.initialSubscriptionTime); + JsonUtils::ObjectAddMember(output, "IsActive", input.isActive); + JsonUtils::ObjectAddMember(output, "Status", input.status); + JsonUtils::ObjectAddMember(output, "SubscriptionId", input.subscriptionId); + JsonUtils::ObjectAddMember(output, "SubscriptionItemId", input.subscriptionItemId); + JsonUtils::ObjectAddMember(output, "SubscriptionProvider", input.subscriptionProvider); + return output; +} + +HRESULT SubscriptionModel::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expiration", this->m_model.expiration)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "InitialSubscriptionTime", this->m_model.initialSubscriptionTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsActive", this->m_model.isActive)); + + std::optional status{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Status", status)); + this->SetStatus(std::move(status)); + + String subscriptionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SubscriptionId", subscriptionId)); + this->SetSubscriptionId(std::move(subscriptionId)); + + String subscriptionItemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SubscriptionItemId", subscriptionItemId)); + this->SetSubscriptionItemId(std::move(subscriptionItemId)); + + String subscriptionProvider{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SubscriptionProvider", subscriptionProvider)); + this->SetSubscriptionProvider(std::move(subscriptionProvider)); + + return S_OK; +} + +size_t SubscriptionModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SubscriptionModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SubscriptionModel::RequiredBufferSize(const PFSubscriptionModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.status) + { + requiredSize += (alignof(PFSubscriptionProviderStatus) + sizeof(PFSubscriptionProviderStatus)); + } + if (model.subscriptionId) + { + requiredSize += (std::strlen(model.subscriptionId) + 1); + } + if (model.subscriptionItemId) + { + requiredSize += (std::strlen(model.subscriptionItemId) + 1); + } + if (model.subscriptionProvider) + { + requiredSize += (std::strlen(model.subscriptionProvider) + 1); + } + return requiredSize; +} + +HRESULT SubscriptionModel::Copy(const PFSubscriptionModel& input, PFSubscriptionModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.status); + RETURN_IF_FAILED(propCopyResult.hr); + output.status = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subscriptionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subscriptionItemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptionItemId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subscriptionProvider); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptionProvider = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue MembershipModel::ToJson() const +{ + return MembershipModel::ToJson(this->Model()); +} + +JsonValue MembershipModel::ToJson(const PFMembershipModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "IsActive", input.isActive); + JsonUtils::ObjectAddMemberTime(output, "MembershipExpiration", input.membershipExpiration); + JsonUtils::ObjectAddMember(output, "MembershipId", input.membershipId); + JsonUtils::ObjectAddMemberTime(output, "OverrideExpiration", input.overrideExpiration); + JsonUtils::ObjectAddMemberArray(output, "Subscriptions", input.subscriptions, input.subscriptionsCount); + return output; +} + +HRESULT MembershipModel::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsActive", this->m_model.isActive)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "MembershipExpiration", this->m_model.membershipExpiration)); + + String membershipId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MembershipId", membershipId)); + this->SetMembershipId(std::move(membershipId)); + + std::optional overrideExpiration{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "OverrideExpiration", overrideExpiration)); + this->SetOverrideExpiration(std::move(overrideExpiration)); + + ModelVector subscriptions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Subscriptions", subscriptions)); + this->SetSubscriptions(std::move(subscriptions)); + + return S_OK; +} + +size_t MembershipModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result MembershipModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t MembershipModel::RequiredBufferSize(const PFMembershipModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.membershipId) + { + requiredSize += (std::strlen(model.membershipId) + 1); + } + if (model.overrideExpiration) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFSubscriptionModel*) + sizeof(PFSubscriptionModel*) * model.subscriptionsCount); + for (size_t i = 0; i < model.subscriptionsCount; ++i) + { + requiredSize += SubscriptionModel::RequiredBufferSize(*model.subscriptions[i]); + } + return requiredSize; +} + +HRESULT MembershipModel::Copy(const PFMembershipModel& input, PFMembershipModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.membershipId); + RETURN_IF_FAILED(propCopyResult.hr); + output.membershipId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.overrideExpiration); + RETURN_IF_FAILED(propCopyResult.hr); + output.overrideExpiration = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.subscriptions, input.subscriptionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptions = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue PushNotificationRegistrationModel::ToJson() const +{ + return PushNotificationRegistrationModel::ToJson(this->Model()); +} + +JsonValue PushNotificationRegistrationModel::ToJson(const PFPushNotificationRegistrationModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "NotificationEndpointARN", input.notificationEndpointARN); + JsonUtils::ObjectAddMember(output, "Platform", input.platform); + return output; +} + +HRESULT PushNotificationRegistrationModel::FromJson(const JsonValue& input) +{ + String notificationEndpointARN{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NotificationEndpointARN", notificationEndpointARN)); + this->SetNotificationEndpointARN(std::move(notificationEndpointARN)); + + std::optional platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + return S_OK; +} + +size_t PushNotificationRegistrationModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PushNotificationRegistrationModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PushNotificationRegistrationModel::RequiredBufferSize(const PFPushNotificationRegistrationModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.notificationEndpointARN) + { + requiredSize += (std::strlen(model.notificationEndpointARN) + 1); + } + if (model.platform) + { + requiredSize += (alignof(PFPushNotificationPlatform) + sizeof(PFPushNotificationPlatform)); + } + return requiredSize; +} + +HRESULT PushNotificationRegistrationModel::Copy(const PFPushNotificationRegistrationModel& input, PFPushNotificationRegistrationModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.notificationEndpointARN); + RETURN_IF_FAILED(propCopyResult.hr); + output.notificationEndpointARN = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue StatisticModel::ToJson() const +{ + return StatisticModel::ToJson(this->Model()); +} + +JsonValue StatisticModel::ToJson(const PFStatisticModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Name", input.name); + JsonUtils::ObjectAddMember(output, "Value", input.value); + JsonUtils::ObjectAddMember(output, "Version", input.version); + return output; +} + +HRESULT StatisticModel::FromJson(const JsonValue& input) +{ + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", this->m_model.value)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Version", this->m_model.version)); + + return S_OK; +} + +size_t StatisticModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result StatisticModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t StatisticModel::RequiredBufferSize(const PFStatisticModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + return requiredSize; +} + +HRESULT StatisticModel::Copy(const PFStatisticModel& input, PFStatisticModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue TagModel::ToJson() const +{ + return TagModel::ToJson(this->Model()); +} + +JsonValue TagModel::ToJson(const PFTagModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "TagValue", input.tagValue); + return output; +} + +HRESULT TagModel::FromJson(const JsonValue& input) +{ + String tagValue{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TagValue", tagValue)); + this->SetTagValue(std::move(tagValue)); + + return S_OK; +} + +size_t TagModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TagModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TagModel::RequiredBufferSize(const PFTagModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.tagValue) + { + requiredSize += (std::strlen(model.tagValue) + 1); + } + return requiredSize; +} + +HRESULT TagModel::Copy(const PFTagModel& input, PFTagModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.tagValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.tagValue = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ValueToDateModel::ToJson() const +{ + return ValueToDateModel::ToJson(this->Model()); +} + +JsonValue ValueToDateModel::ToJson(const PFValueToDateModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Currency", input.currency); + JsonUtils::ObjectAddMember(output, "TotalValue", input.totalValue); + JsonUtils::ObjectAddMember(output, "TotalValueAsDecimal", input.totalValueAsDecimal); + return output; +} + +HRESULT ValueToDateModel::FromJson(const JsonValue& input) +{ + String currency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Currency", currency)); + this->SetCurrency(std::move(currency)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalValue", this->m_model.totalValue)); + + String totalValueAsDecimal{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalValueAsDecimal", totalValueAsDecimal)); + this->SetTotalValueAsDecimal(std::move(totalValueAsDecimal)); + + return S_OK; +} + +size_t ValueToDateModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ValueToDateModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ValueToDateModel::RequiredBufferSize(const PFValueToDateModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.currency) + { + requiredSize += (std::strlen(model.currency) + 1); + } + if (model.totalValueAsDecimal) + { + requiredSize += (std::strlen(model.totalValueAsDecimal) + 1); + } + return requiredSize; +} + +HRESULT ValueToDateModel::Copy(const PFValueToDateModel& input, PFValueToDateModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.currency); + RETURN_IF_FAILED(propCopyResult.hr); + output.currency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.totalValueAsDecimal); + RETURN_IF_FAILED(propCopyResult.hr); + output.totalValueAsDecimal = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue PlayerProfileModel::ToJson() const +{ + return PlayerProfileModel::ToJson(this->Model()); +} + +JsonValue PlayerProfileModel::ToJson(const PFPlayerProfileModel& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "AdCampaignAttributions", input.adCampaignAttributions, input.adCampaignAttributionsCount); + JsonUtils::ObjectAddMember(output, "AvatarUrl", input.avatarUrl); + JsonUtils::ObjectAddMemberTime(output, "BannedUntil", input.bannedUntil); + JsonUtils::ObjectAddMemberArray(output, "ContactEmailAddresses", input.contactEmailAddresses, input.contactEmailAddressesCount); + JsonUtils::ObjectAddMemberTime(output, "Created", input.created); + JsonUtils::ObjectAddMember(output, "DisplayName", input.displayName); + JsonUtils::ObjectAddMemberArray(output, "ExperimentVariants", input.experimentVariants, input.experimentVariantsCount); + JsonUtils::ObjectAddMemberTime(output, "LastLogin", input.lastLogin); + JsonUtils::ObjectAddMemberArray(output, "LinkedAccounts", input.linkedAccounts, input.linkedAccountsCount); + JsonUtils::ObjectAddMemberArray(output, "Locations", input.locations, input.locationsCount); + JsonUtils::ObjectAddMemberArray(output, "Memberships", input.memberships, input.membershipsCount); + JsonUtils::ObjectAddMember(output, "Origination", input.origination); + JsonUtils::ObjectAddMember(output, "PlayerId", input.playerId); + JsonUtils::ObjectAddMember(output, "PublisherId", input.publisherId); + JsonUtils::ObjectAddMemberArray(output, "PushNotificationRegistrations", input.pushNotificationRegistrations, input.pushNotificationRegistrationsCount); + JsonUtils::ObjectAddMemberArray(output, "Statistics", input.statistics, input.statisticsCount); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + JsonUtils::ObjectAddMember(output, "TitleId", input.titleId); + JsonUtils::ObjectAddMember(output, "TotalValueToDateInUSD", input.totalValueToDateInUSD); + JsonUtils::ObjectAddMemberArray(output, "ValuesToDate", input.valuesToDate, input.valuesToDateCount); + return output; +} + +HRESULT PlayerProfileModel::FromJson(const JsonValue& input) +{ + ModelVector adCampaignAttributions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AdCampaignAttributions", adCampaignAttributions)); + this->SetAdCampaignAttributions(std::move(adCampaignAttributions)); + + String avatarUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AvatarUrl", avatarUrl)); + this->SetAvatarUrl(std::move(avatarUrl)); + + std::optional bannedUntil{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "BannedUntil", bannedUntil)); + this->SetBannedUntil(std::move(bannedUntil)); + + ModelVector contactEmailAddresses{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContactEmailAddresses", contactEmailAddresses)); + this->SetContactEmailAddresses(std::move(contactEmailAddresses)); + + std::optional created{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", created)); + this->SetCreated(std::move(created)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + CStringVector experimentVariants{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ExperimentVariants", experimentVariants)); + this->SetExperimentVariants(std::move(experimentVariants)); + + std::optional lastLogin{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastLogin", lastLogin)); + this->SetLastLogin(std::move(lastLogin)); + + ModelVector linkedAccounts{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "LinkedAccounts", linkedAccounts)); + this->SetLinkedAccounts(std::move(linkedAccounts)); + + ModelVector locations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Locations", locations)); + this->SetLocations(std::move(locations)); + + ModelVector memberships{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Memberships", memberships)); + this->SetMemberships(std::move(memberships)); + + std::optional origination{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Origination", origination)); + this->SetOrigination(std::move(origination)); + + String playerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerId", playerId)); + this->SetPlayerId(std::move(playerId)); + + String publisherId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PublisherId", publisherId)); + this->SetPublisherId(std::move(publisherId)); + + ModelVector pushNotificationRegistrations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PushNotificationRegistrations", pushNotificationRegistrations)); + this->SetPushNotificationRegistrations(std::move(pushNotificationRegistrations)); + + ModelVector statistics{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Statistics", statistics)); + this->SetStatistics(std::move(statistics)); + + ModelVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + String titleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleId", titleId)); + this->SetTitleId(std::move(titleId)); + + std::optional totalValueToDateInUSD{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalValueToDateInUSD", totalValueToDateInUSD)); + this->SetTotalValueToDateInUSD(std::move(totalValueToDateInUSD)); + + ModelVector valuesToDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ValuesToDate", valuesToDate)); + this->SetValuesToDate(std::move(valuesToDate)); + + return S_OK; +} + +size_t PlayerProfileModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PlayerProfileModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PlayerProfileModel::RequiredBufferSize(const PFPlayerProfileModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAdCampaignAttributionModel*) + sizeof(PFAdCampaignAttributionModel*) * model.adCampaignAttributionsCount); + for (size_t i = 0; i < model.adCampaignAttributionsCount; ++i) + { + requiredSize += AdCampaignAttributionModel::RequiredBufferSize(*model.adCampaignAttributions[i]); + } + if (model.avatarUrl) + { + requiredSize += (std::strlen(model.avatarUrl) + 1); + } + if (model.bannedUntil) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFContactEmailInfoModel*) + sizeof(PFContactEmailInfoModel*) * model.contactEmailAddressesCount); + for (size_t i = 0; i < model.contactEmailAddressesCount; ++i) + { + requiredSize += ContactEmailInfoModel::RequiredBufferSize(*model.contactEmailAddresses[i]); + } + if (model.created) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.experimentVariantsCount); + for (size_t i = 0; i < model.experimentVariantsCount; ++i) + { + requiredSize += (std::strlen(model.experimentVariants[i]) + 1); + } + if (model.lastLogin) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFLinkedPlatformAccountModel*) + sizeof(PFLinkedPlatformAccountModel*) * model.linkedAccountsCount); + for (size_t i = 0; i < model.linkedAccountsCount; ++i) + { + requiredSize += LinkedPlatformAccountModel::RequiredBufferSize(*model.linkedAccounts[i]); + } + requiredSize += (alignof(PFLocationModel*) + sizeof(PFLocationModel*) * model.locationsCount); + for (size_t i = 0; i < model.locationsCount; ++i) + { + requiredSize += LocationModel::RequiredBufferSize(*model.locations[i]); + } + requiredSize += (alignof(PFMembershipModel*) + sizeof(PFMembershipModel*) * model.membershipsCount); + for (size_t i = 0; i < model.membershipsCount; ++i) + { + requiredSize += MembershipModel::RequiredBufferSize(*model.memberships[i]); + } + if (model.origination) + { + requiredSize += (alignof(PFLoginIdentityProvider) + sizeof(PFLoginIdentityProvider)); + } + if (model.playerId) + { + requiredSize += (std::strlen(model.playerId) + 1); + } + if (model.publisherId) + { + requiredSize += (std::strlen(model.publisherId) + 1); + } + requiredSize += (alignof(PFPushNotificationRegistrationModel*) + sizeof(PFPushNotificationRegistrationModel*) * model.pushNotificationRegistrationsCount); + for (size_t i = 0; i < model.pushNotificationRegistrationsCount; ++i) + { + requiredSize += PushNotificationRegistrationModel::RequiredBufferSize(*model.pushNotificationRegistrations[i]); + } + requiredSize += (alignof(PFStatisticModel*) + sizeof(PFStatisticModel*) * model.statisticsCount); + for (size_t i = 0; i < model.statisticsCount; ++i) + { + requiredSize += StatisticModel::RequiredBufferSize(*model.statistics[i]); + } + requiredSize += (alignof(PFTagModel*) + sizeof(PFTagModel*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += TagModel::RequiredBufferSize(*model.tags[i]); + } + if (model.titleId) + { + requiredSize += (std::strlen(model.titleId) + 1); + } + if (model.totalValueToDateInUSD) + { + requiredSize += (alignof(uint32_t) + sizeof(uint32_t)); + } + requiredSize += (alignof(PFValueToDateModel*) + sizeof(PFValueToDateModel*) * model.valuesToDateCount); + for (size_t i = 0; i < model.valuesToDateCount; ++i) + { + requiredSize += ValueToDateModel::RequiredBufferSize(*model.valuesToDate[i]); + } + return requiredSize; +} + +HRESULT PlayerProfileModel::Copy(const PFPlayerProfileModel& input, PFPlayerProfileModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.adCampaignAttributions, input.adCampaignAttributionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.adCampaignAttributions = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.avatarUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.avatarUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.bannedUntil); + RETURN_IF_FAILED(propCopyResult.hr); + output.bannedUntil = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.contactEmailAddresses, input.contactEmailAddressesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.contactEmailAddresses = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.created); + RETURN_IF_FAILED(propCopyResult.hr); + output.created = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.experimentVariants, input.experimentVariantsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.experimentVariants = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastLogin); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastLogin = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.linkedAccounts, input.linkedAccountsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.linkedAccounts = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.locations, input.locationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.locations = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.memberships, input.membershipsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.memberships = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.origination); + RETURN_IF_FAILED(propCopyResult.hr); + output.origination = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.publisherId); + RETURN_IF_FAILED(propCopyResult.hr); + output.publisherId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.pushNotificationRegistrations, input.pushNotificationRegistrationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.pushNotificationRegistrations = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.statistics, input.statisticsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.statistics = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.totalValueToDateInUSD); + RETURN_IF_FAILED(propCopyResult.hr); + output.totalValueToDateInUSD = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.valuesToDate, input.valuesToDateCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.valuesToDate = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT StatisticValue::FromJson(const JsonValue& input) +{ + String statisticName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StatisticName", statisticName)); + this->SetStatisticName(std::move(statisticName)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", this->m_model.value)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Version", this->m_model.version)); + + return S_OK; +} + +size_t StatisticValue::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result StatisticValue::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t StatisticValue::RequiredBufferSize(const PFStatisticValue& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.statisticName) + { + requiredSize += (std::strlen(model.statisticName) + 1); + } + return requiredSize; +} + +HRESULT StatisticValue::Copy(const PFStatisticValue& input, PFStatisticValue& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.statisticName); + RETURN_IF_FAILED(propCopyResult.hr); + output.statisticName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserDataRecord::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastUpdated", this->m_model.lastUpdated)); + + std::optional permission{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Permission", permission)); + this->SetPermission(std::move(permission)); + + String value{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", value)); + this->SetValue(std::move(value)); + + return S_OK; +} + +size_t UserDataRecord::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserDataRecord::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserDataRecord::RequiredBufferSize(const PFUserDataRecord& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.permission) + { + requiredSize += (alignof(PFUserDataPermission) + sizeof(PFUserDataPermission)); + } + if (model.value) + { + requiredSize += (std::strlen(model.value) + 1); + } + return requiredSize; +} + +HRESULT UserDataRecord::Copy(const PFUserDataRecord& input, PFUserDataRecord& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.permission); + RETURN_IF_FAILED(propCopyResult.hr); + output.permission = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.value); + RETURN_IF_FAILED(propCopyResult.hr); + output.value = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT VirtualCurrencyRechargeTime::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RechargeMax", this->m_model.rechargeMax)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "RechargeTime", this->m_model.rechargeTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SecondsToRecharge", this->m_model.secondsToRecharge)); + + return S_OK; +} + +size_t VirtualCurrencyRechargeTime::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result VirtualCurrencyRechargeTime::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t VirtualCurrencyRechargeTime::RequiredBufferSize(const PFVirtualCurrencyRechargeTime& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT VirtualCurrencyRechargeTime::Copy(const PFVirtualCurrencyRechargeTime& input, PFVirtualCurrencyRechargeTime& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +HRESULT GetPlayerCombinedInfoResultPayload::FromJson(const JsonValue& input) +{ + std::optional accountInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AccountInfo", accountInfo)); + if (accountInfo) + { + this->SetAccountInfo(std::move(*accountInfo)); + } + + ModelVector characterInventories{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterInventories", characterInventories)); + this->SetCharacterInventories(std::move(characterInventories)); + + ModelVector characterList{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterList", characterList)); + this->SetCharacterList(std::move(characterList)); + + std::optional playerProfile{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerProfile", playerProfile)); + if (playerProfile) + { + this->SetPlayerProfile(std::move(*playerProfile)); + } + + ModelVector playerStatistics{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerStatistics", playerStatistics)); + this->SetPlayerStatistics(std::move(playerStatistics)); + + StringDictionaryEntryVector titleData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleData", titleData)); + this->SetTitleData(std::move(titleData)); + + ModelDictionaryEntryVector userData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserData", userData)); + this->SetUserData(std::move(userData)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserDataVersion", this->m_model.userDataVersion)); + + ModelVector userInventory{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserInventory", userInventory)); + this->SetUserInventory(std::move(userInventory)); + + ModelDictionaryEntryVector userReadOnlyData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserReadOnlyData", userReadOnlyData)); + this->SetUserReadOnlyData(std::move(userReadOnlyData)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserReadOnlyDataVersion", this->m_model.userReadOnlyDataVersion)); + + DictionaryEntryVector userVirtualCurrency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserVirtualCurrency", userVirtualCurrency)); + this->SetUserVirtualCurrency(std::move(userVirtualCurrency)); + + ModelDictionaryEntryVector userVirtualCurrencyRechargeTimes{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserVirtualCurrencyRechargeTimes", userVirtualCurrencyRechargeTimes)); + this->SetUserVirtualCurrencyRechargeTimes(std::move(userVirtualCurrencyRechargeTimes)); + + return S_OK; +} + +size_t GetPlayerCombinedInfoResultPayload::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayerCombinedInfoResultPayload::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayerCombinedInfoResultPayload::RequiredBufferSize(const PFGetPlayerCombinedInfoResultPayload& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.accountInfo) + { + requiredSize += UserAccountInfo::RequiredBufferSize(*model.accountInfo); + } + requiredSize += (alignof(PFCharacterInventory*) + sizeof(PFCharacterInventory*) * model.characterInventoriesCount); + for (size_t i = 0; i < model.characterInventoriesCount; ++i) + { + requiredSize += CharacterInventory::RequiredBufferSize(*model.characterInventories[i]); + } + requiredSize += (alignof(PFCharacterResult*) + sizeof(PFCharacterResult*) * model.characterListCount); + for (size_t i = 0; i < model.characterListCount; ++i) + { + requiredSize += CharacterResult::RequiredBufferSize(*model.characterList[i]); + } + if (model.playerProfile) + { + requiredSize += PlayerProfileModel::RequiredBufferSize(*model.playerProfile); + } + requiredSize += (alignof(PFStatisticValue*) + sizeof(PFStatisticValue*) * model.playerStatisticsCount); + for (size_t i = 0; i < model.playerStatisticsCount; ++i) + { + requiredSize += StatisticValue::RequiredBufferSize(*model.playerStatistics[i]); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.titleDataCount); + for (size_t i = 0; i < model.titleDataCount; ++i) + { + requiredSize += (std::strlen(model.titleData[i].key) + 1); + requiredSize += (std::strlen(model.titleData[i].value) + 1); + } + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.userDataCount); + for (size_t i = 0; i < model.userDataCount; ++i) + { + requiredSize += (std::strlen(model.userData[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.userData[i].value); + } + requiredSize += (alignof(PFItemInstance*) + sizeof(PFItemInstance*) * model.userInventoryCount); + for (size_t i = 0; i < model.userInventoryCount; ++i) + { + requiredSize += ItemInstance::RequiredBufferSize(*model.userInventory[i]); + } + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.userReadOnlyDataCount); + for (size_t i = 0; i < model.userReadOnlyDataCount; ++i) + { + requiredSize += (std::strlen(model.userReadOnlyData[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.userReadOnlyData[i].value); + } + requiredSize += (alignof(PFInt32DictionaryEntry) + sizeof(PFInt32DictionaryEntry) * model.userVirtualCurrencyCount); + for (size_t i = 0; i < model.userVirtualCurrencyCount; ++i) + { + requiredSize += (std::strlen(model.userVirtualCurrency[i].key) + 1); + } + requiredSize += (alignof(PFVirtualCurrencyRechargeTimeDictionaryEntry) + sizeof(PFVirtualCurrencyRechargeTimeDictionaryEntry) * model.userVirtualCurrencyRechargeTimesCount); + for (size_t i = 0; i < model.userVirtualCurrencyRechargeTimesCount; ++i) + { + requiredSize += (std::strlen(model.userVirtualCurrencyRechargeTimes[i].key) + 1); + requiredSize += VirtualCurrencyRechargeTime::RequiredBufferSize(*model.userVirtualCurrencyRechargeTimes[i].value); + } + return requiredSize; +} + +HRESULT GetPlayerCombinedInfoResultPayload::Copy(const PFGetPlayerCombinedInfoResultPayload& input, PFGetPlayerCombinedInfoResultPayload& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.accountInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.accountInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.characterInventories, input.characterInventoriesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterInventories = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.characterList, input.characterListCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterList = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playerProfile); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerProfile = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.playerStatistics, input.playerStatisticsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerStatistics = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.titleData, input.titleDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userData, input.userDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.userInventory, input.userInventoryCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userInventory = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userReadOnlyData, input.userReadOnlyDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userReadOnlyData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userVirtualCurrency, input.userVirtualCurrencyCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userVirtualCurrency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userVirtualCurrencyRechargeTimes, input.userVirtualCurrencyRechargeTimesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userVirtualCurrencyRechargeTimes = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue Variable::ToJson() const +{ + return Variable::ToJson(this->Model()); +} + +JsonValue Variable::ToJson(const PFVariable& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Name", input.name); + JsonUtils::ObjectAddMember(output, "Value", input.value); + return output; +} + +HRESULT Variable::FromJson(const JsonValue& input) +{ + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + String value{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", value)); + this->SetValue(std::move(value)); + + return S_OK; +} + +size_t Variable::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Variable::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Variable::RequiredBufferSize(const PFVariable& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + if (model.value) + { + requiredSize += (std::strlen(model.value) + 1); + } + return requiredSize; +} + +HRESULT Variable::Copy(const PFVariable& input, PFVariable& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.value); + RETURN_IF_FAILED(propCopyResult.hr); + output.value = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT TreatmentAssignment::FromJson(const JsonValue& input) +{ + ModelVector variables{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Variables", variables)); + this->SetVariables(std::move(variables)); + + CStringVector variants{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Variants", variants)); + this->SetVariants(std::move(variants)); + + return S_OK; +} + +size_t TreatmentAssignment::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TreatmentAssignment::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TreatmentAssignment::RequiredBufferSize(const PFTreatmentAssignment& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFVariable*) + sizeof(PFVariable*) * model.variablesCount); + for (size_t i = 0; i < model.variablesCount; ++i) + { + requiredSize += Variable::RequiredBufferSize(*model.variables[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.variantsCount); + for (size_t i = 0; i < model.variantsCount; ++i) + { + requiredSize += (std::strlen(model.variants[i]) + 1); + } + return requiredSize; +} + +HRESULT TreatmentAssignment::Copy(const PFTreatmentAssignment& input, PFTreatmentAssignment& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.variables, input.variablesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.variables = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.variants, input.variantsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.variants = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT EntityLineage::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + String groupId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GroupId", groupId)); + this->SetGroupId(std::move(groupId)); + + String masterPlayerAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MasterPlayerAccountId", masterPlayerAccountId)); + this->SetMasterPlayerAccountId(std::move(masterPlayerAccountId)); + + String namespaceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NamespaceId", namespaceId)); + this->SetNamespaceId(std::move(namespaceId)); + + String titleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleId", titleId)); + this->SetTitleId(std::move(titleId)); + + String titlePlayerAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitlePlayerAccountId", titlePlayerAccountId)); + this->SetTitlePlayerAccountId(std::move(titlePlayerAccountId)); + + return S_OK; +} + +size_t EntityLineage::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityLineage::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityLineage::RequiredBufferSize(const PFEntityLineage& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + if (model.groupId) + { + requiredSize += (std::strlen(model.groupId) + 1); + } + if (model.masterPlayerAccountId) + { + requiredSize += (std::strlen(model.masterPlayerAccountId) + 1); + } + if (model.namespaceId) + { + requiredSize += (std::strlen(model.namespaceId) + 1); + } + if (model.titleId) + { + requiredSize += (std::strlen(model.titleId) + 1); + } + if (model.titlePlayerAccountId) + { + requiredSize += (std::strlen(model.titlePlayerAccountId) + 1); + } + return requiredSize; +} + +HRESULT EntityLineage::Copy(const PFEntityLineage& input, PFEntityLineage& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.groupId); + RETURN_IF_FAILED(propCopyResult.hr); + output.groupId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.masterPlayerAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.masterPlayerAccountId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.namespaceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.namespaceId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titlePlayerAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titlePlayerAccountId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/Generated/Types.h b/Source/PlayFabCore/Source/Generated/Types.h new file mode 100644 index 0000000..f305707 --- /dev/null +++ b/Source/PlayFabCore/Source/Generated/Types.h @@ -0,0 +1,880 @@ +#pragma once + +#include +#include "BaseModel.h" + +namespace PlayFab +{ + +// Shared Classes +class PlayerProfileViewConstraints : public Wrappers::PFPlayerProfileViewConstraintsWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerProfileViewConstraintsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlayerProfileViewConstraints& input); +}; + +class GetPlayerCombinedInfoRequestParams : public Wrappers::PFGetPlayerCombinedInfoRequestParamsWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGetPlayerCombinedInfoRequestParamsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGetPlayerCombinedInfoRequestParams& input); +}; + +class UserAndroidDeviceInfo : public Wrappers::PFUserAndroidDeviceInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserAndroidDeviceInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserAndroidDeviceInfo& model); + static HRESULT Copy(const PFUserAndroidDeviceInfo& input, PFUserAndroidDeviceInfo& output, ModelBuffer& buffer); +}; + +class UserAppleIdInfo : public Wrappers::PFUserAppleIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserAppleIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserAppleIdInfo& model); + static HRESULT Copy(const PFUserAppleIdInfo& input, PFUserAppleIdInfo& output, ModelBuffer& buffer); +}; + +class UserCustomIdInfo : public Wrappers::PFUserCustomIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserCustomIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserCustomIdInfo& model); + static HRESULT Copy(const PFUserCustomIdInfo& input, PFUserCustomIdInfo& output, ModelBuffer& buffer); +}; + +class UserFacebookInfo : public Wrappers::PFUserFacebookInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserFacebookInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserFacebookInfo& model); + static HRESULT Copy(const PFUserFacebookInfo& input, PFUserFacebookInfo& output, ModelBuffer& buffer); +}; + +class UserFacebookInstantGamesIdInfo : public Wrappers::PFUserFacebookInstantGamesIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserFacebookInstantGamesIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserFacebookInstantGamesIdInfo& model); + static HRESULT Copy(const PFUserFacebookInstantGamesIdInfo& input, PFUserFacebookInstantGamesIdInfo& output, ModelBuffer& buffer); +}; + +class UserGameCenterInfo : public Wrappers::PFUserGameCenterInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserGameCenterInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserGameCenterInfo& model); + static HRESULT Copy(const PFUserGameCenterInfo& input, PFUserGameCenterInfo& output, ModelBuffer& buffer); +}; + +class UserGoogleInfo : public Wrappers::PFUserGoogleInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserGoogleInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserGoogleInfo& model); + static HRESULT Copy(const PFUserGoogleInfo& input, PFUserGoogleInfo& output, ModelBuffer& buffer); +}; + +class UserGooglePlayGamesInfo : public Wrappers::PFUserGooglePlayGamesInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserGooglePlayGamesInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserGooglePlayGamesInfo& model); + static HRESULT Copy(const PFUserGooglePlayGamesInfo& input, PFUserGooglePlayGamesInfo& output, ModelBuffer& buffer); +}; + +class UserIosDeviceInfo : public Wrappers::PFUserIosDeviceInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserIosDeviceInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserIosDeviceInfo& model); + static HRESULT Copy(const PFUserIosDeviceInfo& input, PFUserIosDeviceInfo& output, ModelBuffer& buffer); +}; + +class UserKongregateInfo : public Wrappers::PFUserKongregateInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserKongregateInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserKongregateInfo& model); + static HRESULT Copy(const PFUserKongregateInfo& input, PFUserKongregateInfo& output, ModelBuffer& buffer); +}; + +class UserNintendoSwitchAccountIdInfo : public Wrappers::PFUserNintendoSwitchAccountIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserNintendoSwitchAccountIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserNintendoSwitchAccountIdInfo& model); + static HRESULT Copy(const PFUserNintendoSwitchAccountIdInfo& input, PFUserNintendoSwitchAccountIdInfo& output, ModelBuffer& buffer); +}; + +class UserNintendoSwitchDeviceIdInfo : public Wrappers::PFUserNintendoSwitchDeviceIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserNintendoSwitchDeviceIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserNintendoSwitchDeviceIdInfo& model); + static HRESULT Copy(const PFUserNintendoSwitchDeviceIdInfo& input, PFUserNintendoSwitchDeviceIdInfo& output, ModelBuffer& buffer); +}; + +class UserOpenIdInfo : public Wrappers::PFUserOpenIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserOpenIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserOpenIdInfo& model); + static HRESULT Copy(const PFUserOpenIdInfo& input, PFUserOpenIdInfo& output, ModelBuffer& buffer); +}; + +class UserPrivateAccountInfo : public Wrappers::PFUserPrivateAccountInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserPrivateAccountInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserPrivateAccountInfo& model); + static HRESULT Copy(const PFUserPrivateAccountInfo& input, PFUserPrivateAccountInfo& output, ModelBuffer& buffer); +}; + +class UserPsnInfo : public Wrappers::PFUserPsnInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserPsnInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserPsnInfo& model); + static HRESULT Copy(const PFUserPsnInfo& input, PFUserPsnInfo& output, ModelBuffer& buffer); +}; + +class UserSteamInfo : public Wrappers::PFUserSteamInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserSteamInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserSteamInfo& model); + static HRESULT Copy(const PFUserSteamInfo& input, PFUserSteamInfo& output, ModelBuffer& buffer); +}; + +class EntityKey : public Wrappers::PFEntityKeyWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEntityKeyWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEntityKey& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEntityKey& model); + static HRESULT Copy(const PFEntityKey& input, PFEntityKey& output, ModelBuffer& buffer); +}; + +class UserTitleInfo : public Wrappers::PFUserTitleInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserTitleInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserTitleInfo& model); + static HRESULT Copy(const PFUserTitleInfo& input, PFUserTitleInfo& output, ModelBuffer& buffer); +}; + +class UserTwitchInfo : public Wrappers::PFUserTwitchInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserTwitchInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserTwitchInfo& model); + static HRESULT Copy(const PFUserTwitchInfo& input, PFUserTwitchInfo& output, ModelBuffer& buffer); +}; + +class UserXboxInfo : public Wrappers::PFUserXboxInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserXboxInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserXboxInfo& model); + static HRESULT Copy(const PFUserXboxInfo& input, PFUserXboxInfo& output, ModelBuffer& buffer); +}; + +class UserAccountInfo : public Wrappers::PFUserAccountInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserAccountInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserAccountInfo& model); + static HRESULT Copy(const PFUserAccountInfo& input, PFUserAccountInfo& output, ModelBuffer& buffer); +}; + +class ItemInstance : public Wrappers::PFItemInstanceWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFItemInstanceWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFItemInstance& model); + static HRESULT Copy(const PFItemInstance& input, PFItemInstance& output, ModelBuffer& buffer); +}; + +class CharacterInventory : public Wrappers::PFCharacterInventoryWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterInventoryWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterInventory& model); + static HRESULT Copy(const PFCharacterInventory& input, PFCharacterInventory& output, ModelBuffer& buffer); +}; + +class CharacterResult : public Wrappers::PFCharacterResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterResult& model); + static HRESULT Copy(const PFCharacterResult& input, PFCharacterResult& output, ModelBuffer& buffer); +}; + +class AdCampaignAttributionModel : public Wrappers::PFAdCampaignAttributionModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAdCampaignAttributionModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAdCampaignAttributionModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAdCampaignAttributionModel& model); + static HRESULT Copy(const PFAdCampaignAttributionModel& input, PFAdCampaignAttributionModel& output, ModelBuffer& buffer); +}; + +class ContactEmailInfoModel : public Wrappers::PFContactEmailInfoModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFContactEmailInfoModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFContactEmailInfoModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFContactEmailInfoModel& model); + static HRESULT Copy(const PFContactEmailInfoModel& input, PFContactEmailInfoModel& output, ModelBuffer& buffer); +}; + +class LinkedPlatformAccountModel : public Wrappers::PFLinkedPlatformAccountModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFLinkedPlatformAccountModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFLinkedPlatformAccountModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFLinkedPlatformAccountModel& model); + static HRESULT Copy(const PFLinkedPlatformAccountModel& input, PFLinkedPlatformAccountModel& output, ModelBuffer& buffer); +}; + +class LocationModel : public Wrappers::PFLocationModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFLocationModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFLocationModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFLocationModel& model); + static HRESULT Copy(const PFLocationModel& input, PFLocationModel& output, ModelBuffer& buffer); +}; + +class SubscriptionModel : public Wrappers::PFSubscriptionModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSubscriptionModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFSubscriptionModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSubscriptionModel& model); + static HRESULT Copy(const PFSubscriptionModel& input, PFSubscriptionModel& output, ModelBuffer& buffer); +}; + +class MembershipModel : public Wrappers::PFMembershipModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMembershipModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFMembershipModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMembershipModel& model); + static HRESULT Copy(const PFMembershipModel& input, PFMembershipModel& output, ModelBuffer& buffer); +}; + +class PushNotificationRegistrationModel : public Wrappers::PFPushNotificationRegistrationModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPushNotificationRegistrationModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPushNotificationRegistrationModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPushNotificationRegistrationModel& model); + static HRESULT Copy(const PFPushNotificationRegistrationModel& input, PFPushNotificationRegistrationModel& output, ModelBuffer& buffer); +}; + +class StatisticModel : public Wrappers::PFStatisticModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFStatisticModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFStatisticModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFStatisticModel& model); + static HRESULT Copy(const PFStatisticModel& input, PFStatisticModel& output, ModelBuffer& buffer); +}; + +class TagModel : public Wrappers::PFTagModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTagModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFTagModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTagModel& model); + static HRESULT Copy(const PFTagModel& input, PFTagModel& output, ModelBuffer& buffer); +}; + +class ValueToDateModel : public Wrappers::PFValueToDateModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFValueToDateModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFValueToDateModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFValueToDateModel& model); + static HRESULT Copy(const PFValueToDateModel& input, PFValueToDateModel& output, ModelBuffer& buffer); +}; + +class PlayerProfileModel : public Wrappers::PFPlayerProfileModelWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerProfileModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlayerProfileModel& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPlayerProfileModel& model); + static HRESULT Copy(const PFPlayerProfileModel& input, PFPlayerProfileModel& output, ModelBuffer& buffer); +}; + +class StatisticValue : public Wrappers::PFStatisticValueWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFStatisticValueWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFStatisticValue& model); + static HRESULT Copy(const PFStatisticValue& input, PFStatisticValue& output, ModelBuffer& buffer); +}; + +class UserDataRecord : public Wrappers::PFUserDataRecordWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserDataRecordWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserDataRecord& model); + static HRESULT Copy(const PFUserDataRecord& input, PFUserDataRecord& output, ModelBuffer& buffer); +}; + +class VirtualCurrencyRechargeTime : public Wrappers::PFVirtualCurrencyRechargeTimeWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFVirtualCurrencyRechargeTimeWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFVirtualCurrencyRechargeTime& model); + static HRESULT Copy(const PFVirtualCurrencyRechargeTime& input, PFVirtualCurrencyRechargeTime& output, ModelBuffer& buffer); +}; + +class GetPlayerCombinedInfoResultPayload : public Wrappers::PFGetPlayerCombinedInfoResultPayloadWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGetPlayerCombinedInfoResultPayloadWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGetPlayerCombinedInfoResultPayload& model); + static HRESULT Copy(const PFGetPlayerCombinedInfoResultPayload& input, PFGetPlayerCombinedInfoResultPayload& output, ModelBuffer& buffer); +}; + +class Variable : public Wrappers::PFVariableWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFVariableWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFVariable& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFVariable& model); + static HRESULT Copy(const PFVariable& input, PFVariable& output, ModelBuffer& buffer); +}; + +class TreatmentAssignment : public Wrappers::PFTreatmentAssignmentWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTreatmentAssignmentWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTreatmentAssignment& model); + static HRESULT Copy(const PFTreatmentAssignment& input, PFTreatmentAssignment& output, ModelBuffer& buffer); +}; + +class EntityLineage : public Wrappers::PFEntityLineageWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEntityLineageWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEntityLineage& model); + static HRESULT Copy(const PFEntityLineage& input, PFEntityLineage& output, ModelBuffer& buffer); +}; + +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabCore/Source/HttpClient/LHCExport.def b/Source/PlayFabCore/Source/HttpClient/LHCExport.def new file mode 100644 index 0000000..d50771c --- /dev/null +++ b/Source/PlayFabCore/Source/HttpClient/LHCExport.def @@ -0,0 +1,140 @@ +LIBRARY PlayFabCore.Win32.dll +EXPORTS + HCMemSetFunctions + HCMemGetFunctions + HCInitialize + HCIsInitialized + HCCleanup + HCCleanupAsync + HCGetLibVersion + HCAddCallRoutedHandler + HCRemoveCallRoutedHandler + HCSetGlobalProxy + HCHttpCallCreate + HCHttpCallPerformAsync + HCHttpCallDuplicateHandle + HCHttpCallCloseHandle + HCHttpCallGetId + HCHttpCallSetTracing + HCHttpCallGetRequestUrl + HCHttpCallRequestSetUrl + HCHttpCallRequestSetRequestBodyBytes + HCHttpCallRequestSetRequestBodyString + HCHttpCallRequestSetRequestBodyReadFunction + HCHttpCallRequestSetHeader + HCHttpCallRequestSetRetryAllowed + HCHttpCallRequestSetRetryCacheId + HCHttpCallRequestSetTimeout + HCHttpCallRequestSetRetryDelay + HCHttpCallRequestSetTimeoutWindow + HCHttpCallRequestSetSSLValidation + ;HCHttpDisableAssertsForSSLValidationInDevSandboxes + HCHttpCallResponseSetResponseBodyWriteFunction + HCHttpCallResponseGetResponseString + HCHttpCallResponseGetResponseBodyBytesSize + HCHttpCallResponseGetResponseBodyBytes + HCHttpCallResponseGetStatusCode + HCHttpCallResponseGetNetworkErrorCode + HCHttpCallResponseGetPlatformNetworkErrorMessage + HCHttpCallResponseGetHeader + HCHttpCallResponseGetNumHeaders + HCHttpCallResponseGetHeaderAtIndex + HCWebSocketCreate + HCWebSocketSetBinaryMessageFragmentEventFunction + HCWebSocketSetProxyUri + HCWebSocketSetProxyDecryptsHttps + HCWebSocketSetHeader + HCWebSocketGetEventFunctions + HCWebSocketGetBinaryMessageFragmentEventFunction + HCWebSocketConnectAsync + HCGetWebSocketConnectResult + HCWebSocketSendMessageAsync + HCWebSocketSendBinaryMessageAsync + HCGetWebSocketSendMessageResult + HCWebSocketDisconnect + HCWebSocketSetMaxReceiveBufferSize + HCWebSocketDuplicateHandle + HCWebSocketCloseHandle + HCAddWebSocketRoutedHandler + HCRemoveWebSocketRoutedHandler + + HCSetHttpCallPerformFunction + HCGetHttpCallPerformFunction + HCHttpCallGetContext + HCHttpCallSetContext + HCHttpCallRequestGetUrl + HCHttpCallRequestGetRequestBodyBytes + HCHttpCallRequestGetRequestBodyString + HCHttpCallRequestGetRequestBodyReadFunction + HCHttpCallRequestGetHeader + HCHttpCallRequestGetNumHeaders + HCHttpCallRequestGetHeaderAtIndex + HCHttpCallRequestGetRetryAllowed + HCHttpCallRequestGetRetryCacheId + HCHttpCallRequestGetTimeout + HCHttpCallRequestGetRetryDelay + HCHttpCallRequestGetTimeoutWindow + HCHttpCallResponseGetResponseBodyWriteFunction + HCHttpCallResponseSetResponseBodyBytes + HCHttpCallResponseAppendResponseBodyBytes + HCHttpCallResponseSetStatusCode + HCHttpCallResponseSetNetworkErrorCode + HCHttpCallResponseSetPlatformNetworkErrorMessage + HCHttpCallResponseSetHeader + HCHttpCallResponseSetHeaderWithLength + HCSetWebSocketFunctions + HCGetWebSocketFunctions + HCWebSocketGetProxyUri + HCWebSocketGetHeader + HCWebSocketGetNumHeaders + HCWebSocketGetHeaderAtIndex + + HCMockCallCreate + HCMockAddMock + HCMockSetMockMatchedCallback + HCMockRemoveMock + HCMockClearMocks + HCMockCallDuplicateHandle + HCMockCallCloseHandle + HCMockResponseSetResponseBodyBytes + HCMockResponseSetStatusCode + HCMockResponseSetNetworkErrorCode + HCMockResponseSetHeader + + HCTraceInit + HCTraceCleanup + HCSettingsSetTraceLevel + HCSettingsGetTraceLevel + HCTraceSetClientCallback + HCTraceSetTraceToDebugger + HCTraceSetPlatformCallbacks + HCTraceImplMessage + HCTraceImplMessage_v + HCTraceImplScopeId + + XAsyncGetStatus + XAsyncGetResultSize + XAsyncCancel + XAsyncRun + + XAsyncBegin + XAsyncSchedule + XAsyncComplete + XAsyncGetResult + + XTaskQueueCreate + XTaskQueueCreateComposite + XTaskQueueGetPort + XTaskQueueDuplicateHandle + XTaskQueueDispatch + XTaskQueueCloseHandle + XTaskQueueTerminate + XTaskQueueSubmitCallback + XTaskQueueSubmitDelayedCallback + XTaskQueueRegisterWaiter + XTaskQueueUnregisterWaiter + XTaskQueueRegisterMonitor + XTaskQueueUnregisterMonitor + XTaskQueueGetCurrentProcessTaskQueue + XTaskQueueSetCurrentProcessTaskQueue + \ No newline at end of file diff --git a/Source/PlayFabCore/Source/HttpClient/PFHCTrace.cpp b/Source/PlayFabCore/Source/HttpClient/PFHCTrace.cpp new file mode 100644 index 0000000..2067044 --- /dev/null +++ b/Source/PlayFabCore/Source/HttpClient/PFHCTrace.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include +#include +#include +#include "GlobalState.h" +#include "Trace/TraceState.h" + +using namespace PlayFab; + +PF_API PFHCSettingsSetTraceLevel( + _In_ PFHCTraceLevel traceLevel +) noexcept +{ + return HCSettingsSetTraceLevel(static_cast(traceLevel)); +} + +PF_API PFHCSettingsGetTraceLevel( + _Out_ PFHCTraceLevel* traceLevel +) noexcept +{ + HCTraceLevel hcTraceLevel; + HRESULT hr = HCSettingsGetTraceLevel(&hcTraceLevel); + *traceLevel = static_cast(hcTraceLevel); + return hr; +} + +PF_API_(void) PFHCTraceSetClientCallback(_In_opt_ PFHCTraceCallback* callback) noexcept +{ + auto& settings = GetTraceSettings(); + settings.traceCallback = (HCTraceCallback*)callback; +} + +PF_API_(void) PFHCTraceSetTraceToDebugger(_In_ bool traceToDebugger) noexcept +{ + // This impl differs between LHC to so it routes the debug trace to PFCore's trace's formatting. + // This can be called before or after PFInit. If its called after then TraceState::EnableTraceToDebugger + // will setup the internal debug output. Tracing to debugger cannot be disabled after PFInit. + auto& settings = GetTraceSettings(); + settings.traceToDebugger = traceToDebugger; +} + +// Platform Hooks + +PF_API PFHCTraceSetPlatformCallbacks( + _In_ PFHCTracePlatformThisThreadIdCallback* threadIdCallback, + _In_opt_ void* threadIdContext, + _In_ PFHCTracePlatformWriteMessageToDebuggerCallback* writeToDebuggerCallback, + _In_opt_ void* writeToDebuggerContext +) noexcept +{ + return HCTraceSetPlatformCallbacks( + threadIdCallback, + threadIdContext, + (HCTracePlatformWriteMessageToDebuggerCallback*)writeToDebuggerCallback, + writeToDebuggerContext + ); +} + +// Implementation + +PF_API_(void) PFHCTraceImplMessage( + struct PFHCTraceImplArea const* area, + PFHCTraceLevel level, + _Printf_format_string_ char const* format, + ... +) noexcept +{ + va_list varArgs{}; + va_start(varArgs, format); + HCTraceImplMessage_v((HCTraceImplArea*)area, (HCTraceLevel)level, format, varArgs); + va_end(varArgs); +} + +PF_API_(uint64_t) PFHCTraceImplScopeId() noexcept +{ + return HCTraceImplScopeId(); +} \ No newline at end of file diff --git a/Source/PlayFabCore/Source/HttpClient/PFHttpClient.cpp b/Source/PlayFabCore/Source/HttpClient/PFHttpClient.cpp new file mode 100644 index 0000000..feb076a --- /dev/null +++ b/Source/PlayFabCore/Source/HttpClient/PFHttpClient.cpp @@ -0,0 +1,637 @@ +#include "stdafx.h" +#include +#include + +PF_API PFHCMemSetFunctions( + _In_opt_ PFHCMemAllocFunction memAllocFunc, + _In_opt_ PFHCMemFreeFunction memFreeFunc +) noexcept +{ + return HCMemSetFunctions( + memAllocFunc, + memFreeFunc + ); +} + +PF_API PFHCMemGetFunctions( + _Out_ PFHCMemAllocFunction* memAllocFunc, + _Out_ PFHCMemFreeFunction* memFreeFunc +) noexcept +{ + return HCMemGetFunctions( + memAllocFunc, + memFreeFunc + ); +} + +//Global APIs + +PF_API PFHCInitialize( + _In_opt_ PFHCInitArgs* args +) noexcept +{ + UNREFERENCED_PARAMETER(args); + PFHCIsInitialized(); // empty functions don't export with non-mangled names, so make a trivial function call + return S_OK; // ignore this call +} + +PF_API_(bool) PFHCIsInitialized() noexcept +{ + return HCIsInitialized(); +} + +PF_API PFHCCleanupAsync( + _In_ XAsyncBlock* async +) noexcept +{ + UNREFERENCED_PARAMETER(async); + PFHCIsInitialized(); // empty functions don't export with non-mangled names, so make a trivial function call + return S_OK; // ignore this call +} + +PF_API PFHCGetLibVersion(_Outptr_ const char** version) noexcept +{ + return HCGetLibVersion(version); +} + +PF_API_(int32_t) PFHCAddCallRoutedHandler( + _In_ PFHCCallRoutedHandler handler, + _In_opt_ void* context +) noexcept +{ + return HCAddCallRoutedHandler( + handler, + context + ); +} + +PF_API_(void) PFHCRemoveCallRoutedHandler( + _In_ int32_t handlerId +) noexcept +{ + HCRemoveCallRoutedHandler(handlerId); +} + +PF_API PFHCSetGlobalProxy(_In_ const char* proxyUri) noexcept +{ + return HCSetGlobalProxy(proxyUri); +} + +//Http APIs + +PF_API PFHCHttpCallCreate( + _Out_ PFHCCallHandle* call +) noexcept +{ + return HCHttpCallCreate(call); +} + +PF_API PFHCHttpCallPerformAsync( + _In_ PFHCCallHandle call, + _Inout_ XAsyncBlock* asyncBlock +) noexcept +{ + return HCHttpCallPerformAsync( + call, + asyncBlock + ); +} + +PF_API_(PFHCCallHandle) PFHCHttpCallDuplicateHandle( + _In_ PFHCCallHandle call +) noexcept +{ + return HCHttpCallDuplicateHandle(call); +} + +PF_API PFHCHttpCallCloseHandle( + _In_ PFHCCallHandle call +) noexcept +{ + return HCHttpCallCloseHandle(call); +} + +PF_API_(uint64_t) PFHCHttpCallGetId( + _In_ PFHCCallHandle call +) noexcept +{ + return HCHttpCallGetId(call); +} + +PF_API PFHCHttpCallSetTracing( + _In_ PFHCCallHandle call, + _In_ bool traceCall +) noexcept +{ + return HCHttpCallSetTracing( + call, + traceCall + ); +} + +PF_API PFHCHttpCallGetRequestUrl( + _In_ PFHCCallHandle call, + _Out_ const char** url +) noexcept +{ + return HCHttpCallGetRequestUrl( + call, + url + ); +} + +//HttpCallRequest Set APIs + +PF_API PFHCHttpCallRequestSetUrl( + _In_ PFHCCallHandle call, + _In_z_ const char* method, + _In_z_ const char* url +) noexcept +{ + return HCHttpCallRequestSetUrl( + call, + method, + url + ); +} + +PF_API PFHCHttpCallRequestSetRequestBodyBytes( + _In_ PFHCCallHandle call, + _In_reads_bytes_(requestBodySize) const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize +) noexcept +{ + return HCHttpCallRequestSetRequestBodyBytes( + call, + requestBodyBytes, + requestBodySize + ); +} + +PF_API PFHCHttpCallRequestSetRequestBodyString( + _In_ PFHCCallHandle call, + _In_z_ const char* requestBodyString +) noexcept +{ + return HCHttpCallRequestSetRequestBodyString( + call, + requestBodyString + ); +} + +PF_API PFHCHttpCallRequestSetRequestBodyReadFunction( + _In_ PFHCCallHandle call, + _In_ PFHCHttpCallRequestBodyReadFunction readFunction, + _In_ size_t bodySize, + _In_opt_ void* context +) noexcept +{ + return HCHttpCallRequestSetRequestBodyReadFunction( + call, + readFunction, + bodySize, + context + ); +} + +PF_API PFHCHttpCallRequestSetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _In_z_ const char* headerValue, + _In_ bool allowTracing +) noexcept +{ + return HCHttpCallRequestSetHeader( + call, + headerName, + headerValue, + allowTracing + ); +} + +PF_API PFHCHttpCallRequestSetRetryAllowed( + _In_opt_ PFHCCallHandle call, + _In_ bool retryAllowed +) noexcept +{ + return HCHttpCallRequestSetRetryAllowed( + call, + retryAllowed + ); +} + +PF_API PFHCHttpCallRequestSetRetryCacheId( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t retryAfterCacheId +) noexcept +{ + return HCHttpCallRequestSetRetryCacheId( + call, + retryAfterCacheId + ); +} + +PF_API PFHCHttpCallRequestSetTimeout( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t timeoutInSeconds +) noexcept +{ + return HCHttpCallRequestSetTimeout( + call, + timeoutInSeconds + ); +} + +PF_API PFHCHttpCallRequestSetRetryDelay( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t retryDelayInSeconds +) noexcept +{ + return HCHttpCallRequestSetRetryDelay( + call, + retryDelayInSeconds + ); +} + +PF_API PFHCHttpCallRequestSetTimeoutWindow( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t timeoutWindowInSeconds +) noexcept +{ + return HCHttpCallRequestSetTimeoutWindow( + call, + timeoutWindowInSeconds + ); +} + +#if HC_PLATFORM_IS_MICROSOFT && (HC_PLATFORM != HC_PLATFORM_UWP) && (HC_PLATFORM != HC_PLATFORM_XDK) +PF_API PFHCHttpCallRequestSetSSLValidation( + _In_ PFHCCallHandle call, + _In_ bool sslValidation +) noexcept +{ + return HCHttpCallRequestSetSSLValidation(call, sslValidation); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFHCHttpDisableAssertsForSSLValidationInDevSandboxes( + _In_ PFHCConfigSetting setting +) noexcept +{ + return HCHttpDisableAssertsForSSLValidationInDevSandboxes((HCConfigSetting)setting); +} +#endif + +//HttpCallResponse Set APIs + +PF_API PFHCHttpCallResponseSetResponseBodyWriteFunction( + _In_ PFHCCallHandle call, + _In_ PFHCHttpCallResponseBodyWriteFunction writeFunction, + _In_opt_ void* context +) noexcept +{ + return HCHttpCallResponseSetResponseBodyWriteFunction( + call, + writeFunction, + context + ); +} + +//HttpCallResponse Get APIs + +PF_API PFHCHttpCallResponseGetResponseString( + _In_ PFHCCallHandle call, + _Out_ const char** responseString +) noexcept +{ + return HCHttpCallResponseGetResponseString( + call, + responseString + ); +} + +PF_API PFHCHttpCallResponseGetResponseBodyBytesSize( + _In_ PFHCCallHandle call, + _Out_ size_t* bufferSize +) noexcept +{ + return HCHttpCallResponseGetResponseBodyBytesSize( + call, + bufferSize + ); +} + +PF_API PFHCHttpCallResponseGetResponseBodyBytes( + _In_ PFHCCallHandle call, + _In_ size_t bufferSize, + _Out_writes_bytes_to_opt_(bufferSize, *bufferUsed) uint8_t* buffer, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + return HCHttpCallResponseGetResponseBodyBytes( + call, + bufferSize, + buffer, + bufferUsed + ); +} + +PF_API PFHCHttpCallResponseGetStatusCode( + _In_ PFHCCallHandle call, + _Out_ uint32_t* statusCode +) noexcept +{ + return HCHttpCallResponseGetStatusCode( + call, + statusCode + ); +} + +PF_API PFHCHttpCallResponseGetNetworkErrorCode( + _In_ PFHCCallHandle call, + _Out_ HRESULT* networkErrorCode, + _Out_ uint32_t* platformNetworkErrorCode +) noexcept +{ + return HCHttpCallResponseGetNetworkErrorCode( + call, + networkErrorCode, + platformNetworkErrorCode + ); +} + +PF_API PFHCHttpCallResponseGetPlatformNetworkErrorMessage( + _In_ PFHCCallHandle call, + _Out_ const char** platformNetworkErrorMessage +) noexcept +{ + return HCHttpCallResponseGetPlatformNetworkErrorMessage( + call, + platformNetworkErrorMessage + ); +} + +PF_API PFHCHttpCallResponseGetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _Out_ const char** headerValue +) noexcept +{ + return HCHttpCallResponseGetHeader( + call, + headerName, + headerValue + ); +} + +PF_API PFHCHttpCallResponseGetNumHeaders( + _In_ PFHCCallHandle call, + _Out_ uint32_t* numHeaders +) noexcept +{ + return HCHttpCallResponseGetNumHeaders( + call, + numHeaders + ); +} + +PF_API PFHCHttpCallResponseGetHeaderAtIndex( + _In_ PFHCCallHandle call, + _In_ uint32_t headerIndex, + _Out_ const char** headerName, + _Out_ const char** headerValue +) noexcept +{ + return HCHttpCallResponseGetHeaderAtIndex( + call, + headerIndex, + headerName, + headerValue + ); +} + +#if !HC_NOWEBSOCKETS + +// WebSocket APIs + +PF_API PFHCWebSocketCreate( + _Out_ PFHCWebsocketHandle* websocket, + _In_opt_ PFHCWebSocketMessageFunction messageFunc, + _In_opt_ PFHCWebSocketBinaryMessageFunction binaryMessageFunc, + _In_opt_ PFHCWebSocketCloseEventFunction closeFunc, + _In_opt_ void* functionContext +) noexcept +{ + return HCWebSocketCreate( + websocket, + messageFunc, + binaryMessageFunc, + (HCWebSocketCloseEventFunction)closeFunc, + functionContext + ); +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +PF_API PFHCWebSocketSetBinaryMessageFragmentEventFunction( + _In_ PFHCWebsocketHandle websocket, + _In_ PFHCWebSocketBinaryMessageFragmentFunction binaryMessageFragmentFunc +) noexcept +{ + return HCWebSocketSetBinaryMessageFragmentEventFunction( + websocket, + binaryMessageFragmentFunc + ); +} +#endif + +PF_API PFHCWebSocketSetProxyUri( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* proxyUri +) noexcept +{ + return HCWebSocketSetProxyUri( + websocket, + proxyUri + ); +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 && !HC_WINHTTP_WEBSOCKETS + +PF_API PFHCWebSocketSetProxyDecryptsHttps( + _In_ PFHCWebsocketHandle websocket, + _In_ bool allowProxyToDecryptHttps +) noexcept +{ + return HCWebSocketSetProxyDecryptsHttps( + websocket, + allowProxyToDecryptHttps + ); +} +#endif + +PF_API PFHCWebSocketSetHeader( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* headerName, + _In_z_ const char* headerValue +) noexcept +{ + return HCWebSocketSetHeader( + websocket, + headerName, + headerValue + ); +} + +PF_API PFHCWebSocketGetEventFunctions( + _In_ PFHCWebsocketHandle websocket, + _Out_opt_ PFHCWebSocketMessageFunction* messageFunc, + _Out_opt_ PFHCWebSocketBinaryMessageFunction* binaryMessageFunc, + _Out_opt_ PFHCWebSocketCloseEventFunction* closeFunc, + _Out_ void** functionContext +) noexcept +{ + return HCWebSocketGetEventFunctions( + websocket, + messageFunc, + binaryMessageFunc, + (HCWebSocketCloseEventFunction*)closeFunc, + functionContext + ); +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +PF_API PFHCWebSocketGetBinaryMessageFragmentEventFunction( + _In_ PFHCWebsocketHandle websocket, + _Out_ PFHCWebSocketBinaryMessageFragmentFunction* binaryMessageFragmentFunc, + _Out_ void** functionContext +) noexcept +{ + return HCWebSocketGetBinaryMessageFragmentEventFunction( + websocket, + binaryMessageFragmentFunc, + functionContext + ); +} +#endif + +PF_API PFHCWebSocketConnectAsync( + _In_z_ const char* uri, + _In_z_ const char* subProtocol, + _In_ PFHCWebsocketHandle websocket, + _Inout_ XAsyncBlock* asyncBlock +) noexcept +{ + return HCWebSocketConnectAsync( + uri, + subProtocol, + websocket, + asyncBlock + ); +} + +PF_API PFHCGetWebSocketConnectResult( + _Inout_ XAsyncBlock* asyncBlock, + _In_ PFWebSocketCompletionResult* result +) noexcept +{ + return HCGetWebSocketConnectResult( + asyncBlock, + (WebSocketCompletionResult*)result + ); +} + +PF_API PFHCWebSocketSendMessageAsync( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* message, + _Inout_ XAsyncBlock* asyncBlock +) noexcept +{ + return HCWebSocketSendMessageAsync( + websocket, + message, + asyncBlock + ); +} + +PF_API PFHCWebSocketSendBinaryMessageAsync( + _In_ PFHCWebsocketHandle websocket, + _In_reads_bytes_(payloadSize) const uint8_t* payloadBytes, + _In_ uint32_t payloadSize, + _Inout_ XAsyncBlock* asyncBlock +) noexcept +{ + return HCWebSocketSendBinaryMessageAsync( + websocket, + payloadBytes, + payloadSize, + asyncBlock + ); +} + +PF_API PFHCGetWebSocketSendMessageResult( + _Inout_ XAsyncBlock* asyncBlock, + _In_ PFWebSocketCompletionResult* result +) noexcept +{ + return HCGetWebSocketSendMessageResult( + asyncBlock, + (WebSocketCompletionResult*)result + ); +} + +PF_API PFHCWebSocketDisconnect( + _In_ PFHCWebsocketHandle websocket +) noexcept +{ + return HCWebSocketDisconnect(websocket); +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFHCWebSocketSetMaxReceiveBufferSize( + _In_ PFHCWebsocketHandle websocket, + _In_ size_t bufferSizeInBytes +) noexcept +{ + return HCWebSocketSetMaxReceiveBufferSize( + websocket, + bufferSizeInBytes + ); +} +#endif + +PF_API_(PFHCWebsocketHandle) PFHCWebSocketDuplicateHandle( + _In_ PFHCWebsocketHandle websocket +) noexcept +{ + return HCWebSocketDuplicateHandle(websocket); +} + +PF_API PFHCWebSocketCloseHandle( + _In_ PFHCWebsocketHandle websocket +) noexcept +{ + return HCWebSocketCloseHandle(websocket); +} + +PF_API_(int32_t) PFHCAddWebSocketRoutedHandler( + _In_ PFHCWebSocketRoutedHandler handler, + _In_opt_ void* context +) noexcept +{ + return HCAddWebSocketRoutedHandler( + handler, + context + ); +} + +PF_API_(void) PFHCRemoveWebSocketRoutedHandler( + _In_ int32_t handlerId +) noexcept +{ + HCRemoveWebSocketRoutedHandler(handlerId); +} + +#endif // !HC_NOWEBSOCKETS diff --git a/Source/PlayFabCore/Source/HttpClient/PFHttpProvider.cpp b/Source/PlayFabCore/Source/HttpClient/PFHttpProvider.cpp new file mode 100644 index 0000000..5eb51b0 --- /dev/null +++ b/Source/PlayFabCore/Source/HttpClient/PFHttpProvider.cpp @@ -0,0 +1,405 @@ +#include "stdafx.h" +#include +#include + + +PF_API PFHCSetHttpCallPerformFunction( + _In_ PFHCCallPerformFunction performFunc, + _In_opt_ void* performContext +) noexcept +{ + return HCSetHttpCallPerformFunction( + performFunc, + performContext + ); +} + +PF_API PFHCGetHttpCallPerformFunction( + _Out_ PFHCCallPerformFunction* performFunc, + _Out_ void** performContext +) noexcept +{ + return HCGetHttpCallPerformFunction( + performFunc, + performContext + ); +} + +PF_API PFHCHttpCallGetContext( + _In_ PFHCCallHandle call, + _In_ void** context +) noexcept +{ + return HCHttpCallGetContext( + call, + context + ); +} + +PF_API PFHCHttpCallSetContext( + _In_ PFHCCallHandle call, + _In_opt_ void* context +) noexcept +{ + return HCHttpCallSetContext( + call, + context + ); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallRequest Get APIs +// + +PF_API PFHCHttpCallRequestGetUrl( + _In_ PFHCCallHandle call, + _Outptr_ const char** method, + _Outptr_ const char** url +) noexcept +{ + return HCHttpCallRequestGetUrl( + call, + method, + url + ); +} + +PF_API PFHCHttpCallRequestGetRequestBodyBytes( + _In_ PFHCCallHandle call, + _Outptr_result_bytebuffer_maybenull_(*requestBodySize) const uint8_t** requestBodyBytes, + _Out_ uint32_t* requestBodySize +) noexcept +{ + return HCHttpCallRequestGetRequestBodyBytes( + call, + requestBodyBytes, + requestBodySize + ); +} + +PF_API PFHCHttpCallRequestGetRequestBodyString( + _In_ PFHCCallHandle call, + _Outptr_ const char** requestBody +) noexcept +{ + return HCHttpCallRequestGetRequestBodyString( + call, + requestBody + ); +} + +PF_API PFHCHttpCallRequestGetRequestBodyReadFunction( + _In_ PFHCCallHandle call, + _Out_ PFHCHttpCallRequestBodyReadFunction* readFunction, + _Out_ size_t* bodySize, + _Out_ void** context +) noexcept +{ + return HCHttpCallRequestGetRequestBodyReadFunction( + call, + readFunction, + bodySize, + context + ); +} + +PF_API PFHCHttpCallRequestGetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _Out_ const char** headerValue +) noexcept +{ + return HCHttpCallRequestGetHeader( + call, + headerName, + headerValue + ); +} + +PF_API PFHCHttpCallRequestGetNumHeaders( + _In_ PFHCCallHandle call, + _Out_ uint32_t* numHeaders +) noexcept +{ + return HCHttpCallRequestGetNumHeaders( + call, + numHeaders + ); +} + +PF_API PFHCHttpCallRequestGetHeaderAtIndex( + _In_ PFHCCallHandle call, + _In_ uint32_t headerIndex, + _Out_ const char** headerName, + _Out_ const char** headerValue +) noexcept +{ + return HCHttpCallRequestGetHeaderAtIndex( + call, + headerIndex, + headerName, + headerValue + ); +} + +PF_API PFHCHttpCallRequestGetRetryAllowed( + _In_opt_ PFHCCallHandle call, + _Out_ bool* retryAllowed +) noexcept +{ + return HCHttpCallRequestGetRetryAllowed( + call, + retryAllowed + ); +} + +PF_API PFHCHttpCallRequestGetRetryCacheId( + _In_ PFHCCallHandle call, + _Out_ uint32_t* retryAfterCacheId +) noexcept +{ + return HCHttpCallRequestGetRetryCacheId( + call, + retryAfterCacheId + ); +} + +PF_API PFHCHttpCallRequestGetTimeout( + _In_opt_ PFHCCallHandle call, + _Out_ uint32_t* timeoutInSeconds +) noexcept +{ + return HCHttpCallRequestGetTimeout( + call, + timeoutInSeconds + ); +} + +PF_API PFHCHttpCallRequestGetRetryDelay( + _In_opt_ PFHCCallHandle call, + _In_ uint32_t* retryDelayInSeconds +) noexcept +{ + return HCHttpCallRequestGetRetryDelay( + call, + retryDelayInSeconds + ); +} + +PF_API PFHCHttpCallRequestGetTimeoutWindow( + _In_opt_ PFHCCallHandle call, + _Out_ uint32_t* timeoutWindowInSeconds +) noexcept +{ + return HCHttpCallRequestGetTimeoutWindow( + call, + timeoutWindowInSeconds + ); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallResponse Get APIs +// + +PF_API PFHCHttpCallResponseGetResponseBodyWriteFunction( + _In_ PFHCCallHandle call, + _Out_ PFHCHttpCallResponseBodyWriteFunction* writeFunction, + _Out_ void** context +) noexcept +{ + return HCHttpCallResponseGetResponseBodyWriteFunction( + call, + writeFunction, + context + ); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// HttpCallResponse Set APIs +// + +PF_API PFHCHttpCallResponseSetResponseBodyBytes( + _In_ PFHCCallHandle call, + _In_reads_bytes_(bodySize) const uint8_t* bodyBytes, + _In_ size_t bodySize +) noexcept +{ + return HCHttpCallResponseSetResponseBodyBytes( + call, + bodyBytes, + bodySize + ); +} + +PF_API PFHCHttpCallResponseAppendResponseBodyBytes( + _In_ PFHCCallHandle call, + _In_reads_bytes_(bodySize) const uint8_t* bodyBytes, + _In_ size_t bodySize +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(call); + return HCHttpCallResponseAppendResponseBodyBytes( + call, + bodyBytes, + bodySize + ); +} + +PF_API PFHCHttpCallResponseSetStatusCode( + _In_ PFHCCallHandle call, + _In_ uint32_t statusCode +) noexcept +{ + return HCHttpCallResponseSetStatusCode( + call, + statusCode + ); +} + +PF_API PFHCHttpCallResponseSetNetworkErrorCode( + _In_ PFHCCallHandle call, + _In_ HRESULT networkErrorCode, + _In_ uint32_t platformNetworkErrorCode +) noexcept +{ + return HCHttpCallResponseSetNetworkErrorCode( + call, + networkErrorCode, + platformNetworkErrorCode + ); +} + +PF_API PFHCHttpCallResponseSetPlatformNetworkErrorMessage( + _In_ PFHCCallHandle call, + _In_z_ const char* platformNetworkErrorMessage +) noexcept +{ + return HCHttpCallResponseSetPlatformNetworkErrorMessage( + call, + platformNetworkErrorMessage + ); +} + +PF_API PFHCHttpCallResponseSetHeader( + _In_ PFHCCallHandle call, + _In_z_ const char* headerName, + _In_z_ const char* headerValue +) noexcept +{ + return HCHttpCallResponseSetHeader( + call, + headerName, + headerValue + ); +} + +PF_API PFHCHttpCallResponseSetHeaderWithLength( + _In_ PFHCCallHandle call, + _In_reads_(nameSize) const char* headerName, + _In_ size_t nameSize, + _In_reads_(valueSize) const char* headerValue, + _In_ size_t valueSize +) noexcept +{ + return HCHttpCallResponseSetHeaderWithLength( + call, + headerName, + nameSize, + headerValue, + valueSize + ); +} + +#if !HC_NOWEBSOCKETS + +///////////////////////////////////////////////////////////////////////////////////////// +// WebSocket Set APIs +// + + +PF_API PFHCSetWebSocketFunctions( + _In_ PFHCWebSocketConnectFunction websocketConnectFunc, + _In_ PFHCWebSocketSendMessageFunction websocketSendMessageFunc, + _In_ PFHCWebSocketSendBinaryMessageFunction websocketSendBinaryMessageFunc, + _In_ PFHCWebSocketDisconnectFunction websocketDisconnectFunc, + _In_opt_ void* context +) noexcept +{ + return HCSetWebSocketFunctions( + websocketConnectFunc, + websocketSendMessageFunc, + websocketSendBinaryMessageFunc, + (HCWebSocketDisconnectFunction)websocketDisconnectFunc, + context + ); +} + +PF_API PFHCGetWebSocketFunctions( + _Out_ PFHCWebSocketConnectFunction* websocketConnectFunc, + _Out_ PFHCWebSocketSendMessageFunction* websocketSendMessageFunc, + _Out_ PFHCWebSocketSendBinaryMessageFunction* websocketSendBinaryMessageFunc, + _Out_ PFHCWebSocketDisconnectFunction* websocketDisconnectFunc, + _Out_ void** context +) noexcept +{ + return HCGetWebSocketFunctions( + websocketConnectFunc, + websocketSendMessageFunc, + websocketSendBinaryMessageFunc, + (HCWebSocketDisconnectFunction*)websocketDisconnectFunc, + context + ); +} + +PF_API PFHCWebSocketGetProxyUri( + _In_ PFHCWebsocketHandle websocket, + _Out_ const char** proxyUri +) noexcept +{ + return HCWebSocketGetProxyUri( + websocket, + proxyUri + ); +} + +PF_API PFHCWebSocketGetHeader( + _In_ PFHCWebsocketHandle websocket, + _In_z_ const char* headerName, + _Out_ const char** headerValue +) noexcept +{ + return HCWebSocketGetHeader( + websocket, + headerName, + headerValue + ); +} + +PF_API PFHCWebSocketGetNumHeaders( + _In_ PFHCWebsocketHandle websocket, + _Out_ uint32_t* numHeaders +) noexcept +{ + return HCWebSocketGetNumHeaders( + websocket, + numHeaders + ); +} + + +PF_API PFHCWebSocketGetHeaderAtIndex( + _In_ PFHCWebsocketHandle websocket, + _In_ uint32_t headerIndex, + _Out_ const char** headerName, + _Out_ const char** headerValue +) noexcept +{ + return HCWebSocketGetHeaderAtIndex( + websocket, + headerIndex, + headerName, + headerValue + ); +} + +#endif // !HC_NOWEBSOCKETS \ No newline at end of file diff --git a/Source/PlayFabCore/Source/HttpClient/PFMock.cpp b/Source/PlayFabCore/Source/HttpClient/PFMock.cpp new file mode 100644 index 0000000..e1c06a5 --- /dev/null +++ b/Source/PlayFabCore/Source/HttpClient/PFMock.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include +#include + +///////////////////////////////////////////////////////////////////////////////////////// +// Mock APIs +// + +PF_API PFHCMockCallCreate( + _Out_ PFHCMockCallHandle* call +) noexcept +{ + return HCMockCallCreate(call); +} + +PF_API PFHCMockAddMock( + _In_ PFHCMockCallHandle call, + _In_opt_z_ const char* method, + _In_opt_z_ const char* url, + _In_reads_bytes_opt_(requestBodySize) const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize +) noexcept +{ + return HCMockAddMock( + call, + method, + url, + requestBodyBytes, + requestBodySize + ); +} + +PF_API PFHCMockSetMockMatchedCallback( + _In_ PFHCMockCallHandle call, + _In_ PFHCMockMatchedCallback callback, + _In_opt_ void* context +) +{ + return HCMockSetMockMatchedCallback( + call, + callback, + context + ); +} + +PF_API PFHCMockRemoveMock( + _In_ PFHCMockCallHandle call +) +{ + return HCMockRemoveMock(call); +} + +PF_API PFHCMockClearMocks() noexcept +{ + return HCMockClearMocks(); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// HCMockResponse Set APIs +// + +PF_API PFHCMockResponseSetResponseBodyBytes( + _In_ PFHCMockCallHandle call, + _In_reads_bytes_(bodySize) const uint8_t* bodyBytes, + _In_ uint32_t bodySize +) noexcept +{ + return HCMockResponseSetResponseBodyBytes( + call, + bodyBytes, + bodySize + ); +} + +PF_API PFHCMockResponseSetStatusCode( + _In_ PFHCMockCallHandle call, + _In_ uint32_t statusCode +) noexcept +{ + return HCMockResponseSetStatusCode( + call, + statusCode + ); +} + +PF_API PFHCMockResponseSetNetworkErrorCode( + _In_ PFHCMockCallHandle call, + _In_ HRESULT networkErrorCode, + _In_ uint32_t platformNetworkErrorCode +) noexcept +{ + return HCMockResponseSetNetworkErrorCode( + call, + networkErrorCode, + platformNetworkErrorCode + ); +} + +PF_API PFHCMockResponseSetHeader( + _In_ PFHCMockCallHandle call, + _In_z_ const char* headerName, + _In_z_ const char* headerValue +) noexcept +{ + return HCMockResponseSetHeader( + call, + headerName, + headerValue + ); +} diff --git a/Source/PlayFabCore/Source/Platform/LocalStorage.cpp b/Source/PlayFabCore/Source/Platform/LocalStorage.cpp new file mode 100644 index 0000000..4d9205f --- /dev/null +++ b/Source/PlayFabCore/Source/Platform/LocalStorage.cpp @@ -0,0 +1,212 @@ +#include "stdafx.h" +#include "LocalStorage.h" +#include "Platform.h" +#include "XAsyncOperation.h" + +namespace PlayFab +{ + +class LocalStorage::State +{ +public: + template + AsyncOp StorageOperationContinuation(Result operationResult) + { + std::unique_lock lock{ m_mutex }; + m_runningOperation = nullptr; + RunNextOperationIfPossible(std::move(lock)); + + return std::move(operationResult); + } + + template<> + AsyncOp StorageOperationContinuation(Result operationResult) + { + std::unique_lock lock{ m_mutex }; + m_runningOperation = nullptr; + RunNextOperationIfPossible(std::move(lock)); + + return std::move(operationResult); + } + + template + auto QueueOperation(UniquePtr&& operation) -> decltype(operation->AsAsyncOp()) + { + std::unique_lock lock{ m_mutex }; + + auto asyncOp = operation->AsAsyncOp(); + m_operationQueue.emplace(operation.release()); + + RunNextOperationIfPossible(std::move(lock)); + + return asyncOp; + } + +private: + void RunNextOperationIfPossible(std::unique_lock&& lock) + { + if (!m_runningOperation && !m_operationQueue.empty()) + { + UniquePtr operation = std::move(m_operationQueue.front()); + m_operationQueue.pop(); + m_runningOperation = operation.get(); + + lock.unlock(); + + RunOperation(std::move(operation)); + } + } + + std::mutex m_mutex; + IOperation* m_runningOperation; // non-owning + Queue> m_operationQueue; +}; + +class ReadOperation : public XAsyncOperation> +{ +public: + ReadOperation(String&& path, PlayFab::RunContext&& rc) : + XAsyncOperation>{ Detail::GetLocalStorageHandlers().queueHandle ? rc.DeriveOnQueue(Detail::GetLocalStorageHandlers().queueHandle) : std::move(rc) }, + m_path{ std::move(path) } + { + } + +private: + HRESULT OnStarted(XAsyncBlock* asyncBlock) noexcept override + { + auto& handlers = Detail::GetLocalStorageHandlers(); + return handlers.read(handlers.context, m_path.data(), asyncBlock); + } + + Result> GetResult(XAsyncBlock* asyncBlock) noexcept override + { + size_t resultSize{ 0 }; + RETURN_IF_FAILED(XAsyncGetResultSize(asyncBlock, &resultSize)); + Vector payload(resultSize); + RETURN_IF_FAILED(XAsyncGetResult(asyncBlock, nullptr, payload.size(), payload.data(), nullptr)); + return payload; + } + + String const m_path; +}; + +class WriteOperation : public XAsyncOperation +{ +public: + WriteOperation(String&& path, Vector&& data, PlayFab::RunContext&& rc) : + XAsyncOperation{ Detail::GetLocalStorageHandlers().queueHandle ? rc.DeriveOnQueue(Detail::GetLocalStorageHandlers().queueHandle) : std::move(rc) }, + m_path{ std::move(path) }, + m_data{ std::move(data) } + { + } + +private: + HRESULT OnStarted(XAsyncBlock* asyncBlock) noexcept override + { + auto& handlers = Detail::GetLocalStorageHandlers(); + return handlers.write(handlers.context, m_path.data(), m_data.size(), m_data.data(), asyncBlock); + } + + String const m_path; + Vector const m_data; +}; + +class ClearOperation : public XAsyncOperation +{ +public: + ClearOperation(String&& path, PlayFab::RunContext&& rc) : + XAsyncOperation{ Detail::GetLocalStorageHandlers().queueHandle ? rc.DeriveOnQueue(Detail::GetLocalStorageHandlers().queueHandle) : std::move(rc) }, + m_path{ std::move(path) } + { + } + +private: + HRESULT OnStarted(XAsyncBlock* asyncBlock) noexcept override + { + auto& handlers = Detail::GetLocalStorageHandlers(); + return handlers.clear(handlers.context, m_path.data(), asyncBlock); + } + + String const m_path; +}; + +class FlushOperation : public IOperation +{ +public: + FlushOperation(PlayFab::RunContext&& rc) : + IOperation{ std::move(rc) }, + m_asyncContext{ MakeShared>() } + { + } + + AsyncOp AsAsyncOp() noexcept + { + return m_asyncContext; + } + +private: + void OnStarted(UniquePtr self) noexcept override + { + m_asyncContext->Complete(Result{ S_OK }); + } + + SharedPtr> m_asyncContext; +}; + + +LocalStorage::LocalStorage() : m_state{ MakeShared() } +{ +} + +AsyncOp> LocalStorage::Read( + String path, + RunContext runContext +) noexcept +{ + auto operation = MakeUnique( + std::move(path), + std::move(runContext) + ); + + return m_state->QueueOperation(std::move(operation)).Then(std::bind(&State::StorageOperationContinuation>, m_state, std::placeholders::_1)); +} + +AsyncOp LocalStorage::Write( + String path, + Vector&& data, + RunContext runContext +) noexcept +{ + auto operation = MakeUnique( + std::move(path), + std::move(data), + std::move(runContext) + ); + + return m_state->QueueOperation(std::move(operation)).Then(std::bind(&State::StorageOperationContinuation, m_state, std::placeholders::_1)); +} + + +AsyncOp LocalStorage::Clear( + String path, + RunContext runContext +) noexcept +{ + auto operation = MakeUnique( + std::move(path), + std::move(runContext) + ); + + return m_state->QueueOperation(std::move(operation)).Then(std::bind(&State::StorageOperationContinuation, m_state, std::placeholders::_1)); +} + +AsyncOp LocalStorage::Flush( + RunContext runContext +) noexcept +{ + auto operation = MakeUnique(std::move(runContext)); + + return m_state->QueueOperation(std::move(operation)).Then(std::bind(&State::StorageOperationContinuation, m_state, std::placeholders::_1)); +} + +} diff --git a/Source/PlayFabCore/Source/Platform/LocalStorage.h b/Source/PlayFabCore/Source/Platform/LocalStorage.h new file mode 100644 index 0000000..1eebd8e --- /dev/null +++ b/Source/PlayFabCore/Source/Platform/LocalStorage.h @@ -0,0 +1,30 @@ +#pragma once + +#include "AsyncOp.h" + +namespace PlayFab +{ + +class LocalStorage +{ +public: + LocalStorage(); + LocalStorage(LocalStorage const&) = default; + LocalStorage& operator=(LocalStorage const&) = default; + ~LocalStorage() = default; + + // Storage operations + AsyncOp> Read(String path, RunContext runContext) noexcept; + AsyncOp Write(String path, Vector&& data, RunContext runContext) noexcept; + AsyncOp Clear(String path, RunContext runContext) noexcept; + + // Wait until all pending storage operations complete + AsyncOp Flush(RunContext runContext) noexcept; + +private: + class State; + + SharedPtr m_state; +}; + +} diff --git a/Source/PlayFabCore/Source/Platform/LocalStorageHandlers.cpp b/Source/PlayFabCore/Source/Platform/LocalStorageHandlers.cpp new file mode 100644 index 0000000..44626be --- /dev/null +++ b/Source/PlayFabCore/Source/Platform/LocalStorageHandlers.cpp @@ -0,0 +1,218 @@ +#include "stdafx.h" +#include "LocalStorageHandlers.h" + +namespace PlayFab +{ +namespace Detail +{ + +// Synchronous LocalStorage handlers based on cstdio and std::fstream objects +Result> DefaultLocalStorageRead(String const& path) +{ + std::ifstream file{ path.c_str(), std::ios::binary | std::ios::ate }; + if (!file.is_open()) + { + // Assume success with no result payload because file does not exist + return Vector{}; + } + + int64_t size = file.tellg(); + if (size < 0) + { + return E_FAIL; + } + + file.seekg(0); + + Vector data(static_cast(size)); + + file.read(reinterpret_cast(data.data()), static_cast(data.size())); + if (!file.good()) + { + return E_FAIL; + } + + assert(size == file.gcount()); + return data; +} + +HRESULT DefaultLocalStorageWrite(String const& path, Vector const& data) +{ + std::ofstream file{ path.data(), std::ios::binary | std::ios::app }; + if (!file.is_open()) + { + return E_FAIL; + } + + file.write(reinterpret_cast(data.data()), static_cast(data.size())); + if (!file.good()) + { + return E_FAIL; + } + + return S_OK; +} + +HRESULT DefaultLocalStorageClear(String const& path) +{ + int res = std::remove(path.data()); + if (res != 0) + { + // Failing to delete a file that doesn't exist shouldn't be classified + // as a problem. Unfortunately this result comes back as -1 so to check + // for it we would have to make a call to explicitly check. Since this + // seems error prone and unneeded, just swallow the error. + } + + return S_OK; +} + +enum class LocalStorageOperationType +{ + Read, + Write, + Clear +}; + +struct LocalStorageProviderContext +{ + LocalStorageOperationType operationType; + String path; + Vector data; +}; + + +HRESULT CALLBACK LocalStorageOperationAsyncProvider(_In_ XAsyncOp op, _Inout_ const XAsyncProviderData* data) noexcept +{ + auto context = static_cast(data->context); + + switch (op) + { + case XAsyncOp::Begin: + { + return XAsyncSchedule(data->async, 0); + } + case XAsyncOp::DoWork: + try + { + switch (context->operationType) + { + case LocalStorageOperationType::Read: + { + size_t resultSize = 0; + auto result = DefaultLocalStorageRead(context->path); + if (SUCCEEDED(result.hr)) + { + context->data = result.ExtractPayload(); + resultSize = context->data.size(); + } + XAsyncComplete(data->async, result.hr, resultSize); + break; + } + case LocalStorageOperationType::Write: + { + XAsyncComplete(data->async, DefaultLocalStorageWrite(context->path, context->data), 0); + break; + } + case LocalStorageOperationType::Clear: + { + XAsyncComplete(data->async, DefaultLocalStorageClear(context->path), 0); + break; + } + default: + { + assert(false); + return E_UNEXPECTED; + } + } + + return S_OK; + } + catch (...) + { + return CurrentExceptionToHR(); + } + case XAsyncOp::GetResult: + { + assert(context->operationType == LocalStorageOperationType::Read); + assert(context->data.size() == data->bufferSize); + memcpy(data->buffer, context->data.data(), data->bufferSize); + return S_OK; + } + case XAsyncOp::Cleanup: + { + UniquePtr reclaim{ context }; + return S_OK; + } + default: + { + return S_OK; + } + } +} + +HRESULT STDAPIVCALLTYPE DefaultLocalStorageWriteAsync( + _In_opt_ void* /*context*/, + _In_z_ const char* key, + _In_ size_t dataSize, + _In_reads_bytes_(dataSize) void const* data, + _Inout_ XAsyncBlock* async +) noexcept +{ + assert(key); + assert(dataSize > 0 && data); + + UniquePtr providerContext{ new (Allocator{}.allocate(1)) LocalStorageProviderContext + { + LocalStorageOperationType::Write, + key, + Vector((uint8_t*)data, (uint8_t*)data + dataSize) + } }; + + RETURN_IF_FAILED(XAsyncBegin(async, providerContext.get(), nullptr, __FUNCTION__, LocalStorageOperationAsyncProvider)); + providerContext.release(); + return S_OK; +} + +HRESULT STDAPIVCALLTYPE DefaultLocalStorageReadAsync( + _In_opt_ void* /*context*/, + _In_z_ const char* key, + _Inout_ XAsyncBlock* async +) noexcept +{ + assert(key); + + UniquePtr providerContext{ new (Allocator{}.allocate(1)) LocalStorageProviderContext + { + LocalStorageOperationType::Read, + key, + Vector{} + } }; + + RETURN_IF_FAILED(XAsyncBegin(async, providerContext.get(), nullptr, __FUNCTION__, LocalStorageOperationAsyncProvider)); + providerContext.release(); + return S_OK; +} + +HRESULT STDAPIVCALLTYPE DefaultLocalStorageClearAsync( + _In_opt_ void* /*context*/, + _In_z_ const char* key, + _Inout_ XAsyncBlock* async +) +{ + assert(key); + + UniquePtr providerContext{ new (Allocator{}.allocate(1)) LocalStorageProviderContext + { + LocalStorageOperationType::Clear, + key, + Vector{} + } }; + + RETURN_IF_FAILED(XAsyncBegin(async, providerContext.get(), nullptr, __FUNCTION__, LocalStorageOperationAsyncProvider)); + providerContext.release(); + return S_OK; +} + +} +} diff --git a/Source/PlayFabCore/Source/Platform/LocalStorageHandlers.h b/Source/PlayFabCore/Source/Platform/LocalStorageHandlers.h new file mode 100644 index 0000000..fac4e1d --- /dev/null +++ b/Source/PlayFabCore/Source/Platform/LocalStorageHandlers.h @@ -0,0 +1,29 @@ +#pragma once + +namespace PlayFab +{ +namespace Detail +{ + +HRESULT STDAPIVCALLTYPE DefaultLocalStorageWriteAsync( + _In_opt_ void* /*context*/, + _In_z_ const char* key, + _In_ size_t dataSize, + _In_reads_bytes_(dataSize) void const* data, + _Inout_ XAsyncBlock* async +) noexcept; + +HRESULT STDAPIVCALLTYPE DefaultLocalStorageReadAsync( + _In_opt_ void* /*context*/, + _In_z_ const char* key, + _Inout_ XAsyncBlock* async +) noexcept; + +HRESULT STDAPIVCALLTYPE DefaultLocalStorageClearAsync( + _In_opt_ void* /*context*/, + _In_z_ const char* key, + _Inout_ XAsyncBlock* async +); + +} +} diff --git a/Source/PlayFabCore/Source/Platform/Platform.cpp b/Source/PlayFabCore/Source/Platform/Platform.cpp new file mode 100644 index 0000000..da2d06e --- /dev/null +++ b/Source/PlayFabCore/Source/Platform/Platform.cpp @@ -0,0 +1,59 @@ +#include "stdafx.h" +#include "Platform.h" +#include "LocalStorageHandlers.h" + +#ifdef _DEBUG +// The SDK should never rely on the new or delete operators - all allocations should be hooked and +// route through the configured memory hooks (or the default memory functions, which use std::malloc and std::free). +// If these operators are ever used, it indicates we have an allocation that is unhooked and needs to be. + +void* operator new(size_t size) +{ +#if HC_PLATFORM == HC_PLATFORM_GDK + assert(false); +#endif + return malloc(size); +} + +void operator delete(void* p) +{ + if (p) + { + // rapidjson sometimes calls delete on a nullptr, which by C++ standard is a no-op. Don't flag this as + // an unhooked allocation +#if HC_PLATFORM == HC_PLATFORM_GDK + assert(false); +#endif + free(p); + } +} +#endif + +namespace PlayFab +{ +namespace Detail +{ + +PFLocalStorageHooks& GetLocalStorageHandlers() +{ + static PFLocalStorageHooks s_handlers{ nullptr, DefaultLocalStorageReadAsync, DefaultLocalStorageWriteAsync, DefaultLocalStorageClearAsync, nullptr }; + return s_handlers; +} + +HRESULT SetLocalStorageHandlers(PFLocalStorageHooks& newHandlers) +{ + auto& handlers = GetLocalStorageHandlers(); + + if (newHandlers.write && newHandlers.read && newHandlers.clear) + { + handlers = newHandlers; + } + else + { + return E_INVALIDARG; + } + return S_OK; +} + +} +} diff --git a/Source/PlayFabCore/Source/Platform/Platform.h b/Source/PlayFabCore/Source/Platform/Platform.h new file mode 100644 index 0000000..12d7932 --- /dev/null +++ b/Source/PlayFabCore/Source/Platform/Platform.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +namespace PlayFab +{ +namespace Detail +{ + +PFLocalStorageHooks& GetLocalStorageHandlers(); +HRESULT SetLocalStorageHandlers(PFLocalStorageHooks& hooks); + +} + +} diff --git a/Source/PlayFabCore/Source/Trace/DebugTraceOutput.cpp b/Source/PlayFabCore/Source/Trace/DebugTraceOutput.cpp new file mode 100644 index 0000000..da5c3db --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/DebugTraceOutput.cpp @@ -0,0 +1,18 @@ +#include "stdafx.h" +#include "DebugTraceOutput.h" + +namespace PlayFab +{ + +void DebugTraceOutput::TraceMessage(const char* message) noexcept +{ + TraceSettings& settings = GetTraceSettings(); + if (settings.traceToDebugger) + { +#if defined(_WIN32) + OutputDebugStringA(message); +#endif + } +} + +} diff --git a/Source/PlayFabCore/Source/Trace/DebugTraceOutput.h b/Source/PlayFabCore/Source/Trace/DebugTraceOutput.h new file mode 100644 index 0000000..ac35846 --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/DebugTraceOutput.h @@ -0,0 +1,14 @@ +#pragma once + +#include "TraceState.h" + +namespace PlayFab +{ + +// TraceOutput that redirects to debug output +struct DebugTraceOutput : public TraceOutput +{ + void TraceMessage(const char* message) noexcept override; +}; + +} diff --git a/Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.cpp b/Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.cpp new file mode 100644 index 0000000..6a27002 --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.cpp @@ -0,0 +1,36 @@ +#include "stdafx.h" +#include "LocalStorageTraceOutput.h" + +namespace PlayFab +{ + +LocalStorageTraceOutput::LocalStorageTraceOutput(RunContext rc, LocalStorage localStorage, String traceFileDirectory) noexcept : + m_rc{ std::move(rc) }, + m_localStorage{ std::move(localStorage) } +{ + Stringstream filepath; + filepath << traceFileDirectory << s_traceFilename; + + m_traceFilePath = filepath.str(); + + // Clear any existing trace file + m_localStorage.Clear(m_traceFilePath, m_rc).Wait(); +} + +void LocalStorageTraceOutput::TraceMessage(const char* message) noexcept +{ + // Write each message to LocalStorage as they arrive. If performance becomes a concern, we could do some in memory buffering + // and only write to LocalStorage when we have a sufficiently large payload. + + m_localStorage.Write(m_traceFilePath, Vector(message, message + std::strlen(message)), m_rc).Finally([](Result writeResult) + { + // Local Storage write failed. Don't trace this as that would recursively call TraceMessage, just eat the error. + }); +} + +void LocalStorageTraceOutput::Stop() noexcept +{ + m_localStorage.Flush(m_rc).Wait(); +} + +} diff --git a/Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.h b/Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.h new file mode 100644 index 0000000..cc6cf11 --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/LocalStorageTraceOutput.h @@ -0,0 +1,25 @@ +#pragma once + +#include "TraceState.h" + +namespace PlayFab +{ + +// TraceOutput that redirects to local storage +struct LocalStorageTraceOutput : public TraceOutput +{ +public: + LocalStorageTraceOutput(RunContext rc, LocalStorage localStorage, String traceFileDirectory) noexcept; + + void TraceMessage(const char* message) noexcept override; + void Stop() noexcept override; + +private: + RunContext m_rc; + LocalStorage m_localStorage; + String m_traceFilePath; + + static constexpr char s_traceFilename[] = "PlayFabTrace.txt"; +}; + +} diff --git a/Source/PlayFabCore/Source/Trace/TraceState.cpp b/Source/PlayFabCore/Source/Trace/TraceState.cpp new file mode 100644 index 0000000..2a68fcf --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/TraceState.cpp @@ -0,0 +1,344 @@ +#include "stdafx.h" +#include "TraceState.h" +#include "JsonUtils.h" +#include "Platform/LocalStorage.h" +#include "LocalStorageTraceOutput.h" +#include "DebugTraceOutput.h" +#if HC_PLATFORM_IS_MICROSOFT +#include "Windows/ETWTraceOutput.h" +#endif + +namespace PlayFab +{ + +static constexpr char s_configFile[] = "PlayFabTraceSettings.json"; + +TraceSettings& GetTraceSettings() +{ + static TraceSettings s_settings; + return s_settings; +} + +enum class AccessMode +{ + Initialize, + Get, + Cleanup +}; + +HRESULT AccessTraceState(AccessMode mode, SharedPtr& traceState) +{ + struct TraceStateHolder + { + SharedPtr const state; + }; + + static std::atomic s_traceStateHolder{ nullptr }; + assert(s_traceStateHolder.is_lock_free()); + + switch (mode) + { + case AccessMode::Initialize: + { + RETURN_HR_IF(E_PF_CORE_ALREADY_INITIALIZED, s_traceStateHolder.load() != nullptr); + RETURN_HR_INVALIDARG_IF_NULL(traceState); + + UniquePtr stateHolder{ new (Allocator{}.allocate(1)) TraceStateHolder{ traceState } }; + + TraceStateHolder* expected{ nullptr }; + if (!s_traceStateHolder.compare_exchange_strong(expected, stateHolder.get())) + { + return E_PF_CORE_ALREADY_INITIALIZED; + } + + stateHolder.release(); // reclaimed via AccessMode::Cleanup + + return S_OK; + } + case AccessMode::Get: + { + TraceStateHolder* traceStateHolder = s_traceStateHolder.load(); + + RETURN_HR_IF(E_PF_CORE_NOT_INITIALIZED, !traceStateHolder); + assert(traceStateHolder->state); + traceState = traceStateHolder->state; + + return S_OK; + } + case AccessMode::Cleanup: + { + UniquePtr traceStateHolder{ s_traceStateHolder.exchange(nullptr) }; + + RETURN_HR_IF(E_PF_CORE_NOT_INITIALIZED, !traceStateHolder); + traceState = traceStateHolder->state; + + return S_OK; + } + default: + { + assert(false); + return E_UNEXPECTED; + } + } +} + +TraceState::TraceState(RunContext&& runContext, LocalStorage localStorage) noexcept : + m_runContext{ std::move(runContext) } +{ + // Init LibHttpClient Tracing + HCTraceInit(); +#ifdef _DEBUG + HCSettingsSetTraceLevel(HCTraceLevel::Verbose); +#endif + HCTraceSetClientCallback(TraceCallback); + + // Synchronously load trace settings. TraceSettings loaded from file override those configured via API + // TODO document location, name, and format of TraceSettings file. It should just be a Json serialized + // version of the TraceSettings struct: + // { + // "enableTraceToFile": true, + // "traceFileDirectory": "", + // "traceToDebugger": false + // } + // If the trace settings file is not present or is malformed, it will simply be ignored and default values + // will be used for TraceSettings. + + TraceSettings& settings = GetTraceSettings(); + + Result> readResult = localStorage.Read(s_configFile, m_runContext).Wait(); + if (SUCCEEDED(readResult.hr)) + { + auto fileData{ readResult.ExtractPayload() }; + + JsonDocument fileJson{ &JsonUtils::allocator, JsonUtils::kDefaultStackCapacity, &JsonUtils::allocator }; + fileJson.Parse(reinterpret_cast(fileData.data()), fileData.size()); + if (!fileJson.HasParseError()) + { + JsonUtils::ObjectGetMember(fileJson, "enableTraceToFile", settings.enableTraceToFile); + JsonUtils::ObjectGetMember(fileJson, "traceToDebugger", settings.traceToDebugger); + String traceFileDirectory; + if (SUCCEEDED(JsonUtils::ObjectGetMember(fileJson, "traceFileDirectory", traceFileDirectory))) + { + StrCpy(settings.traceFileDirectory, sizeof(settings.traceFileDirectory), traceFileDirectory.data()); + } + } + } + + // Add appropriate TraceOutputs based on TraceSettings and Platform + if (settings.enableTraceToFile) + { + m_outputs.emplace_back(MakeShared(m_runContext.Derive(), std::move(localStorage), settings.traceFileDirectory)); + } + if (settings.traceToDebugger) + { + m_outputs.emplace_back(MakeShared()); + } +#if HC_PLATFORM_IS_MICROSOFT + m_outputs.emplace_back(MakeShared()); +#endif +} + +TraceState::~TraceState() noexcept +{ + // Intentionally skip calling HCTraceSetClientCallback(nullptr) here. If PFInitialize is called twice, + // the second call will fail, but not before creating a second TraceState oject. When the second TraceState + // object is destroyed, it will reset the static callback used by the original TraceState instance. + + HCTraceCleanup(); +} + +HRESULT TraceState::Create(RunContext&& runContext, LocalStorage localStorage) noexcept +{ + Allocator a{}; + SharedPtr traceState{ new (a.allocate(1)) TraceState{ std::move(runContext), std::move(localStorage) }, Deleter{}, a }; + + return AccessTraceState(AccessMode::Initialize, traceState); +} + +HRESULT TraceState::Get(SharedPtr& state) noexcept +{ + return AccessTraceState(AccessMode::Get, state); +} + +struct CleanupContext +{ + SharedPtr traceState; + XAsyncBlock* asyncBlock; +}; + +HRESULT TraceState::CleanupAsync(XAsyncBlock* async) noexcept +{ + try + { + UniquePtr context = MakeUnique(); + RETURN_IF_FAILED(XAsyncBegin(async, context.get(), __FUNCTION__, __FUNCTION__, CleanupAsyncProvider)); + context.release(); + return S_OK; + } + catch (...) + { + return CurrentExceptionToHR(); + } +} + +HRESULT CALLBACK TraceState::CleanupAsyncProvider(XAsyncOp op, XAsyncProviderData const* data) noexcept +{ + static constexpr uint32_t s_pollDelayMs{ 10 }; + CleanupContext* context{ static_cast(data->context) }; + + switch (op) + { + case XAsyncOp::Begin: + { + // After this no other thread will be able to access TraceState if they don't already have a reference to it + RETURN_IF_FAILED(AccessTraceState(AccessMode::Cleanup, context->traceState)); + context->asyncBlock = data->async; + + return XAsyncSchedule(data->async, 0); + } + case XAsyncOp::DoWork: + { + // If there aren't any other remaining reference to TraceState, Terminate the RunContext and destroy it. Otherwise + // wait until we have the last remaining reference + if (context->traceState.use_count() > 1) + { + RETURN_IF_FAILED(XAsyncSchedule(data->async, s_pollDelayMs)); + return E_PENDING; + } + + // Give TraceOutputs a chance to finish naturally before terminating RunContext. Terminating RunContext immediately may lead to + // lost trace messages in some cases + for (auto& output : context->traceState->m_outputs) + { + output->Stop(); + } + + // Forcibily terminate any remaining work + context->traceState->m_runContext.Terminate(*context->traceState, context); + return E_PENDING; + } + default: + { + return S_OK; + } + } +} + +void TraceState::OnTerminated(void* c) noexcept +{ + UniquePtr context{ static_cast(c) }; + XAsyncBlock* asyncBlock{ context->asyncBlock }; // Keep copy of asyncBlock pointer to complete after cleaning up context + + // Cleanup context. TraceState will be destroyed here + context.reset(); + + // TraceState fully cleaned up! + XAsyncComplete(asyncBlock, S_OK, 0); +} + +// Trace helpers +template +int stprintf_s(char(&buffer)[SIZE], _Printf_format_string_ char const* format ...) noexcept +{ + va_list varArgs{}; + va_start(varArgs, format); + auto result = vsnprintf(buffer, SIZE, format, varArgs); + va_end(varArgs); + return result; +} + +int stprintf_s(char* buffer, size_t size, _Printf_format_string_ char const* format ...) noexcept +{ + va_list varArgs{}; + va_start(varArgs, format); + auto result = vsnprintf(buffer, size, format, varArgs); + va_end(varArgs); + return result; +} + +template +int vstprintf_s(char(&buffer)[SIZE], _Printf_format_string_ char const* format, va_list varArgs) noexcept +{ + return vsnprintf(buffer, SIZE, format, varArgs); +} + +String FormatString(_In_z_ _Printf_format_string_ const char* format, ...) +{ + va_list args; + va_start(args, format); + Vector buffer(1 + std::vsnprintf(NULL, 0, format, args)); + std::vsnprintf(buffer.data(), buffer.size(), format, args); + va_end(args); + String strBuffer(buffer.begin(), buffer.end()); + return strBuffer; +} + +void CALLBACK TraceState::TraceCallback( + _In_z_ const char* areaName, + _In_ HCTraceLevel level, + _In_ uint64_t threadId, + _In_ uint64_t timestamp, + _In_z_ const char* message +) noexcept +{ + SharedPtr state; + TraceState::Get(state); + if (!state) + { + return; + } + + TraceSettings& settings = GetTraceSettings(); + if (settings.traceCallback) + { + settings.traceCallback(areaName, level, threadId, timestamp, message); + } + + if (state->m_outputs.empty()) + { + // Early out if we have no outputs + return; + } + + // Needs to match the HCTraceLevel enum + static char const* traceLevelNames[] = + { + "Off", + "E", + "W", + "P", + "I", + "V", + }; + + std::time_t timeTInSec = static_cast(timestamp / 1000); + uint32_t fractionMSec = static_cast(timestamp % 1000); + std::tm fmtTime = {}; + +#if _WIN32 + localtime_s(&fmtTime, &timeTInSec); +#elif HC_PLATFORM_IS_PLAYSTATION + localtime_s(&timeTInSec, &fmtTime); +#else + localtime_r(&timeTInSec, &fmtTime); +#endif + + String formattedMessage = FormatString("[%04llX][%s][%02d:%02d:%02d.%03u][%s] %s\r\n", + threadId, + traceLevelNames[static_cast(level)], + fmtTime.tm_hour, + fmtTime.tm_min, + fmtTime.tm_sec, + fractionMSec, + areaName, + message + ); + + auto outputs = state->m_outputs; + for (auto& output : outputs) + { + output->TraceMessage(formattedMessage.c_str()); + } +} + +} diff --git a/Source/PlayFabCore/Source/Trace/TraceState.h b/Source/PlayFabCore/Source/Trace/TraceState.h new file mode 100644 index 0000000..00f9370 --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/TraceState.h @@ -0,0 +1,66 @@ +#pragma once + +#include +#include "RunContext.h" +#include "Platform/LocalStorage.h" + +namespace PlayFab +{ + +// Static TraceSettings that need to be configured prior to calling PFInitialize +struct TraceSettings +{ + bool enableTraceToFile{ false }; + char traceFileDirectory[FILENAME_MAX]{ 0 }; + bool traceToDebugger{ false }; + HCTraceCallback* traceCallback{ nullptr }; +}; + +TraceSettings& GetTraceSettings(); + +// Interface for a trace output +struct TraceOutput +{ + virtual ~TraceOutput() = default; + + virtual void TraceMessage(const char* message) = 0; + virtual void Stop() {}; +}; + +// Global TraceState that is independent from GlobalState so that initialization and cleanup can be Traced. +// Tracing is routed through LHC trace infrastructure to leverage existing tracing features (message formatting, +// client callbacks, etc.) +class TraceState : public ITerminationListener +{ +public: + TraceState(const TraceState&) = delete; + TraceState& operator=(TraceState) = delete; + ~TraceState() noexcept; + + static HRESULT Create(RunContext&& runContext, LocalStorage localStorage) noexcept; + static HRESULT Get(SharedPtr& state) noexcept; + static HRESULT CleanupAsync(XAsyncBlock* async) noexcept; + +private: + TraceState(RunContext&& runContext, LocalStorage localStorage) noexcept; + + static HRESULT CALLBACK CleanupAsyncProvider(XAsyncOp op, XAsyncProviderData const* data) noexcept; + + static void CALLBACK TraceCallback( + _In_z_ const char* areaName, + _In_ HCTraceLevel level, + _In_ uint64_t threadId, + _In_ uint64_t timestamp, + _In_z_ const char* message + ) noexcept; + + // ITerminationListener + void OnTerminated(void* context) noexcept override; + + RunContext m_runContext; + Vector> m_outputs; +}; + + + +} diff --git a/Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.cpp b/Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.cpp new file mode 100644 index 0000000..c6670c4 --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "ETWTraceOutput.h" + +TRACELOGGING_DEFINE_PROVIDER( + g_hTraceLoggingProvider, + "PlayFabCore", + (0x2b6274b2, 0x159f, 0x4e6f, 0xb8, 0x0, 0xd, 0x17, 0x0, 0x9e, 0x14, 0x7a) // {2B6274B2-159F-4E6F-B800-0D17009E147A} +); + +namespace PlayFab +{ + +// Helper method to ensure our ETW Provider never gets registered twice. Registering an ETW provider twice may result +// in a crash or undefined behavior. See https://learn.microsoft.com/en-us/windows/win32/api/traceloggingprovider/nf-traceloggingprovider-traceloggingregister +// for more details. +void RegisterProvider() +{ + struct ProviderRegistrar + { + ProviderRegistrar() + { + TraceLoggingRegister(g_hTraceLoggingProvider); + } + ~ProviderRegistrar() + { + TraceLoggingUnregister(g_hTraceLoggingProvider); + } + }; + + static ProviderRegistrar s_registrar{}; +} + +ETWTraceOutput::ETWTraceOutput() +{ + RegisterProvider(); +} + +void ETWTraceOutput::TraceMessage(const char* message) noexcept +{ + TraceLoggingWrite( + g_hTraceLoggingProvider, + "PlayFabCore_TraceMessage", + TraceLoggingString(message, "Message") + ); +} + +} diff --git a/Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.h b/Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.h new file mode 100644 index 0000000..a24466a --- /dev/null +++ b/Source/PlayFabCore/Source/Trace/Windows/ETWTraceOutput.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Trace/TraceState.h" +#include + +namespace PlayFab +{ + +class ETWTraceOutput : public TraceOutput +{ +public: + ETWTraceOutput(); + void TraceMessage(const char* message) noexcept override; +}; + +} \ No newline at end of file diff --git a/Source/PlayFabCore/Source/stdafx.cpp b/Source/PlayFabCore/Source/stdafx.cpp new file mode 100644 index 0000000..fd4f341 --- /dev/null +++ b/Source/PlayFabCore/Source/stdafx.cpp @@ -0,0 +1 @@ +#include "stdafx.h" diff --git a/Source/PlayFabCore/Source/stdafx.h b/Source/PlayFabCore/Source/stdafx.h new file mode 100644 index 0000000..7b9e461 --- /dev/null +++ b/Source/PlayFabCore/Source/stdafx.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// libHttpClient headers +#include +#include + +#include + +// PlayFabSharedInternal +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// PlayFabCore +#include "Generated/Types.h" diff --git a/Source/PlayFabServices/API-List.csv b/Source/PlayFabServices/API-List.csv new file mode 100644 index 0000000..7d6b5da --- /dev/null +++ b/Source/PlayFabServices/API-List.csv @@ -0,0 +1,587 @@ +Library,Feature Group,API Name,Auth,Subgroup,Call Name,Trimmed?,GDK?,Win32?,Switch?,PlayStation? +PF Services,ScheduledTask,PFScheduledTaskAdminAbortTaskInstanceAsync,SecretKey,ScheduledTask,AdminAbortTaskInstance,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminCreateActionsOnPlayersInSegmentTaskAsync,SecretKey,ScheduledTask,AdminCreateActionsOnPlayersInSegmentTask,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminCreateCloudScriptTaskAsync,SecretKey,ScheduledTask,AdminCreateCloudScriptTask,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminCreateInsightsScheduledScalingTaskAsync,SecretKey,ScheduledTask,AdminCreateInsightsScheduledScalingTask,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminDeleteTaskAsync,SecretKey,ScheduledTask,AdminDeleteTask,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminGetActionsOnPlayersInSegmentTaskInstanceAsync,SecretKey,ScheduledTask,AdminGetActionsOnPlayersInSegmentTaskInstance,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminGetCloudScriptTaskInstanceAsync,SecretKey,ScheduledTask,AdminGetCloudScriptTaskInstance,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminGetTaskInstancesAsync,SecretKey,ScheduledTask,AdminGetTaskInstances,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminGetTasksAsync,SecretKey,ScheduledTask,AdminGetTasks,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminRunTaskAsync,SecretKey,ScheduledTask,AdminRunTask,false,No,No,No,No +PF Services,ScheduledTask,PFScheduledTaskAdminUpdateTaskAsync,SecretKey,ScheduledTask,AdminUpdateTask,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminAddLocalizedNewsAsync,SecretKey,Title-Wide Data Management,AdminAddLocalizedNews,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminAddNewsAsync,SecretKey,Title-Wide Data Management,AdminAddNews,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminAddVirtualCurrencyTypesAsync,SecretKey,Title-Wide Data Management,AdminAddVirtualCurrencyTypes,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminDeleteStoreAsync,SecretKey,Title-Wide Data Management,AdminDeleteStore,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminDeleteTitleDataOverrideAsync,SecretKey,Title-Wide Data Management,AdminDeleteTitleDataOverride,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminGetCatalogItemsAsync,SecretKey,Title-Wide Data Management,AdminGetCatalogItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminGetPublisherDataAsync,SecretKey,Title-Wide Data Management,AdminGetPublisherData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminGetRandomResultTablesAsync,SecretKey,Title-Wide Data Management,AdminGetRandomResultTables,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminGetStoreItemsAsync,SecretKey,Title-Wide Data Management,AdminGetStoreItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminGetTitleDataAsync,SecretKey,Title-Wide Data Management,AdminGetTitleData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminGetTitleInternalDataAsync,SecretKey,Title-Wide Data Management,AdminGetTitleInternalData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminListVirtualCurrencyTypesAsync,SecretKey,Title-Wide Data Management,AdminListVirtualCurrencyTypes,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminRemoveVirtualCurrencyTypesAsync,SecretKey,Title-Wide Data Management,AdminRemoveVirtualCurrencyTypes,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminSetCatalogItemsAsync,SecretKey,Title-Wide Data Management,AdminSetCatalogItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminSetPublisherDataAsync,SecretKey,Shared Group Data,AdminSetPublisherData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminSetStoreItemsAsync,SecretKey,Title-Wide Data Management,AdminSetStoreItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminSetTitleDataAsync,SecretKey,Title-Wide Data Management,AdminSetTitleData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminSetTitleDataAndOverridesAsync,SecretKey,Title-Wide Data Management,AdminSetTitleDataAndOverrides,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminSetTitleInternalDataAsync,SecretKey,Title-Wide Data Management,AdminSetTitleInternalData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminSetupPushNotificationAsync,SecretKey,Title-Wide Data Management,AdminSetupPushNotification,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminUpdateCatalogItemsAsync,SecretKey,Title-Wide Data Management,AdminUpdateCatalogItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminUpdateRandomResultTablesAsync,SecretKey,Title-Wide Data Management,AdminUpdateRandomResultTables,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementAdminUpdateStoreItemsAsync,SecretKey,Title-Wide Data Management,AdminUpdateStoreItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementClientGetCatalogItemsAsync,SessionTicket,Title-Wide Data Management,ClientGetCatalogItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementClientGetPublisherDataAsync,SessionTicket,Title-Wide Data Management,ClientGetPublisherData,false,Yes,Yes,Yes,Yes +PF Services,TitleDataManagement,PFTitleDataManagementClientGetStoreItemsAsync,SessionTicket,Title-Wide Data Management,ClientGetStoreItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementClientGetTimeAsync,SessionTicket,Title-Wide Data Management,ClientGetTime,false,Yes,Yes,Yes,Yes +PF Services,TitleDataManagement,PFTitleDataManagementClientGetTitleDataAsync,SessionTicket,Title-Wide Data Management,ClientGetTitleData,false,Yes,Yes,Yes,Yes +PF Services,TitleDataManagement,PFTitleDataManagementClientGetTitleNewsAsync,SessionTicket,Title-Wide Data Management,ClientGetTitleNews,false,Yes,Yes,Yes,Yes +PF Services,TitleDataManagement,PFTitleDataManagementServerGetCatalogItemsAsync,SecretKey,Title-Wide Data Management,ServerGetCatalogItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerGetPublisherDataAsync,SecretKey,Title-Wide Data Management,ServerGetPublisherData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerGetStoreItemsAsync,SecretKey,Title-Wide Data Management,ServerGetStoreItems,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerGetTimeAsync,SecretKey,Title-Wide Data Management,ServerGetTime,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerGetTitleDataAsync,SecretKey,Title-Wide Data Management,ServerGetTitleData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerGetTitleInternalDataAsync,SecretKey,Title-Wide Data Management,ServerGetTitleInternalData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerGetTitleNewsAsync,SecretKey,Title-Wide Data Management,ServerGetTitleNews,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerSetPublisherDataAsync,SecretKey,Title-Wide Data Management,ServerSetPublisherData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerSetTitleDataAsync,SecretKey,Title-Wide Data Management,ServerSetTitleData,false,No,No,No,No +PF Services,TitleDataManagement,PFTitleDataManagementServerSetTitleInternalDataAsync,SecretKey,Title-Wide Data Management,ServerSetTitleInternalData,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminAddPlayerTagAsync,SecretKey,PlayStream,AdminAddPlayerTag,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminCreateSegmentAsync,SecretKey,Segments,AdminCreateSegment,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminDeleteSegmentAsync,SecretKey,Segments,AdminDeleteSegment,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminExportPlayersInSegmentAsync,SecretKey,PlayStream,AdminExportPlayersInSegment,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminGetAllSegmentsAsync,SecretKey,PlayStream,AdminGetAllSegments,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminGetPlayerSegmentsAsync,SecretKey,PlayStream,AdminGetPlayerSegments,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminGetPlayersInSegmentAsync,SecretKey,PlayStream,AdminGetPlayersInSegment,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminGetPlayerTagsAsync,SecretKey,PlayStream,AdminGetPlayerTags,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminGetSegmentExportAsync,SecretKey,PlayStream,AdminGetSegmentExport,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminGetSegmentsAsync,SecretKey,Segments,AdminGetSegments,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminRemovePlayerTagAsync,SecretKey,PlayStream,AdminRemovePlayerTag,false,No,No,No,No +PF Services,Segments,PFSegmentsAdminUpdateSegmentAsync,SecretKey,Segments,AdminUpdateSegment,false,No,No,No,No +PF Services,Segments,PFSegmentsClientGetPlayerSegmentsAsync,SessionTicket,PlayStream,ClientGetPlayerSegments,false,Yes,Yes,Yes,Yes +PF Services,Segments,PFSegmentsClientGetPlayerTagsAsync,SessionTicket,PlayStream,ClientGetPlayerTags,false,Yes,Yes,Yes,Yes +PF Services,Segments,PFSegmentsServerAddPlayerTagAsync,SecretKey,PlayStream,ServerAddPlayerTag,false,No,No,No,No +PF Services,Segments,PFSegmentsServerGetAllSegmentsAsync,SecretKey,PlayStream,ServerGetAllSegments,false,No,No,No,No +PF Services,Segments,PFSegmentsServerGetPlayerSegmentsAsync,SecretKey,PlayStream,ServerGetPlayerSegments,false,No,No,No,No +PF Services,Segments,PFSegmentsServerGetPlayersInSegmentAsync,SecretKey,PlayStream,ServerGetPlayersInSegment,false,No,No,No,No +PF Services,Segments,PFSegmentsServerGetPlayerTagsAsync,SecretKey,PlayStream,ServerGetPlayerTags,false,No,No,No,No +PF Services,Segments,PFSegmentsServerRemovePlayerTagAsync,SecretKey,PlayStream,ServerRemovePlayerTag,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminAddUserVirtualCurrencyAsync,SecretKey,Player Item Management,AdminAddUserVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminCheckLimitedEditionItemAvailabilityAsync,SecretKey,Player Item Management,AdminCheckLimitedEditionItemAvailability,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminGetUserInventoryAsync,SecretKey,Player Item Management,AdminGetUserInventory,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminGrantItemsToUsersAsync,SecretKey,Player Item Management,AdminGrantItemsToUsers,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminIncrementLimitedEditionItemAvailabilityAsync,SecretKey,Player Item Management,AdminIncrementLimitedEditionItemAvailability,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminRevokeInventoryItemAsync,SecretKey,Player Item Management,AdminRevokeInventoryItem,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminRevokeInventoryItemsAsync,SecretKey,Player Item Management,AdminRevokeInventoryItems,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementAdminSubtractUserVirtualCurrencyAsync,SecretKey,Player Item Management,AdminSubtractUserVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientAddUserVirtualCurrencyAsync,SessionTicket,Player Item Management,ClientAddUserVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientConfirmPurchaseAsync,SessionTicket,Player Item Management,ClientConfirmPurchase,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientConsumeItemAsync,SessionTicket,Player Item Management,ClientConsumeItem,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientGetCharacterInventoryAsync,SessionTicket,Player Item Management,ClientGetCharacterInventory,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientGetPaymentTokenAsync,SessionTicket,Player Item Management,ClientGetPaymentToken,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientGetPurchaseAsync,SessionTicket,Player Item Management,ClientGetPurchase,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientGetUserInventoryAsync,SessionTicket,Player Item Management,ClientGetUserInventory,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientPayForPurchaseAsync,SessionTicket,Player Item Management,ClientPayForPurchase,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientPurchaseItemAsync,SessionTicket,Player Item Management,ClientPurchaseItem,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientRedeemCouponAsync,SessionTicket,Player Item Management,ClientRedeemCoupon,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientStartPurchaseAsync,SessionTicket,Player Item Management,ClientStartPurchase,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientSubtractUserVirtualCurrencyAsync,SessionTicket,Player Item Management,ClientSubtractUserVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientUnlockContainerInstanceAsync,SessionTicket,Player Item Management,ClientUnlockContainerInstance,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementClientUnlockContainerItemAsync,SessionTicket,Player Item Management,ClientUnlockContainerItem,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerAddCharacterVirtualCurrencyAsync,SecretKey,Player Item Management,ServerAddCharacterVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerAddUserVirtualCurrencyAsync,SecretKey,Player Item Management,ServerAddUserVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerConsumeItemAsync,SecretKey,Player Item Management,ServerConsumeItem,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerEvaluateRandomResultTableAsync,SecretKey,Player Item Management,ServerEvaluateRandomResultTable,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerGetCharacterInventoryAsync,SecretKey,Player Item Management,ServerGetCharacterInventory,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerGetRandomResultTablesAsync,SecretKey,Player Item Management,ServerGetRandomResultTables,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerGetUserInventoryAsync,SecretKey,Player Item Management,ServerGetUserInventory,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerGrantItemsToCharacterAsync,SecretKey,Player Item Management,ServerGrantItemsToCharacter,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerGrantItemsToUserAsync,SecretKey,Player Item Management,ServerGrantItemsToUser,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerGrantItemsToUsersAsync,SecretKey,Player Item Management,ServerGrantItemsToUsers,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerModifyItemUsesAsync,SecretKey,Player Item Management,ServerModifyItemUses,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerMoveItemToCharacterFromCharacterAsync,SecretKey,Player Item Management,ServerMoveItemToCharacterFromCharacter,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerMoveItemToCharacterFromUserAsync,SecretKey,Player Item Management,ServerMoveItemToCharacterFromUser,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerMoveItemToUserFromCharacterAsync,SecretKey,Player Item Management,ServerMoveItemToUserFromCharacter,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerRedeemCouponAsync,SecretKey,Player Item Management,ServerRedeemCoupon,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerReportPlayerAsync,SecretKey,Player Item Management,ServerReportPlayer,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerRevokeInventoryItemAsync,SecretKey,Player Item Management,ServerRevokeInventoryItem,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerRevokeInventoryItemsAsync,SecretKey,Player Item Management,ServerRevokeInventoryItems,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerSubtractCharacterVirtualCurrencyAsync,SecretKey,Player Item Management,ServerSubtractCharacterVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerSubtractUserVirtualCurrencyAsync,SecretKey,Player Item Management,ServerSubtractUserVirtualCurrency,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerUnlockContainerInstanceAsync,SecretKey,Player Item Management,ServerUnlockContainerInstance,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerUnlockContainerItemAsync,SecretKey,Player Item Management,ServerUnlockContainerItem,false,No,No,No,No +PF Services,PlayerItemManagement,PFPlayerItemManagementServerUpdateUserInventoryItemCustomDataAsync,SecretKey,Player Item Management,ServerUpdateUserInventoryItemCustomData,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminBanUsersAsync,SecretKey,Account Management,AdminBanUsers,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminDeleteMasterPlayerAccountAsync,SecretKey,Account Management,AdminDeleteMasterPlayerAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminDeleteMembershipSubscriptionAsync,SecretKey,Account Management,AdminDeleteMembershipSubscription,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminDeletePlayerAsync,SecretKey,Account Management,AdminDeletePlayer,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminDeleteTitleAsync,SecretKey,Account Management,AdminDeleteTitle,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminExportMasterPlayerDataAsync,SecretKey,Account Management,AdminExportMasterPlayerData,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminGetPlayedTitleListAsync,SecretKey,Account Management,AdminGetPlayedTitleList,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminGetPlayerIdFromAuthTokenAsync,SecretKey,Account Management,AdminGetPlayerIdFromAuthToken,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminGetPlayerProfileAsync,SecretKey,Account Management,AdminGetPlayerProfile,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminGetUserAccountInfoAsync,SecretKey,Account Management,AdminGetUserAccountInfo,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminGetUserBansAsync,SecretKey,Account Management,AdminGetUserBans,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminResetPasswordAsync,SecretKey,Account Management,AdminResetPassword,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminRevokeAllBansForUserAsync,SecretKey,Account Management,AdminRevokeAllBansForUser,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminRevokeBansAsync,SecretKey,Account Management,AdminRevokeBans,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminSendAccountRecoveryEmailAsync,SecretKey,Account Management,AdminSendAccountRecoveryEmail,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminSetMembershipOverrideAsync,SecretKey,Account Management,AdminSetMembershipOverride,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminUpdateBansAsync,SecretKey,Account Management,AdminUpdateBans,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementAdminUpdateUserTitleDisplayNameAsync,SecretKey,Account Management,AdminUpdateUserTitleDisplayName,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientAddGenericIDAsync,SessionTicket,Account Management,ClientAddGenericID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientAddOrUpdateContactEmailAsync,SessionTicket,Account Management,ClientAddOrUpdateContactEmail,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientAddUsernamePasswordAsync,SessionTicket,Account Management,ClientAddUsernamePassword,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetAccountInfoAsync,SessionTicket,Account Management,ClientGetAccountInfo,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientGetPlayerCombinedInfoAsync,SessionTicket,Account Management,ClientGetPlayerCombinedInfo,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientGetPlayerProfileAsync,SessionTicket,Account Management,ClientGetPlayerProfile,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromFacebookIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromFacebookIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromFacebookInstantGamesIds,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromGameCenterIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromGenericIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromGenericIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromGoogleIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromGoogleIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromKongregateIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromKongregateIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromNintendoServiceAccountIds,false,No,No,Yes,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromNintendoSwitchDeviceIds,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromPSNAccountIDs,false,No,No,No,Yes +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromSteamIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromSteamIDs,false,No,Yes,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromTwitchIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromTwitchIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsAsync,SessionTicket,Account Management,ClientGetPlayFabIDsFromXboxLiveIDs,false,Yes,Yes,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkAndroidDeviceIDAsync,SessionTicket,Account Management,ClientLinkAndroidDeviceID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkAppleAsync,SessionTicket,Account Management,ClientLinkApple,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkCustomIDAsync,SessionTicket,Account Management,ClientLinkCustomID,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientLinkFacebookAccountAsync,SessionTicket,Account Management,ClientLinkFacebookAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkFacebookInstantGamesIdAsync,SessionTicket,Account Management,ClientLinkFacebookInstantGamesId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkGameCenterAccountAsync,SessionTicket,Account Management,ClientLinkGameCenterAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkGoogleAccountAsync,SessionTicket,Account Management,ClientLinkGoogleAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkGooglePlayGamesServicesAccountAsync,SessionTicket,Account Management,ClientLinkGooglePlayGamesServicesAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkIOSDeviceIDAsync,SessionTicket,Account Management,ClientLinkIOSDeviceID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkKongregateAsync,SessionTicket,Account Management,ClientLinkKongregate,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkNintendoServiceAccountAsync,SessionTicket,Account Management,ClientLinkNintendoServiceAccount,false,No,No,Yes,No +PF Services,AccountManagement,PFAccountManagementClientLinkNintendoSwitchDeviceIdAsync,SessionTicket,Account Management,ClientLinkNintendoSwitchDeviceId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkOpenIdConnectAsync,SessionTicket,Account Management,ClientLinkOpenIdConnect,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientLinkPSNAccountAsync,SessionTicket,Account Management,ClientLinkPSNAccount,false,No,No,No,Yes +PF Services,AccountManagement,PFAccountManagementClientLinkSteamAccountAsync,SessionTicket,Account Management,ClientLinkSteamAccount,false,No,Yes,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkTwitchAsync,SessionTicket,Account Management,ClientLinkTwitch,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientLinkXboxAccountAsync,SessionTicket,Account Management,ClientLinkXboxAccount,false,Yes,Yes,No,No +PF Services,AccountManagement,PFAccountManagementClientRemoveContactEmailAsync,SessionTicket,Account Management,ClientRemoveContactEmail,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientRemoveGenericIDAsync,SessionTicket,Account Management,ClientRemoveGenericID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientReportPlayerAsync,SessionTicket,Account Management,ClientReportPlayer,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientSendAccountRecoveryEmailAsync,None,Account Management,ClientSendAccountRecoveryEmail,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkAndroidDeviceIDAsync,SessionTicket,Account Management,ClientUnlinkAndroidDeviceID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkAppleAsync,SessionTicket,Account Management,ClientUnlinkApple,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkCustomIDAsync,SessionTicket,Account Management,ClientUnlinkCustomID,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientUnlinkFacebookAccountAsync,SessionTicket,Account Management,ClientUnlinkFacebookAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkFacebookInstantGamesIdAsync,SessionTicket,Account Management,ClientUnlinkFacebookInstantGamesId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkGameCenterAccountAsync,SessionTicket,Account Management,ClientUnlinkGameCenterAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkGoogleAccountAsync,SessionTicket,Account Management,ClientUnlinkGoogleAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkGooglePlayGamesServicesAccountAsync,SessionTicket,Account Management,ClientUnlinkGooglePlayGamesServicesAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkIOSDeviceIDAsync,SessionTicket,Account Management,ClientUnlinkIOSDeviceID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkKongregateAsync,SessionTicket,Account Management,ClientUnlinkKongregate,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkNintendoServiceAccountAsync,SessionTicket,Account Management,ClientUnlinkNintendoServiceAccount,false,No,No,Yes,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkNintendoSwitchDeviceIdAsync,SessionTicket,Account Management,ClientUnlinkNintendoSwitchDeviceId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkOpenIdConnectAsync,SessionTicket,Account Management,ClientUnlinkOpenIdConnect,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientUnlinkPSNAccountAsync,SessionTicket,Account Management,ClientUnlinkPSNAccount,false,No,No,No,Yes +PF Services,AccountManagement,PFAccountManagementClientUnlinkSteamAccountAsync,SessionTicket,Account Management,ClientUnlinkSteamAccount,false,No,Yes,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkTwitchAsync,SessionTicket,Account Management,ClientUnlinkTwitch,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementClientUnlinkXboxAccountAsync,SessionTicket,Account Management,ClientUnlinkXboxAccount,false,Yes,Yes,No,No +PF Services,AccountManagement,PFAccountManagementClientUpdateAvatarUrlAsync,SessionTicket,Account Management,ClientUpdateAvatarUrl,false,Yes,Yes,Yes,Yes +PF Services,AccountManagement,PFAccountManagementClientUpdateUserTitleDisplayNameAsync,SessionTicket,Account Management,ClientUpdateUserTitleDisplayName,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerAddGenericIDAsync,SecretKey,Account Management,ServerAddGenericID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerBanUsersAsync,SecretKey,Account Management,ServerBanUsers,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerDeletePlayerAsync,SecretKey,Account Management,ServerDeletePlayer,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayerCombinedInfoAsync,SecretKey,Player Data Management,ServerGetPlayerCombinedInfo,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayerProfileAsync,SecretKey,Account Management,ServerGetPlayerProfile,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromFacebookIDsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromFacebookIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromFacebookInstantGamesIds,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromGenericIDsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromGenericIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromNintendoServiceAccountIds,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromNintendoSwitchDeviceIds,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromPSNAccountIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromSteamIDsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromSteamIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromTwitchIDsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromTwitchIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsAsync,SecretKey,Account Management,ServerGetPlayFabIDsFromXboxLiveIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsAsync,SecretKey,Account Management,ServerGetServerCustomIDsFromPlayFabIDs,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetUserAccountInfoAsync,SecretKey,Account Management,ServerGetUserAccountInfo,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerGetUserBansAsync,SecretKey,Account Management,ServerGetUserBans,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerLinkNintendoServiceAccountAsync,SecretKey,Account Management,ServerLinkNintendoServiceAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerLinkNintendoSwitchDeviceIdAsync,SecretKey,Account Management,ServerLinkNintendoSwitchDeviceId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerLinkPSNAccountAsync,SecretKey,Account Management,ServerLinkPSNAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerLinkPSNIdAsync,SecretKey,Account Management,ServerLinkPSNId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerLinkServerCustomIdAsync,SecretKey,Account Management,ServerLinkServerCustomId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerLinkSteamIdAsync,SecretKey,Account Management,ServerLinkSteamId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerLinkXboxAccountAsync,SecretKey,Account Management,ServerLinkXboxAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerRemoveGenericIDAsync,SecretKey,Account Management,ServerRemoveGenericID,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerRevokeAllBansForUserAsync,SecretKey,Account Management,ServerRevokeAllBansForUser,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerRevokeBansAsync,SecretKey,Account Management,ServerRevokeBans,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerSendCustomAccountRecoveryEmailAsync,SecretKey,Account Management,ServerSendCustomAccountRecoveryEmail,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerSendEmailFromTemplateAsync,SecretKey,Account Management,ServerSendEmailFromTemplate,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUnlinkNintendoServiceAccountAsync,SecretKey,Account Management,ServerUnlinkNintendoServiceAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUnlinkNintendoSwitchDeviceIdAsync,SecretKey,Account Management,ServerUnlinkNintendoSwitchDeviceId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUnlinkPSNAccountAsync,SecretKey,Account Management,ServerUnlinkPSNAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUnlinkServerCustomIdAsync,SecretKey,Account Management,ServerUnlinkServerCustomId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUnlinkSteamIdAsync,SecretKey,Account Management,ServerUnlinkSteamId,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUnlinkXboxAccountAsync,SecretKey,Account Management,ServerUnlinkXboxAccount,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUpdateAvatarUrlAsync,SecretKey,Account Management,ServerUpdateAvatarUrl,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementServerUpdateBansAsync,SecretKey,Account Management,ServerUpdateBans,false,No,No,No,No +PF Services,AccountManagement,PFAccountManagementGetTitlePlayersFromXboxLiveIDsAsync,EntityToken,Account Management,GetTitlePlayersFromXboxLiveIDs,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardAdminCreatePlayerStatisticDefinitionAsync,SecretKey,Player Data Management,AdminCreatePlayerStatisticDefinition,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardAdminGetPlayerStatisticDefinitionsAsync,SecretKey,Player Data Management,AdminGetPlayerStatisticDefinitions,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardAdminGetPlayerStatisticVersionsAsync,SecretKey,Player Data Management,AdminGetPlayerStatisticVersions,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardAdminIncrementPlayerStatisticVersionAsync,SecretKey,Player Data Management,AdminIncrementPlayerStatisticVersion,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardAdminResetUserStatisticsAsync,SecretKey,Player Data Management,AdminResetUserStatistics,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardAdminUpdatePlayerStatisticDefinitionAsync,SecretKey,Player Data Management,AdminUpdatePlayerStatisticDefinition,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardClientGetFriendLeaderboardAsync,SessionTicket,Player Data Management,ClientGetFriendLeaderboard,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardClientGetFriendLeaderboardAroundPlayerAsync,SessionTicket,Player Data Management,ClientGetFriendLeaderboardAroundPlayer,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardClientGetLeaderboardAsync,SessionTicket,Player Data Management,ClientGetLeaderboard,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardClientGetLeaderboardAroundPlayerAsync,SessionTicket,Player Data Management,ClientGetLeaderboardAroundPlayer,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardClientGetPlayerStatisticsAsync,SessionTicket,Player Data Management,ClientGetPlayerStatistics,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardClientGetPlayerStatisticVersionsAsync,SessionTicket,Player Data Management,ClientGetPlayerStatisticVersions,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardClientUpdatePlayerStatisticsAsync,SessionTicket,Player Data Management,ClientUpdatePlayerStatistics,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardServerGetFriendLeaderboardAsync,SecretKey,Player Data Management,ServerGetFriendLeaderboard,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardServerGetLeaderboardAsync,SecretKey,Player Data Management,ServerGetLeaderboard,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardServerGetLeaderboardAroundUserAsync,SecretKey,Player Data Management,ServerGetLeaderboardAroundUser,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardServerGetPlayerStatisticsAsync,SecretKey,Player Data Management,ServerGetPlayerStatistics,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardServerGetPlayerStatisticVersionsAsync,SecretKey,Player Data Management,ServerGetPlayerStatisticVersions,false,No,No,No,No +PF Services,Leaderboard,PFLeaderboardServerUpdatePlayerStatisticsAsync,SecretKey,Player Data Management,ServerUpdatePlayerStatistics,false,No,No,No,No +PF Services,Content,PFContentAdminDeleteContentAsync,SecretKey,Content,AdminDeleteContent,false,No,No,No,No +PF Services,Content,PFContentAdminGetContentListAsync,SecretKey,Content,AdminGetContentList,false,No,No,No,No +PF Services,Content,PFContentAdminGetContentUploadUrlAsync,SecretKey,Content,AdminGetContentUploadUrl,false,No,No,No,No +PF Services,Content,PFContentClientGetContentDownloadUrlAsync,SessionTicket,Content,ClientGetContentDownloadUrl,false,No,No,No,No +PF Services,Content,PFContentServerGetContentDownloadUrlAsync,SecretKey,Content,ServerGetContentDownloadUrl,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptAdminGetCloudScriptRevisionAsync,SecretKey,Server-Side Cloud Script,AdminGetCloudScriptRevision,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptAdminGetCloudScriptVersionsAsync,SecretKey,Server-Side Cloud Script,AdminGetCloudScriptVersions,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptAdminSetPublishedRevisionAsync,SecretKey,Server-Side Cloud Script,AdminSetPublishedRevision,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptAdminUpdateCloudScriptAsync,SecretKey,Server-Side Cloud Script,AdminUpdateCloudScript,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptClientExecuteCloudScriptAsync,SessionTicket,Server-Side Cloud Script,ClientExecuteCloudScript,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptServerExecuteCloudScriptAsync,SecretKey,Server-Side Cloud Script,ServerExecuteCloudScript,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptExecuteEntityCloudScriptAsync,EntityToken,Server-Side Cloud Script,ExecuteEntityCloudScript,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptExecuteFunctionAsync,EntityToken,Server-Side Cloud Script,ExecuteFunction,false,Yes,Yes,Yes,Yes +PF Services,CloudScript,PFCloudScriptGetFunctionAsync,EntityToken,Server-Side Cloud Script,GetFunction,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptListFunctionsAsync,EntityToken,Server-Side Cloud Script,ListFunctions,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptListHttpFunctionsAsync,EntityToken,Server-Side Cloud Script,ListHttpFunctions,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptListQueuedFunctionsAsync,EntityToken,Server-Side Cloud Script,ListQueuedFunctions,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptPostFunctionResultForEntityTriggeredActionAsync,EntityToken,Server-Side Cloud Script,PostFunctionResultForEntityTriggeredAction,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptPostFunctionResultForFunctionExecutionAsync,EntityToken,Server-Side Cloud Script,PostFunctionResultForFunctionExecution,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptPostFunctionResultForPlayerTriggeredActionAsync,EntityToken,Server-Side Cloud Script,PostFunctionResultForPlayerTriggeredAction,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptPostFunctionResultForScheduledTaskAsync,EntityToken,Server-Side Cloud Script,PostFunctionResultForScheduledTask,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptRegisterHttpFunctionAsync,EntityToken,Server-Side Cloud Script,RegisterHttpFunction,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptRegisterQueuedFunctionAsync,EntityToken,Server-Side Cloud Script,RegisterQueuedFunction,false,No,No,No,No +PF Services,CloudScript,PFCloudScriptUnregisterFunctionAsync,EntityToken,Server-Side Cloud Script,UnregisterFunction,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminGetDataReportAsync,SecretKey,Player Data Management,AdminGetDataReport,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminGetUserDataAsync,SecretKey,Player Data Management,AdminGetUserData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminGetUserInternalDataAsync,SecretKey,Player Data Management,AdminGetUserInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminGetUserPublisherDataAsync,SecretKey,Player Data Management,AdminGetUserPublisherData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminGetUserPublisherInternalDataAsync,SecretKey,Player Data Management,AdminGetUserPublisherInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminGetUserPublisherReadOnlyDataAsync,SecretKey,Player Data Management,AdminGetUserPublisherReadOnlyData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminGetUserReadOnlyDataAsync,SecretKey,Player Data Management,AdminGetUserReadOnlyData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminUpdateUserDataAsync,SecretKey,Player Data Management,AdminUpdateUserData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminUpdateUserInternalDataAsync,SecretKey,Player Data Management,AdminUpdateUserInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminUpdateUserPublisherDataAsync,SecretKey,Player Data Management,AdminUpdateUserPublisherData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminUpdateUserPublisherInternalDataAsync,SecretKey,Player Data Management,AdminUpdateUserPublisherInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminUpdateUserPublisherReadOnlyDataAsync,SecretKey,Player Data Management,AdminUpdateUserPublisherReadOnlyData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementAdminUpdateUserReadOnlyDataAsync,SecretKey,Player Data Management,AdminUpdateUserReadOnlyData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementClientGetUserDataAsync,SessionTicket,Player Data Management,ClientGetUserData,false,Yes,Yes,Yes,Yes +PF Services,PlayerDataManagement,PFPlayerDataManagementClientGetUserPublisherDataAsync,SessionTicket,Player Data Management,ClientGetUserPublisherData,false,Yes,Yes,Yes,Yes +PF Services,PlayerDataManagement,PFPlayerDataManagementClientGetUserPublisherReadOnlyDataAsync,SessionTicket,Player Data Management,ClientGetUserPublisherReadOnlyData,false,Yes,Yes,Yes,Yes +PF Services,PlayerDataManagement,PFPlayerDataManagementClientGetUserReadOnlyDataAsync,SessionTicket,Player Data Management,ClientGetUserReadOnlyData,false,Yes,Yes,Yes,Yes +PF Services,PlayerDataManagement,PFPlayerDataManagementClientUpdateUserDataAsync,SessionTicket,Player Data Management,ClientUpdateUserData,false,Yes,Yes,Yes,Yes +PF Services,PlayerDataManagement,PFPlayerDataManagementClientUpdateUserPublisherDataAsync,SessionTicket,Player Data Management,ClientUpdateUserPublisherData,false,Yes,Yes,Yes,Yes +PF Services,PlayerDataManagement,PFPlayerDataManagementServerGetUserDataAsync,SecretKey,Player Data Management,ServerGetUserData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerGetUserInternalDataAsync,SecretKey,Player Data Management,ServerGetUserInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerGetUserPublisherDataAsync,SecretKey,Player Data Management,ServerGetUserPublisherData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerGetUserPublisherInternalDataAsync,SecretKey,Player Data Management,ServerGetUserPublisherInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerGetUserPublisherReadOnlyDataAsync,SecretKey,Player Data Management,ServerGetUserPublisherReadOnlyData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerGetUserReadOnlyDataAsync,SecretKey,Player Data Management,ServerGetUserReadOnlyData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerUpdateUserDataAsync,SecretKey,Player Data Management,ServerUpdateUserData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerUpdateUserInternalDataAsync,SecretKey,Player Data Management,ServerUpdateUserInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerUpdateUserPublisherDataAsync,SecretKey,Player Data Management,ServerUpdateUserPublisherData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerUpdateUserPublisherInternalDataAsync,SecretKey,Player Data Management,ServerUpdateUserPublisherInternalData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataAsync,SecretKey,Player Data Management,ServerUpdateUserPublisherReadOnlyData,false,No,No,No,No +PF Services,PlayerDataManagement,PFPlayerDataManagementServerUpdateUserReadOnlyDataAsync,SecretKey,Player Data Management,ServerUpdateUserReadOnlyData,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingAdminGetMatchmakerGameInfoAsync,SecretKey,Matchmaking,AdminGetMatchmakerGameInfo,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingAdminGetMatchmakerGameModesAsync,SecretKey,Matchmaking,AdminGetMatchmakerGameModes,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingClientGetCurrentGamesAsync,SessionTicket,Matchmaking,ClientGetCurrentGames,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingClientGetGameServerRegionsAsync,SessionTicket,Matchmaking,ClientGetGameServerRegions,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingClientMatchmakeAsync,SessionTicket,Matchmaking,ClientMatchmake,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingAuthUserAsync,SecretKey,Matchmaking,AuthUser,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingPlayerJoinedAsync,SecretKey,Matchmaking,PlayerJoined,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingPlayerLeftAsync,SecretKey,Matchmaking,PlayerLeft,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingUserInfoAsync,SecretKey,Matchmaking,UserInfo,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerDeregisterGameAsync,SecretKey,Matchmaking,ServerDeregisterGame,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerNotifyMatchmakerPlayerLeftAsync,SecretKey,Matchmaking,ServerNotifyMatchmakerPlayerLeft,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerRedeemMatchmakerTicketAsync,SecretKey,Matchmaking,ServerRedeemMatchmakerTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerRefreshGameServerInstanceHeartbeatAsync,SecretKey,Matchmaking,ServerRefreshGameServerInstanceHeartbeat,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerRegisterGameAsync,SecretKey,Matchmaking,ServerRegisterGame,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerSetGameServerInstanceDataAsync,SecretKey,Matchmaking,ServerSetGameServerInstanceData,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerSetGameServerInstanceStateAsync,SecretKey,Matchmaking,ServerSetGameServerInstanceState,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingServerSetGameServerInstanceTagsAsync,SecretKey,Matchmaking,ServerSetGameServerInstanceTags,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingCancelAllMatchmakingTicketsForPlayerAsync,EntityToken,Matchmaking,CancelAllMatchmakingTicketsForPlayer,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingCancelAllServerBackfillTicketsForPlayerAsync,EntityToken,Matchmaking,CancelAllServerBackfillTicketsForPlayer,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingCancelMatchmakingTicketAsync,EntityToken,Matchmaking,CancelMatchmakingTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingCancelServerBackfillTicketAsync,EntityToken,Matchmaking,CancelServerBackfillTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingCreateMatchmakingTicketAsync,EntityToken,Matchmaking,CreateMatchmakingTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingCreateServerBackfillTicketAsync,EntityToken,Matchmaking,CreateServerBackfillTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingCreateServerMatchmakingTicketAsync,EntityToken,Matchmaking,CreateServerMatchmakingTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingGetMatchAsync,EntityToken,Matchmaking,GetMatch,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingGetMatchmakingTicketAsync,EntityToken,Matchmaking,GetMatchmakingTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingGetQueueStatisticsAsync,EntityToken,Matchmaking,GetQueueStatistics,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingGetServerBackfillTicketAsync,EntityToken,Matchmaking,GetServerBackfillTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingJoinMatchmakingTicketAsync,EntityToken,Matchmaking,JoinMatchmakingTicket,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingListMatchmakingTicketsForPlayerAsync,EntityToken,Matchmaking,ListMatchmakingTicketsForPlayer,false,No,No,No,No +PF Services,Matchmaking,PFMatchmakingListServerBackfillTicketsForPlayerAsync,EntityToken,Matchmaking,ListServerBackfillTicketsForPlayer,false,No,No,No,No +PF Services,GameServer,PFGameServerAdminModifyServerBuildAsync,SecretKey,Custom Server Management,AdminModifyServerBuild,false,No,No,No,No +PF Services,Economy,PFEconomyAdminRefundPurchaseAsync,SecretKey,Player Data Management,AdminRefundPurchase,false,No,No,No,No +PF Services,Economy,PFEconomyAdminResolvePurchaseDisputeAsync,SecretKey,Player Data Management,AdminResolvePurchaseDispute,false,No,No,No,No +PF Services,Character,PFCharacterAdminResetCharacterStatisticsAsync,SecretKey,Characters,AdminResetCharacterStatistics,false,No,No,No,No +PF Services,Character,PFCharacterClientGetAllUsersCharactersAsync,SessionTicket,Characters,ClientGetAllUsersCharacters,false,No,No,No,No +PF Services,Character,PFCharacterClientGetCharacterDataAsync,SessionTicket,Character Data,ClientGetCharacterData,false,No,No,No,No +PF Services,Character,PFCharacterClientGetCharacterLeaderboardAsync,SessionTicket,Characters,ClientGetCharacterLeaderboard,false,No,No,No,No +PF Services,Character,PFCharacterClientGetCharacterReadOnlyDataAsync,SessionTicket,Character Data,ClientGetCharacterReadOnlyData,false,No,No,No,No +PF Services,Character,PFCharacterClientGetCharacterStatisticsAsync,SessionTicket,Characters,ClientGetCharacterStatistics,false,No,No,No,No +PF Services,Character,PFCharacterClientGetLeaderboardAroundCharacterAsync,SessionTicket,Characters,ClientGetLeaderboardAroundCharacter,false,No,No,No,No +PF Services,Character,PFCharacterClientGetLeaderboardForUserCharactersAsync,SessionTicket,Characters,ClientGetLeaderboardForUserCharacters,false,No,No,No,No +PF Services,Character,PFCharacterClientGrantCharacterToUserAsync,SessionTicket,Characters,ClientGrantCharacterToUser,false,No,No,No,No +PF Services,Character,PFCharacterClientUpdateCharacterDataAsync,SessionTicket,Character Data,ClientUpdateCharacterData,false,No,No,No,No +PF Services,Character,PFCharacterClientUpdateCharacterStatisticsAsync,SessionTicket,Characters,ClientUpdateCharacterStatistics,false,No,No,No,No +PF Services,Character,PFCharacterServerDeleteCharacterFromUserAsync,SecretKey,Characters,ServerDeleteCharacterFromUser,false,No,No,No,No +PF Services,Character,PFCharacterServerGetAllUsersCharactersAsync,SecretKey,Characters,ServerGetAllUsersCharacters,false,No,No,No,No +PF Services,Character,PFCharacterServerGetCharacterDataAsync,SecretKey,Character Data,ServerGetCharacterData,false,No,No,No,No +PF Services,Character,PFCharacterServerGetCharacterInternalDataAsync,SecretKey,Character Data,ServerGetCharacterInternalData,false,No,No,No,No +PF Services,Character,PFCharacterServerGetCharacterLeaderboardAsync,SecretKey,Characters,ServerGetCharacterLeaderboard,false,No,No,No,No +PF Services,Character,PFCharacterServerGetCharacterReadOnlyDataAsync,SecretKey,Character Data,ServerGetCharacterReadOnlyData,false,No,No,No,No +PF Services,Character,PFCharacterServerGetCharacterStatisticsAsync,SecretKey,Characters,ServerGetCharacterStatistics,false,No,No,No,No +PF Services,Character,PFCharacterServerGetLeaderboardAroundCharacterAsync,SecretKey,Characters,ServerGetLeaderboardAroundCharacter,false,No,No,No,No +PF Services,Character,PFCharacterServerGetLeaderboardForUserCharactersAsync,SecretKey,Characters,ServerGetLeaderboardForUserCharacters,false,No,No,No,No +PF Services,Character,PFCharacterServerGrantCharacterToUserAsync,SecretKey,Characters,ServerGrantCharacterToUser,false,No,No,No,No +PF Services,Character,PFCharacterServerUpdateCharacterDataAsync,SecretKey,Character Data,ServerUpdateCharacterData,false,No,No,No,No +PF Services,Character,PFCharacterServerUpdateCharacterInternalDataAsync,SecretKey,Character Data,ServerUpdateCharacterInternalData,false,No,No,No,No +PF Services,Character,PFCharacterServerUpdateCharacterReadOnlyDataAsync,SecretKey,Character Data,ServerUpdateCharacterReadOnlyData,false,No,No,No,No +PF Services,Character,PFCharacterServerUpdateCharacterStatisticsAsync,SecretKey,Characters,ServerUpdateCharacterStatistics,false,No,No,No,No +PF Services,Trading,PFTradingClientAcceptTradeAsync,SessionTicket,Trading,ClientAcceptTrade,false,No,No,No,No +PF Services,Trading,PFTradingClientCancelTradeAsync,SessionTicket,Trading,ClientCancelTrade,false,No,No,No,No +PF Services,Trading,PFTradingClientGetPlayerTradesAsync,SessionTicket,Trading,ClientGetPlayerTrades,false,No,No,No,No +PF Services,Trading,PFTradingClientGetTradeStatusAsync,SessionTicket,Trading,ClientGetTradeStatus,false,No,No,No,No +PF Services,Trading,PFTradingClientOpenTradeAsync,SessionTicket,Trading,ClientOpenTrade,false,No,No,No,No +PF Services,Friends,PFFriendsClientAddFriendAsync,SessionTicket,Friend List Management,ClientAddFriend,false,Yes,Yes,Yes,Yes +PF Services,Friends,PFFriendsClientGetFriendsListAsync,SessionTicket,Friend List Management,ClientGetFriendsList,false,Yes,Yes,Yes,Yes +PF Services,Friends,PFFriendsClientRemoveFriendAsync,SessionTicket,Friend List Management,ClientRemoveFriend,false,Yes,Yes,Yes,Yes +PF Services,Friends,PFFriendsClientSetFriendTagsAsync,SessionTicket,Friend List Management,ClientSetFriendTags,false,Yes,Yes,Yes,Yes +PF Services,Friends,PFFriendsServerAddFriendAsync,SecretKey,Friend List Management,ServerAddFriend,false,No,No,No,No +PF Services,Friends,PFFriendsServerGetFriendsListAsync,SecretKey,Friend List Management,ServerGetFriendsList,false,No,No,No,No +PF Services,Friends,PFFriendsServerRemoveFriendAsync,SecretKey,Friend List Management,ServerRemoveFriend,false,No,No,No,No +PF Services,Friends,PFFriendsServerSetFriendTagsAsync,SecretKey,Friend List Management,ServerSetFriendTags,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsClientAddSharedGroupMembersAsync,SessionTicket,Shared Group Data,ClientAddSharedGroupMembers,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsClientCreateSharedGroupAsync,SessionTicket,Shared Group Data,ClientCreateSharedGroup,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsClientGetSharedGroupDataAsync,SessionTicket,Shared Group Data,ClientGetSharedGroupData,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsClientRemoveSharedGroupMembersAsync,SessionTicket,Shared Group Data,ClientRemoveSharedGroupMembers,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsClientUpdateSharedGroupDataAsync,SessionTicket,Shared Group Data,ClientUpdateSharedGroupData,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsServerAddSharedGroupMembersAsync,SecretKey,Shared Group Data,ServerAddSharedGroupMembers,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsServerCreateSharedGroupAsync,SecretKey,Shared Group Data,ServerCreateSharedGroup,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsServerDeleteSharedGroupAsync,SecretKey,Shared Group Data,ServerDeleteSharedGroup,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsServerGetSharedGroupDataAsync,SecretKey,Shared Group Data,ServerGetSharedGroupData,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsServerRemoveSharedGroupMembersAsync,SecretKey,Shared Group Data,ServerRemoveSharedGroupMembers,false,No,No,No,No +PF Services,SharedGroups,PFSharedGroupsServerUpdateSharedGroupDataAsync,SecretKey,Shared Group Data,ServerUpdateSharedGroupData,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientAndroidDevicePushNotificationRegistrationAsync,SessionTicket,Platform Specific Methods,ClientAndroidDevicePushNotificationRegistration,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientConsumeMicrosoftStoreEntitlementsAsync,SessionTicket,Platform Specific Methods,ClientConsumeMicrosoftStoreEntitlements,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientConsumePS5EntitlementsAsync,SessionTicket,Platform Specific Methods,ClientConsumePS5Entitlements,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientConsumePSNEntitlementsAsync,SessionTicket,Platform Specific Methods,ClientConsumePSNEntitlements,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientConsumeXboxEntitlementsAsync,SessionTicket,Platform Specific Methods,ClientConsumeXboxEntitlements,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientRefreshPSNAuthTokenAsync,SessionTicket,Platform Specific Methods,ClientRefreshPSNAuthToken,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientRegisterForIOSPushNotificationAsync,SessionTicket,Platform Specific Methods,ClientRegisterForIOSPushNotification,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientRestoreIOSPurchasesAsync,SessionTicket,Platform Specific Methods,ClientRestoreIOSPurchases,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientValidateAmazonIAPReceiptAsync,SessionTicket,Platform Specific Methods,ClientValidateAmazonIAPReceipt,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientValidateGooglePlayPurchaseAsync,SessionTicket,Platform Specific Methods,ClientValidateGooglePlayPurchase,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientValidateIOSReceiptAsync,SessionTicket,Platform Specific Methods,ClientValidateIOSReceipt,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificClientValidateWindowsStoreReceiptAsync,SessionTicket,Platform Specific Methods,ClientValidateWindowsStoreReceipt,false,No,No,No,No +PF Services,PlatformSpecific,PFPlatformSpecificServerAwardSteamAchievementAsync,SecretKey,Platform Specific Methods,ServerAwardSteamAchievement,false,No,No,No,No +PF Services,Advertising,PFAdvertisingClientAttributeInstallAsync,SessionTicket,Advertising,ClientAttributeInstall,false,No,No,No,No +PF Services,Advertising,PFAdvertisingClientGetAdPlacementsAsync,SessionTicket,Advertising,ClientGetAdPlacements,false,No,No,No,No +PF Services,Advertising,PFAdvertisingClientReportAdActivityAsync,SessionTicket,Advertising,ClientReportAdActivity,false,No,No,No,No +PF Services,Advertising,PFAdvertisingClientRewardAdActivityAsync,SessionTicket,Advertising,ClientRewardAdActivity,false,No,No,No,No +PF Services,Events,PFEventsClientReportDeviceInfoAsync,SessionTicket,Analytics,ClientReportDeviceInfo,false,No,No,No,No +PF Services,Events,PFEventsClientWriteCharacterEventAsync,SessionTicket,Analytics,ClientWriteCharacterEvent,false,No,No,No,No +PF Services,Events,PFEventsClientWritePlayerEventAsync,SessionTicket,Analytics,ClientWritePlayerEvent,false,No,No,No,No +PF Services,Events,PFEventsClientWriteTitleEventAsync,SessionTicket,Analytics,ClientWriteTitleEvent,false,No,No,No,No +PF Services,Events,PFEventsServerWriteCharacterEventAsync,SecretKey,Analytics,ServerWriteCharacterEvent,false,No,No,No,No +PF Services,Events,PFEventsServerWritePlayerEventAsync,SecretKey,Analytics,ServerWritePlayerEvent,false,No,No,No,No +PF Services,Events,PFEventsServerWriteTitleEventAsync,SecretKey,Analytics,ServerWriteTitleEvent,false,No,No,No,No +PF Services,Events,PFEventsCreateTelemetryKeyAsync,EntityToken,PlayStream Events,CreateTelemetryKey,false,No,No,No,No +PF Services,Events,PFEventsDeleteTelemetryKeyAsync,EntityToken,PlayStream Events,DeleteTelemetryKey,false,No,No,No,No +PF Services,Events,PFEventsGetTelemetryKeyAsync,EntityToken,PlayStream Events,GetTelemetryKey,false,No,No,No,No +PF Services,Events,PFEventsListTelemetryKeysAsync,EntityToken,PlayStream Events,ListTelemetryKeys,false,No,No,No,No +PF Services,Events,PFEventsSetTelemetryKeyActiveAsync,EntityToken,PlayStream Events,SetTelemetryKeyActive,false,No,No,No,No +PF Services,Events,PFEventsWriteEventsAsync,EntityToken,PlayStream Events,WriteEvents,false,No,No,No,No +PF Services,Events,PFEventsWriteTelemetryEventsAsync,EntityToken,PlayStream Events,WriteTelemetryEvents,false,No,No,No,No +PF Services,PushNotifications,PFPushNotificationsServerDeletePushNotificationTemplateAsync,SecretKey,Account Management,ServerDeletePushNotificationTemplate,false,No,No,No,No +PF Services,PushNotifications,PFPushNotificationsServerSavePushNotificationTemplateAsync,SecretKey,Account Management,ServerSavePushNotificationTemplate,false,No,No,No,No +PF Services,PushNotifications,PFPushNotificationsServerSendPushNotificationAsync,SecretKey,Account Management,ServerSendPushNotification,false,No,No,No,No +PF Services,PushNotifications,PFPushNotificationsServerSendPushNotificationFromTemplateAsync,SecretKey,Account Management,ServerSendPushNotificationFromTemplate,false,No,No,No,No +PF Services,Data,PFDataAbortFileUploadsAsync,EntityToken,File,AbortFileUploads,false,Yes,Yes,Yes,Yes +PF Services,Data,PFDataDeleteFilesAsync,EntityToken,File,DeleteFiles,false,Yes,Yes,Yes,Yes +PF Services,Data,PFDataFinalizeFileUploadsAsync,EntityToken,File,FinalizeFileUploads,false,Yes,Yes,Yes,Yes +PF Services,Data,PFDataGetFilesAsync,EntityToken,File,GetFiles,false,Yes,Yes,Yes,Yes +PF Services,Data,PFDataGetObjectsAsync,EntityToken,Object,GetObjects,false,Yes,Yes,Yes,Yes +PF Services,Data,PFDataInitiateFileUploadsAsync,EntityToken,File,InitiateFileUploads,false,Yes,Yes,Yes,Yes +PF Services,Data,PFDataSetObjectsAsync,EntityToken,Object,SetObjects,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryAddInventoryItemsAsync,EntityToken,Inventory,AddInventoryItems,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryDeleteInventoryCollectionAsync,EntityToken,Inventory,DeleteInventoryCollection,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryDeleteInventoryItemsAsync,EntityToken,Inventory,DeleteInventoryItems,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryExecuteInventoryOperationsAsync,EntityToken,Inventory,ExecuteInventoryOperations,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryGetInventoryCollectionIdsAsync,EntityToken,Inventory,GetInventoryCollectionIds,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryGetInventoryItemsAsync,EntityToken,Inventory,GetInventoryItems,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryGetMicrosoftStoreAccessTokensAsync,EntityToken,Inventory,GetMicrosoftStoreAccessTokens,false,Yes,Yes,No,No +PF Services,Inventory,PFInventoryGetTransactionHistoryAsync,EntityToken,Inventory,GetTransactionHistory,false,No,No,No,No +PF Services,Inventory,PFInventoryPurchaseInventoryItemsAsync,EntityToken,Inventory,PurchaseInventoryItems,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryRedeemAppleAppStoreInventoryItemsAsync,EntityToken,Inventory,RedeemAppleAppStoreInventoryItems,false,No,No,No,No +PF Services,Inventory,PFInventoryRedeemGooglePlayInventoryItemsAsync,EntityToken,Inventory,RedeemGooglePlayInventoryItems,false,No,No,No,No +PF Services,Inventory,PFInventoryRedeemMicrosoftStoreInventoryItemsAsync,EntityToken,Inventory,RedeemMicrosoftStoreInventoryItems,false,Yes,Yes,No,No +PF Services,Inventory,PFInventoryRedeemNintendoEShopInventoryItemsAsync,EntityToken,Inventory,RedeemNintendoEShopInventoryItems,false,No,No,Yes,No +PF Services,Inventory,PFInventoryRedeemPlayStationStoreInventoryItemsAsync,EntityToken,Inventory,RedeemPlayStationStoreInventoryItems,false,No,No,No,Yes +PF Services,Inventory,PFInventoryRedeemSteamInventoryItemsAsync,EntityToken,Inventory,RedeemSteamInventoryItems,false,No,Yes,No,No +PF Services,Inventory,PFInventorySubtractInventoryItemsAsync,EntityToken,Inventory,SubtractInventoryItems,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryTransferInventoryItemsAsync,EntityToken,Inventory,TransferInventoryItems,false,Yes,Yes,Yes,Yes +PF Services,Inventory,PFInventoryUpdateInventoryItemsAsync,EntityToken,Inventory,UpdateInventoryItems,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogCreateDraftItemAsync,EntityToken,Catalog,CreateDraftItem,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogCreateUploadUrlsAsync,EntityToken,Catalog,CreateUploadUrls,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogDeleteEntityItemReviewsAsync,EntityToken,Catalog,DeleteEntityItemReviews,false,No,No,No,No +PF Services,Catalog,PFCatalogDeleteItemAsync,EntityToken,Catalog,DeleteItem,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetCatalogConfigAsync,EntityToken,Catalog,GetCatalogConfig,false,No,No,No,No +PF Services,Catalog,PFCatalogGetDraftItemAsync,EntityToken,Catalog,GetDraftItem,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetDraftItemsAsync,EntityToken,Catalog,GetDraftItems,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetEntityDraftItemsAsync,EntityToken,Catalog,GetEntityDraftItems,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetEntityItemReviewAsync,EntityToken,Catalog,GetEntityItemReview,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetItemAsync,EntityToken,Catalog,GetItem,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetItemContainersAsync,EntityToken,Catalog,GetItemContainers,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetItemModerationStateAsync,EntityToken,Catalog,GetItemModerationState,false,No,No,No,No +PF Services,Catalog,PFCatalogGetItemPublishStatusAsync,EntityToken,Catalog,GetItemPublishStatus,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetItemReviewsAsync,EntityToken,Catalog,GetItemReviews,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetItemReviewSummaryAsync,EntityToken,Catalog,GetItemReviewSummary,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogGetItemsAsync,EntityToken,Catalog,GetItems,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogPublishDraftItemAsync,EntityToken,Catalog,PublishDraftItem,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogReportItemAsync,EntityToken,Catalog,ReportItem,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogReportItemReviewAsync,EntityToken,Catalog,ReportItemReview,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogReviewItemAsync,EntityToken,Catalog,ReviewItem,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogSearchItemsAsync,EntityToken,Catalog,SearchItems,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogSetItemModerationStateAsync,EntityToken,Catalog,SetItemModerationState,false,No,No,No,No +PF Services,Catalog,PFCatalogSubmitItemReviewVoteAsync,EntityToken,Catalog,SubmitItemReviewVote,false,Yes,Yes,Yes,Yes +PF Services,Catalog,PFCatalogTakedownItemReviewsAsync,EntityToken,Catalog,TakedownItemReviews,false,No,No,No,No +PF Services,Catalog,PFCatalogUpdateCatalogConfigAsync,EntityToken,Catalog,UpdateCatalogConfig,false,No,No,No,No +PF Services,Catalog,PFCatalogUpdateDraftItemAsync,EntityToken,Catalog,UpdateDraftItem,false,Yes,Yes,Yes,Yes +PF Services,Experimentation,PFExperimentationCreateExclusionGroupAsync,EntityToken,Experimentation,CreateExclusionGroup,false,No,No,No,No +PF Services,Experimentation,PFExperimentationCreateExperimentAsync,EntityToken,Experimentation,CreateExperiment,false,No,No,No,No +PF Services,Experimentation,PFExperimentationDeleteExclusionGroupAsync,EntityToken,Experimentation,DeleteExclusionGroup,false,No,No,No,No +PF Services,Experimentation,PFExperimentationDeleteExperimentAsync,EntityToken,Experimentation,DeleteExperiment,false,No,No,No,No +PF Services,Experimentation,PFExperimentationGetExclusionGroupsAsync,EntityToken,Experimentation,GetExclusionGroups,false,No,No,No,No +PF Services,Experimentation,PFExperimentationGetExclusionGroupTrafficAsync,EntityToken,Experimentation,GetExclusionGroupTraffic,false,No,No,No,No +PF Services,Experimentation,PFExperimentationGetExperimentsAsync,EntityToken,Experimentation,GetExperiments,false,No,No,No,No +PF Services,Experimentation,PFExperimentationGetLatestScorecardAsync,EntityToken,Experimentation,GetLatestScorecard,false,No,No,No,No +PF Services,Experimentation,PFExperimentationGetTreatmentAssignmentAsync,EntityToken,Experimentation,GetTreatmentAssignment,false,Yes,Yes,Yes,Yes +PF Services,Experimentation,PFExperimentationStartExperimentAsync,EntityToken,Experimentation,StartExperiment,false,No,No,No,No +PF Services,Experimentation,PFExperimentationStopExperimentAsync,EntityToken,Experimentation,StopExperiment,false,No,No,No,No +PF Services,Experimentation,PFExperimentationUpdateExclusionGroupAsync,EntityToken,Experimentation,UpdateExclusionGroup,false,No,No,No,No +PF Services,Experimentation,PFExperimentationUpdateExperimentAsync,EntityToken,Experimentation,UpdateExperiment,false,No,No,No,No +PF Services,Analytics,PFAnalyticsGetDetailsAsync,EntityToken,Analytics,GetDetails,false,No,No,No,No +PF Services,Analytics,PFAnalyticsGetLimitsAsync,EntityToken,Analytics,GetLimits,false,No,No,No,No +PF Services,Analytics,PFAnalyticsGetOperationStatusAsync,EntityToken,Analytics,GetOperationStatus,false,No,No,No,No +PF Services,Analytics,PFAnalyticsGetPendingOperationsAsync,EntityToken,Analytics,GetPendingOperations,false,No,No,No,No +PF Services,Analytics,PFAnalyticsSetPerformanceAsync,EntityToken,Analytics,SetPerformance,false,No,No,No,No +PF Services,Analytics,PFAnalyticsSetStorageRetentionAsync,EntityToken,Analytics,SetStorageRetention,false,No,No,No,No +PF Services,Groups,PFGroupsAcceptGroupApplicationAsync,EntityToken,Groups,AcceptGroupApplication,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsAcceptGroupInvitationAsync,EntityToken,Groups,AcceptGroupInvitation,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsAddMembersAsync,EntityToken,Groups,AddMembers,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsApplyToGroupAsync,EntityToken,Groups,ApplyToGroup,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsBlockEntityAsync,EntityToken,Groups,BlockEntity,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsChangeMemberRoleAsync,EntityToken,Groups,ChangeMemberRole,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsCreateGroupAsync,EntityToken,Groups,CreateGroup,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsCreateRoleAsync,EntityToken,Groups,CreateRole,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsDeleteGroupAsync,EntityToken,Groups,DeleteGroup,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsDeleteRoleAsync,EntityToken,Groups,DeleteRole,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsGetGroupAsync,EntityToken,Groups,GetGroup,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsInviteToGroupAsync,EntityToken,Groups,InviteToGroup,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsIsMemberAsync,EntityToken,Groups,IsMember,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsListGroupApplicationsAsync,EntityToken,Groups,ListGroupApplications,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsListGroupBlocksAsync,EntityToken,Groups,ListGroupBlocks,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsListGroupInvitationsAsync,EntityToken,Groups,ListGroupInvitations,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsListGroupMembersAsync,EntityToken,Groups,ListGroupMembers,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsListMembershipAsync,EntityToken,Groups,ListMembership,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsListMembershipOpportunitiesAsync,EntityToken,Groups,ListMembershipOpportunities,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsRemoveGroupApplicationAsync,EntityToken,Groups,RemoveGroupApplication,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsRemoveGroupInvitationAsync,EntityToken,Groups,RemoveGroupInvitation,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsRemoveMembersAsync,EntityToken,Groups,RemoveMembers,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsUnblockEntityAsync,EntityToken,Groups,UnblockEntity,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsUpdateGroupAsync,EntityToken,Groups,UpdateGroup,false,Yes,Yes,Yes,Yes +PF Services,Groups,PFGroupsUpdateRoleAsync,EntityToken,Groups,UpdateRole,false,Yes,Yes,Yes,Yes +PF Services,Localization,PFLocalizationGetLanguageListAsync,EntityToken,Localization,GetLanguageList,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerCreateBuildAliasAsync,EntityToken,MultiplayerServer,CreateBuildAlias,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerCreateBuildWithCustomContainerAsync,EntityToken,MultiplayerServer,CreateBuildWithCustomContainer,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerCreateBuildWithManagedContainerAsync,EntityToken,MultiplayerServer,CreateBuildWithManagedContainer,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerCreateBuildWithProcessBasedServerAsync,EntityToken,MultiplayerServer,CreateBuildWithProcessBasedServer,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerCreateRemoteUserAsync,EntityToken,MultiplayerServer,CreateRemoteUser,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerCreateTitleMultiplayerServersQuotaChangeAsync,EntityToken,MultiplayerServer,CreateTitleMultiplayerServersQuotaChange,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerDeleteAssetAsync,EntityToken,MultiplayerServer,DeleteAsset,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerDeleteBuildAsync,EntityToken,MultiplayerServer,DeleteBuild,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerDeleteBuildAliasAsync,EntityToken,MultiplayerServer,DeleteBuildAlias,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerDeleteBuildRegionAsync,EntityToken,MultiplayerServer,DeleteBuildRegion,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerDeleteCertificateAsync,EntityToken,MultiplayerServer,DeleteCertificate,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerDeleteContainerImageRepositoryAsync,EntityToken,MultiplayerServer,DeleteContainerImageRepository,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerDeleteRemoteUserAsync,EntityToken,MultiplayerServer,DeleteRemoteUser,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerEnableMultiplayerServersForTitleAsync,EntityToken,MultiplayerServer,EnableMultiplayerServersForTitle,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetAssetDownloadUrlAsync,EntityToken,MultiplayerServer,GetAssetDownloadUrl,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetAssetUploadUrlAsync,EntityToken,MultiplayerServer,GetAssetUploadUrl,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetBuildAsync,EntityToken,MultiplayerServer,GetBuild,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetBuildAliasAsync,EntityToken,MultiplayerServer,GetBuildAlias,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetContainerRegistryCredentialsAsync,EntityToken,MultiplayerServer,GetContainerRegistryCredentials,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetMultiplayerServerDetailsAsync,EntityToken,MultiplayerServer,GetMultiplayerServerDetails,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetMultiplayerServerLogsAsync,EntityToken,MultiplayerServer,GetMultiplayerServerLogs,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetMultiplayerSessionLogsBySessionIdAsync,EntityToken,MultiplayerServer,GetMultiplayerSessionLogsBySessionId,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetRemoteLoginEndpointAsync,EntityToken,MultiplayerServer,GetRemoteLoginEndpoint,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetTitleEnabledForMultiplayerServersStatusAsync,EntityToken,MultiplayerServer,GetTitleEnabledForMultiplayerServersStatus,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetTitleMultiplayerServersQuotaChangeAsync,EntityToken,MultiplayerServer,GetTitleMultiplayerServersQuotaChange,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerGetTitleMultiplayerServersQuotasAsync,EntityToken,MultiplayerServer,GetTitleMultiplayerServersQuotas,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListArchivedMultiplayerServersAsync,EntityToken,MultiplayerServer,ListArchivedMultiplayerServers,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListAssetSummariesAsync,EntityToken,MultiplayerServer,ListAssetSummaries,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListBuildAliasesAsync,EntityToken,MultiplayerServer,ListBuildAliases,false,Yes,Yes,Yes,Yes +PF Services,MultiplayerServer,PFMultiplayerServerListBuildSummariesV2Async,EntityToken,MultiplayerServer,ListBuildSummariesV2,false,Yes,Yes,Yes,Yes +PF Services,MultiplayerServer,PFMultiplayerServerListCertificateSummariesAsync,EntityToken,MultiplayerServer,ListCertificateSummaries,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListContainerImagesAsync,EntityToken,MultiplayerServer,ListContainerImages,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListContainerImageTagsAsync,EntityToken,MultiplayerServer,ListContainerImageTags,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListMultiplayerServersAsync,EntityToken,MultiplayerServer,ListMultiplayerServers,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListPartyQosServersAsync,None,MultiplayerServer,ListPartyQosServers,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListQosServersForTitleAsync,EntityToken,MultiplayerServer,ListQosServersForTitle,false,Yes,Yes,Yes,Yes +PF Services,MultiplayerServer,PFMultiplayerServerListTitleMultiplayerServersQuotaChangesAsync,EntityToken,MultiplayerServer,ListTitleMultiplayerServersQuotaChanges,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerListVirtualMachineSummariesAsync,EntityToken,MultiplayerServer,ListVirtualMachineSummaries,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerRequestMultiplayerServerAsync,EntityToken,MultiplayerServer,RequestMultiplayerServer,false,Yes,Yes,Yes,Yes +PF Services,MultiplayerServer,PFMultiplayerServerRolloverContainerRegistryCredentialsAsync,EntityToken,MultiplayerServer,RolloverContainerRegistryCredentials,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerShutdownMultiplayerServerAsync,EntityToken,MultiplayerServer,ShutdownMultiplayerServer,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerUntagContainerImageAsync,EntityToken,MultiplayerServer,UntagContainerImage,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerUpdateBuildAliasAsync,EntityToken,MultiplayerServer,UpdateBuildAlias,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerUpdateBuildNameAsync,EntityToken,MultiplayerServer,UpdateBuildName,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerUpdateBuildRegionAsync,EntityToken,MultiplayerServer,UpdateBuildRegion,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerUpdateBuildRegionsAsync,EntityToken,MultiplayerServer,UpdateBuildRegions,false,No,No,No,No +PF Services,MultiplayerServer,PFMultiplayerServerUploadCertificateAsync,EntityToken,MultiplayerServer,UploadCertificate,false,No,No,No,No +PF Services,Lobby,PFLobbyCreateLobbyAsync,EntityToken,Lobby,CreateLobby,false,No,No,No,No +PF Services,Lobby,PFLobbyDeleteLobbyAsync,EntityToken,Lobby,DeleteLobby,false,No,No,No,No +PF Services,Lobby,PFLobbyFindFriendLobbiesAsync,EntityToken,Lobby,FindFriendLobbies,false,No,No,No,No +PF Services,Lobby,PFLobbyFindLobbiesAsync,EntityToken,Lobby,FindLobbies,false,No,No,No,No +PF Services,Lobby,PFLobbyGetLobbyAsync,EntityToken,Lobby,GetLobby,false,No,No,No,No +PF Services,Lobby,PFLobbyInviteToLobbyAsync,EntityToken,Lobby,InviteToLobby,false,No,No,No,No +PF Services,Lobby,PFLobbyJoinArrangedLobbyAsync,EntityToken,Lobby,JoinArrangedLobby,false,No,No,No,No +PF Services,Lobby,PFLobbyJoinLobbyAsync,EntityToken,Lobby,JoinLobby,false,No,No,No,No +PF Services,Lobby,PFLobbyLeaveLobbyAsync,EntityToken,Lobby,LeaveLobby,false,No,No,No,No +PF Services,Lobby,PFLobbyRemoveMemberAsync,EntityToken,Lobby,RemoveMember,false,No,No,No,No +PF Services,Lobby,PFLobbySubscribeToLobbyResourceAsync,EntityToken,Lobby,SubscribeToLobbyResource,false,No,No,No,No +PF Services,Lobby,PFLobbyUnsubscribeFromLobbyResourceAsync,EntityToken,Lobby,UnsubscribeFromLobbyResource,false,No,No,No,No +PF Services,Lobby,PFLobbyUpdateLobbyAsync,EntityToken,Lobby,UpdateLobby,false,No,No,No,No +PF Services,Profiles,PFProfilesGetGlobalPolicyAsync,EntityToken,Account Management,GetGlobalPolicy,false,No,No,No,No +PF Services,Profiles,PFProfilesGetProfileAsync,EntityToken,Account Management,GetProfile,false,Yes,Yes,Yes,Yes +PF Services,Profiles,PFProfilesGetProfilesAsync,EntityToken,Account Management,GetProfiles,false,Yes,Yes,Yes,Yes +PF Services,Profiles,PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsAsync,EntityToken,Account Management,GetTitlePlayersFromMasterPlayerAccountIds,false,Yes,Yes,Yes,Yes +PF Services,Profiles,PFProfilesSetGlobalPolicyAsync,EntityToken,Account Management,SetGlobalPolicy,false,No,No,No,No +PF Services,Profiles,PFProfilesSetProfileLanguageAsync,EntityToken,Account Management,SetProfileLanguage,false,Yes,Yes,Yes,Yes +PF Services,Profiles,PFProfilesSetProfilePolicyAsync,EntityToken,Account Management,SetProfilePolicy,false,Yes,Yes,Yes,Yes + diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagement.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagement.h new file mode 100644 index 0000000..3b4f5ec --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagement.h @@ -0,0 +1,3375 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +#if 0 +/// +/// Adds or updates a contact email to the player's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API adds a contact email to the player's profile. If the player's profile already contains a +/// contact email, it will update the contact email to the email address specified. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFAccountManagementClientAddOrUpdateContactEmailAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementAddOrUpdateContactEmailRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Adds playfab username/password auth to an existing account created via an anonymous auth method, +/// e.g. automatic device ID login. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithEmailAddressAsync, ClientLoginWithPlayFabAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientAddUsernamePasswordAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementAddUsernamePasswordRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientAddUsernamePassword call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_ALREADY_LINKED, +/// E_PF_EMAIL_ADDRESS_NOT_AVAILABLE, E_PF_INVALID_EMAIL_ADDRESS, E_PF_INVALID_PASSWORD, E_PF_INVALID_USERNAME, +/// E_PF_USERNAME_NOT_AVAILABLE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientAddUsernamePasswordGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientAddUsernamePasswordAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_ALREADY_LINKED, +/// E_PF_EMAIL_ADDRESS_NOT_AVAILABLE, E_PF_INVALID_EMAIL_ADDRESS, E_PF_INVALID_PASSWORD, E_PF_INVALID_USERNAME, +/// E_PF_USERNAME_NOT_AVAILABLE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientAddUsernamePasswordGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementAddUsernamePasswordResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +/// +/// Retrieves the user's PlayFab account details +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetAccountInfoAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetAccountInfoRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetAccountInfo call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetAccountInfoGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetAccountInfoAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetAccountInfoGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetAccountInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves all of the user's different kinds of info. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayerCombinedInfoAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayerCombinedInfoRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayerCombinedInfo call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementClientGetPlayerCombinedInfoGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayerCombinedInfoAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayerCombinedInfoGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerCombinedInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the player's profile +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This API allows for access to details regarding a user in the PlayFab service, usually for purposes +/// of customer support. Note that data returned may be Personally Identifying Information (PII), such +/// as email address, and so care should be taken in how this data is stored and managed. Since this call +/// will always return the relevant information for users who have accessed the title, the recommendation +/// is to not store this data locally. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayerProfileAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayerProfileRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayerProfile call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PLAYER_NOT_IN_GAME, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayerProfileGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayerProfileAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PLAYER_NOT_IN_GAME, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayerProfileGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerProfileResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromFacebookIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromFacebookIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Game identifiers. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get +/// the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromFacebookInstantGamesIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Game Center identifiers (referenced +/// in the Game Center Programming Guide as the Player Identifier). +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromGameCenterIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Google identifiers. The Google identifiers +/// are the IDs for the user accounts, available as 'id' in the Google+ People API calls. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGoogleIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromGoogleIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGoogleIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromGoogleIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGoogleIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromGoogleIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Google Play Games identifiers. The +/// Google Play Games identifiers are the IDs for the user accounts, available as 'playerId' in the Google +/// Play Games Services - Players API calls. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get +/// the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Kongregate identifiers. The Kongregate +/// identifiers are the IDs for the user accounts, available as 'user_id' from the Kongregate API methods(ex: +/// http://developers.kongregate.com/docs/client/getUserId). +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromKongregateIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromKongregateIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromKongregateIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromKongregateIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromKongregateIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromKongregateIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +/// +/// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Nintendo Switch. +/// When the asynchronous task is complete, call +/// and to +/// get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromNintendoServiceAccountIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get +/// the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromNintendoSwitchDeviceIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Sony PlayStation®. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromPSNAccountIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_PSN_AUTH_CODE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_PSN_AUTH_CODE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers +/// are the profile IDs for the user accounts, available as SteamId in the Steamworks Community API calls. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromSteamIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromSteamIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromSteamIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromSteamIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromSteamIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromSteamIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromSteamIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers +/// are the IDs for the user accounts, available as '_id' from the Twitch API methods (ex: https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromTwitchIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromTwitchIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromTwitchIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromTwitchIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromTwitchIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromTwitchIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32 and GDK. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayFabIDsFromXboxLiveIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Links the Android device identifier to the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithAndroidDeviceIDAsync, ClientUnlinkAndroidDeviceIDAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_LINKED_DEVICE_ALREADY_CLAIMED or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkAndroidDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the Apple account associated with the token to the user's PlayFab account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithAppleAsync, ClientUnlinkAppleAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_APPLE_NOT_ENABLED_FOR_TITLE, E_PF_INVALID_IDENTITY_PROVIDER_ID, E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementClientLinkAppleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Links the custom identifier, generated by the title, to the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientLoginWithCustomIDAsync, ClientUnlinkCustomIDAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkCustomIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if 0 +/// +/// Links the Facebook account associated with the provided Facebook access token to the user's PlayFab +/// account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Facebook sign-in is accomplished using the Facebook User Access Token. More information on the Token +/// can be found in the Facebook developer documentation (https://developers.facebook.com/docs/facebook-login/access-tokens/). +/// In Unity, for example, the Token is available as AccessToken in the Facebook SDK ScriptableObject +/// FB. Note that titles should never re-use the same Facebook applications between PlayFab Title IDs, +/// as Facebook provides unique user IDs per application and doing so can result in issues with the Facebook +/// ID for the user in their PlayFab account information. If you must re-use an application in a new PlayFab +/// Title ID, please be sure to first unlink all accounts from Facebook, or delete all users in the first +/// Title ID. See also ClientLoginWithFacebookAsync, ClientUnlinkFacebookAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_ACCOUNT_NOT_FOUND, E_PF_FACEBOOK_API_ERROR, +/// E_PF_INVALID_FACEBOOK_TOKEN, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkFacebookAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkFacebookAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the Facebook Instant Games Id to the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithFacebookInstantGamesIdAsync, ClientUnlinkFacebookInstantGamesIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_FACEBOOK_INSTANT_GAMES_AUTH_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_FACEBOOK_INSTANT_GAMES_SIGNATURE, +/// E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkFacebookInstantGamesIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the Game Center account associated with the provided Game Center ID to the user's PlayFab account. +/// Logging in with a Game Center ID is insecure if you do not include the optional PublicKeyUrl, Salt, +/// Signature, and Timestamp parameters in this request. It is recommended you require these parameters +/// on all Game Center calls by going to the Apple Add-ons page in the PlayFab Game Manager and enabling +/// the 'Require secure authentication only for this app' option. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientUnlinkGameCenterAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_GAME_CENTER_AUTHENTICATION_FAILED, E_PF_INVALID_GAME_CENTER_AUTH_REQUEST, +/// E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkGameCenterAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkGameCenterAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the currently signed-in user account to their Google account, using their Google account credentials +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Google sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google sign-in +/// for Android APIs on the device and passing it to this API. See also ClientLoginWithGoogleAccountAsync, +/// ClientUnlinkGoogleAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_GOOGLE_O_AUTH_ERROR, E_PF_GOOGLE_O_AUTH_NO_ID_TOKEN_INCLUDED_IN_RESPONSE, +/// E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_GOOGLE_TOKEN, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementClientLinkGoogleAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the currently signed-in user account to their Google Play Games account, using their Google +/// Play Games account credentials +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Google Play Games sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google +/// Play Games sign-in for Android APIs on the device and passing it to this API. See also ClientLoginWithGooglePlayGamesServicesAsync, +/// ClientUnlinkGooglePlayGamesServicesAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_GOOGLE_O_AUTH_ERROR, E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE, +/// E_PF_INVALID_GOOGLE_PLAY_GAMES_SERVER_AUTH_CODE, E_PF_INVALID_GOOGLE_TOKEN, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementClientLinkGooglePlayGamesServicesAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkGooglePlayGamesServicesAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the vendor-specific iOS device identifier to the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithIOSDeviceIDAsync, ClientUnlinkIOSDeviceIDAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_LINKED_DEVICE_ALREADY_CLAIMED or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkIOSDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the Kongregate identifier to the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithKongregateAsync, ClientUnlinkKongregateAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_KONGREGATE_TOKEN, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementClientLinkKongregateAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkKongregateAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +/// +/// Links the Nintendo account associated with the token to the user's PlayFab account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Nintendo Switch. +/// See also ClientLoginWithNintendoServiceAccountAsync, ClientUnlinkNintendoServiceAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_INVALID_IDENTITY_PROVIDER_ID, E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED, +/// E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkNintendoServiceAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientLinkNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the NintendoSwitchDeviceId to the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithNintendoSwitchDeviceIdAsync, ClientUnlinkNintendoSwitchDeviceIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Links an OpenID Connect account to a user's PlayFab account, based on an existing relationship between +/// a title and an Open ID Connect provider and the OpenId Connect JWT from that provider. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientLoginWithOpenIdConnectAsync, ClientUnlinkOpenIdConnectAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_INVALID_IDENTITY_PROVIDER_ID, E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementClientLinkOpenIdConnectAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Links the PlayStation :tm: Network account associated with the provided access code to the user's +/// PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Sony PlayStation®. +/// See also ClientLoginWithPSNAsync, ClientUnlinkPSNAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_INVALID_PSN_AUTH_CODE, E_PF_INVALID_PSN_AUTH_CODE, +/// E_PF_INVALID_PSN_ISSUER_ID, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED, E_PF_PSN_INACCESSIBLE or any of the +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkPSNAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientLinkPSNAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +/// +/// Links the Steam account associated with the provided Steam authentication ticket to the user's PlayFab +/// account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32. +/// Steam authentication is accomplished with the Steam Session Ticket. More information on the Ticket +/// can be found in the Steamworks SDK, here: https://partner.steamgames.com/documentation/auth (requires +/// sign-in). NOTE: For Steam authentication to work, the title must be configured with the Steam Application +/// ID and Publisher Key in the PlayFab Game Manager (under Properties). Information on creating a Publisher +/// Key (referred to as the Secret Key in PlayFab) for your title can be found here: https://partner.steamgames.com/documentation/webapi#publisherkey. +/// See also ClientLoginWithSteamAsync, ClientUnlinkSteamAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_INVALID_STEAM_TICKET, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED, +/// E_PF_STEAM_NOT_ENABLED_FOR_TITLE, E_PF_STEAM_USER_NOT_FOUND or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkSteamAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkSteamAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the Twitch account associated with the token to the user's PlayFab account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLoginWithTwitchAsync, ClientUnlinkTwitchAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_TWITCH_TOKEN, +/// E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED, E_PF_TWITCH_RESPONSE_ERROR or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkTwitchAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementLinkTwitchAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Links the Xbox Live account associated with the provided access code to the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32 and GDK. +/// See also ClientLoginWithXboxAsync, ClientUnlinkXboxAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_INVALID_XBOX_LIVE_TOKEN, +/// E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientLinkXboxAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientLinkXboxAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Removes a contact email from the player's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API removes an existing contact email from the player's profile. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFAccountManagementClientRemoveContactEmailAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementRemoveContactEmailRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Submit a report for another player (due to bad bahavior, etc.), so that customer service representatives +/// for the title can take action concerning potentially toxic players. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFAccountManagementClientReportPlayerAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementReportPlayerClientRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientReportPlayerAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFAccountManagementReportPlayerClientResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientReportPlayerGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFAccountManagementReportPlayerClientResult* result +) noexcept; + +#if 0 +/// +/// Forces an email to be sent to the registered email address for the user's account, with a link allowing +/// the user to change the password.If an account recovery email template ID is provided, an email using +/// the custom email template will be used. +/// +/// PFServiceConfigHandle returned from PFServiceConfigCreateHandle call. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// If the account in question is a 'temporary' account (for example, one that was created via a call +/// to LoginFromIOSDeviceID), thisfunction will have no effect. Only PlayFab accounts which have valid +/// email addresses will be able to receive a password reset email using this API. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_EMAIL_RECIPIENT_BLACKLISTED, E_PF_INVALID_EMAIL_ADDRESS, E_PF_NO_CONTACT_EMAIL_ADDRESS_FOUND, +/// E_PF_SMTP_ADDON_NOT_ENABLED or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientSendAccountRecoveryEmailAsync( + _In_ PFServiceConfigHandle serviceConfigHandle, + _In_ const PFAccountManagementSendAccountRecoveryEmailRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Android device identifier from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkAndroidDeviceIDAsync, ClientLoginWithAndroidDeviceIDAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_DEVICE_NOT_LINKED or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkAndroidDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkAndroidDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Apple account from the user's PlayFab account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkAppleAsync, ClientLoginWithAppleAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_APPLE_NOT_ENABLED_FOR_TITLE or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkAppleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkAppleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Unlinks the related custom identifier from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientLinkCustomIDAsync, ClientLoginWithCustomIDAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_CUSTOM_ID_NOT_LINKED or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkCustomIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkCustomIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if 0 +/// +/// Unlinks the related Facebook account from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkFacebookAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkFacebookAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkFacebookAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Facebook Instant Game Ids from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkFacebookInstantGamesIdAsync, ClientLoginWithFacebookInstantGamesIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_FACEBOOK_INSTANT_GAMES_ID_NOT_LINKED or any +/// of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAccountManagementClientUnlinkFacebookInstantGamesIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkFacebookInstantGamesIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Game Center account from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkGameCenterAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkGameCenterAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkGameCenterAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Google account from the user's PlayFab account (https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#public-methods). +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkGoogleAccountAsync, ClientLoginWithGoogleAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkGoogleAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkGoogleAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Google Play Games account from the user's PlayFab account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkGooglePlayGamesServicesAccountAsync, ClientLoginWithGooglePlayGamesServicesAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkGooglePlayGamesServicesAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related iOS device identifier from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkIOSDeviceIDAsync, ClientLoginWithIOSDeviceIDAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_DEVICE_NOT_LINKED or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkIOSDeviceIDAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkIOSDeviceIDRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Kongregate identifier from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkKongregateAsync, ClientLoginWithKongregateAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkKongregateAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkKongregateAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +/// +/// Unlinks the related Nintendo account from the user's PlayFab account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Nintendo Switch. +/// See also ClientLinkNintendoServiceAccountAsync, ClientLoginWithNintendoServiceAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE or any +/// of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAccountManagementClientUnlinkNintendoServiceAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientUnlinkNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkNintendoSwitchDeviceIdAsync, ClientLoginWithNintendoSwitchDeviceIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_NINTENDO_SWITCH_DEVICE_ID_NOT_LINKED or any +/// of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAccountManagementClientUnlinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Unlinks an OpenID Connect account from a user's PlayFab account, based on the connection ID of an +/// existing relationship between a title and an Open ID Connect provider. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientLinkOpenIdConnectAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkOpenIdConnectAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkOpenIdConnectRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Sony PlayStation®. +/// See also ClientLinkPSNAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkPSNAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientUnlinkPSNAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +/// +/// Unlinks the related Steam account from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32. +/// See also ClientLinkSteamAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkSteamAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkSteamAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Twitch account from the user's PlayFab account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ClientLinkTwitchAsync, ClientLoginWithTwitchAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_INVALID_TWITCH_TOKEN or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkTwitchAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUnlinkTwitchAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Unlinks the related Xbox Live account from the user's PlayFab account +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32 and GDK. +/// See also ClientLinkXboxAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_INVALID_XBOX_LIVE_TOKEN or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUnlinkXboxAccountAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientUnlinkXboxAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Update the avatar URL of the player +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFAccountManagementClientUpdateAvatarUrlAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementClientUpdateAvatarUrlRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if 0 +/// +/// Updates the title specific display name for the user +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// In addition to the PlayFab username, titles can make use of a DisplayName which is also a unique +/// identifier, but specific to the title. This allows for unique names which more closely match the theme +/// or genre of a title, for example. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementClientUpdateUserTitleDisplayNameAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementUpdateUserTitleDisplayNameRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientUpdateUserTitleDisplayName call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_FOUND, +/// E_PF_INVALID_PARTNER_RESPONSE, E_PF_NAME_NOT_AVAILABLE, E_PF_PROFANE_DISPLAY_NAME or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementClientUpdateUserTitleDisplayNameGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementClientUpdateUserTitleDisplayNameAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_FOUND, +/// E_PF_INVALID_PARTNER_RESPONSE, E_PF_NAME_NOT_AVAILABLE, E_PF_PROFANE_DISPLAY_NAME or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementClientUpdateUserTitleDisplayNameGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementUpdateUserTitleDisplayNameResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// The existence of each user will not be verified. When banning by IP or MAC address, multiple players +/// may be affected, so use this feature with caution. Returns information about the new bans. See also +/// ServerGetUserBansAsync, ServerRevokeAllBansForUserAsync, ServerRevokeBansAsync, ServerUpdateBansAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerBanUsersAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementBanUsersRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerBanUsers call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerBanUsersGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerBanUsersAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerBanUsersGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementBanUsersResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Removes a user's player account from a title and deletes all associated data +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Deletes all data associated with the player, including statistics, custom data, inventory, purchases, +/// virtual currency balances, characters and shared group memberships. Removes the player from all leaderboards +/// and player search indexes. Does not delete PlayStream event history associated with the player. Does +/// not delete the publisher user account that created the player in the title nor associated data such +/// as username, password, email address, account linkages, or friends list. Note, this API queues the +/// player for deletion and returns immediately. It may take several minutes or more before all player +/// data is fully deleted. Until the player data is fully deleted, attempts to recreate the player with +/// the same user account in the same title will fail with the 'AccountDeleted' error. This API must be +/// enabled for use as an option in the game manager website. It is disabled by default. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_API_NOT_ENABLED_FOR_GAME_SERVER_ACCESS or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerDeletePlayerAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementDeletePlayerRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Returns whatever info is requested in the response for the user. Note that PII (like email address, +/// facebook id) may be returned. All parameters default to false. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetPlayerCombinedInfoAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayerCombinedInfoRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayerCombinedInfo call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayerCombinedInfoGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayerCombinedInfoAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayerCombinedInfoGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerCombinedInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the player's profile +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API allows for access to details regarding a user in the PlayFab service, usually for purposes +/// of customer support. Note that data returned may be Personally Identifying Information (PII), such +/// as email address, and so care should be taken in how this data is stored and managed. Since this call +/// will always return the relevant information for users who have accessed the title, the recommendation +/// is to not store this data locally. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetPlayerProfileAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayerProfileRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayerProfile call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PLAYER_NOT_IN_GAME +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementServerGetPlayerProfileGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayerProfileAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PLAYER_NOT_IN_GAME +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayerProfileGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerProfileResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookIDsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromFacebookIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromFacebookIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Games identifiers. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get +/// the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromFacebookInstantGamesIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to +/// get the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromNintendoServiceAccountIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get +/// the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromNintendoSwitchDeviceIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromPSNAccountIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers +/// are the profile IDs for the user accounts, available as SteamId in the Steamworks Community API calls. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromSteamIDsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromSteamIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromSteamIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromSteamIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromSteamIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromSteamIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromSteamIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers +/// are the IDs for the user accounts, available as '_id' from the Twitch API methods (ex: https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromTwitchIDsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromTwitchIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromTwitchIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromTwitchIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromTwitchIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromTwitchIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayFabIDsFromXboxLiveIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the associated PlayFab account identifiers for the given set of server custom identifiers. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetServerCustomIDsFromPlayFabIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the relevant details for a specified user +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API allows for access to details regarding a user in the PlayFab service, usually for purposes +/// of customer support. Note that data returned may be Personally Identifying Information (PII), such +/// as email address, and so care should be taken in how this data is stored and managed. Since this call +/// will always return the relevant information for users who have accessed the title, the recommendation +/// is to not store this data locally. See also ServerGetUserInventoryAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetUserAccountInfoAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetUserAccountInfoRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserAccountInfo call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerGetUserAccountInfoGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetUserAccountInfoAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetUserAccountInfoGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetUserAccountInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Gets all bans for a user. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Get all bans for a user, including inactive and expired bans. See also ServerBanUsersAsync, ServerRevokeAllBansForUserAsync, +/// ServerRevokeBansAsync, ServerUpdateBansAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerGetUserBansAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementGetUserBansRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserBans call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_USERIS_NOT_VALID +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementServerGetUserBansGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerGetUserBansAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_USERIS_NOT_VALID +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerGetUserBansGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetUserBansResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Links the Nintendo account associated with the token to the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerUnlinkNintendoServiceAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_INVALID_IDENTITY_PROVIDER_ID, E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED, +/// E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerLinkNintendoServiceAccountAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerLinkNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the NintendoSwitchDeviceId to the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerUnlinkNintendoSwitchDeviceIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerLinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the PlayStation :tm: Network account associated with the provided access code to the user's +/// PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerUnlinkPSNAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_ACCOUNT_NOT_FOUND, E_PF_INVALID_NAMESPACE_MISMATCH, +/// E_PF_INVALID_PSN_AUTH_CODE, E_PF_INVALID_PSN_ISSUER_ID, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED, E_PF_PSN_INACCESSIBLE, +/// E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerLinkPSNAccountAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerLinkPSNAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the PlayStation :tm: Network account associated with the provided user id to the user's PlayFab +/// account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_ACCOUNT_NOT_FOUND, E_PF_INVALID_NAMESPACE_MISMATCH, +/// E_PF_INVALID_PSN_AUTH_CODE, E_PF_INVALID_PSN_ISSUER_ID, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED, E_PF_PSN_INACCESSIBLE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementServerLinkPSNIdAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementLinkPSNIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the custom server identifier, generated by the title, to the user's PlayFab account. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_FOUND, E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED or any of +/// the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAccountManagementServerLinkServerCustomIdAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementLinkServerCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the Steam account associated with the provided Steam ID to the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLoginWithSteamIdAsync, ServerUnlinkSteamIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_INVALID_STEAM_TICKET, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED, +/// E_PF_STEAM_NOT_ENABLED_FOR_TITLE, E_PF_STEAM_USER_NOT_FOUND or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerLinkSteamIdAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementLinkSteamIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Links the Xbox Live account associated with the provided access code to the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLoginWithXboxAsync, ServerUnlinkXboxAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_ALREADY_LINKED, E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementServerLinkXboxAccountAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerLinkXboxAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Revoke all active bans for a user. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Setting the active state of all non-expired bans for a user to Inactive. Expired bans with an Active +/// state will be ignored, however. Returns information about applied updates only. See also ServerBanUsersAsync, +/// ServerGetUserBansAsync, ServerRevokeBansAsync, ServerUpdateBansAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerRevokeAllBansForUserAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementRevokeAllBansForUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerRevokeAllBansForUser call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_USERIS_NOT_VALID +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFAccountManagementServerRevokeAllBansForUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerRevokeAllBansForUserAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_USERIS_NOT_VALID +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerRevokeAllBansForUserGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementRevokeAllBansForUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Revoke all active bans specified with BanId. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Setting the active state of all bans requested to Inactive regardless of whether that ban has already +/// expired. BanIds that do not exist will be skipped. Returns information about applied updates only. +/// See also ServerBanUsersAsync, ServerGetUserBansAsync, ServerRevokeAllBansForUserAsync, ServerUpdateBansAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerRevokeBansAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementRevokeBansRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerRevokeBans call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerRevokeBansGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerRevokeBansAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerRevokeBansGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementRevokeBansResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Forces an email to be sent to the registered contact email address for the user's account based on +/// an account recovery email template +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// PlayFab accounts which have valid email address or username will be able to receive a password reset +/// email using this API.The email sent must be an account recovery email template. The username or email +/// can be passed in to send the email. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_EMAIL_CLIENT_CANCELED_TASK, E_PF_EMAIL_CLIENT_TIMEOUT, E_PF_EMAIL_MESSAGE_TO_ADDRESS_IS_MISSING, +/// E_PF_EMAIL_TEMPLATE_MISSING, E_PF_NO_CONTACT_EMAIL_ADDRESS_FOUND, E_PF_SMTP_ADDON_NOT_ENABLED or any +/// of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAccountManagementServerSendCustomAccountRecoveryEmailAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementSendCustomAccountRecoveryEmailRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Sends an email based on an email template to a player's contact email +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Sends an email for only players that have contact emails associated with them. Takes in an email +/// template ID specifyingthe email template to send. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_EMAIL_CLIENT_CANCELED_TASK, E_PF_EMAIL_CLIENT_TIMEOUT, E_PF_EMAIL_TEMPLATE_MISSING, +/// E_PF_NO_CONTACT_EMAIL_ADDRESS_FOUND, E_PF_SMTP_ADDON_NOT_ENABLED or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerSendEmailFromTemplateAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementSendEmailFromTemplateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Nintendo account from the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLinkNintendoServiceAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE or any +/// of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAccountManagementServerUnlinkNintendoServiceAccountAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerUnlinkNintendoServiceAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLinkNintendoSwitchDeviceIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_NINTENDO_SWITCH_DEVICE_ID_NOT_LINKED or any +/// of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFAccountManagementServerUnlinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLinkPSNAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerUnlinkPSNAccountAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerUnlinkPSNAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the custom server identifier from the user's PlayFab account. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLinkServerCustomIdAsync, ServerLoginWithServerCustomIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_IDENTIFIER_NOT_LINKED or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerUnlinkServerCustomIdAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementUnlinkServerCustomIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the Steam account associated with the provided Steam ID to the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLinkSteamIdAsync, ServerLoginWithSteamIdAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerUnlinkSteamIdAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementUnlinkSteamIdRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Unlinks the related Xbox Live account from the user's PlayFab account +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerLinkXboxAccountAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_LINKED, E_PF_INVALID_XBOX_LIVE_TOKEN or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerUnlinkXboxAccountAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerUnlinkXboxAccountRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Update the avatar URL of the specified player +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFAccountManagementServerUpdateAvatarUrlAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementServerUpdateAvatarUrlRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Updates information of a list of existing bans specified with Ban Ids. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// For each ban, only updates the values that are set. Leave any value to null for no change. If a ban +/// could not be found, the rest are still applied. Returns information about applied updates only. See +/// also ServerBanUsersAsync, ServerGetUserBansAsync, ServerRevokeAllBansForUserAsync, ServerRevokeBansAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementServerUpdateBansAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFAccountManagementUpdateBansRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerUpdateBans call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementServerUpdateBansGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementServerUpdateBansAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementServerUpdateBansGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementUpdateBansResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title player accounts associated with the given XUIDs. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Given a collection of Xbox IDs (XUIDs), returns all title player accounts. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFAccountManagementGetTitlePlayersFromXboxLiveIDsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetTitlePlayersFromXboxLiveIDs call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFAccountManagementGetTitlePlayersFromXboxLiveIDsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFAccountManagementGetTitlePlayersFromXboxLiveIDsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFAccountManagementGetTitlePlayersFromXboxLiveIDsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetTitlePlayersFromProviderIDsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagementTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagementTypes.h new file mode 100644 index 0000000..bb46c96 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFAccountManagementTypes.h @@ -0,0 +1,2917 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFAccountManagementAddOrUpdateContactEmailRequest data model. This API adds a contact email to the +/// player's profile. If the player's profile already contains a contact email, it will update the contact +/// email to the email address specified. +/// +typedef struct PFAccountManagementAddOrUpdateContactEmailRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The new contact email to associate with the player. + /// + _Null_terminated_ const char* emailAddress; + +} PFAccountManagementAddOrUpdateContactEmailRequest; + +/// +/// PFAccountManagementAddUsernamePasswordRequest data model. +/// +typedef struct PFAccountManagementAddUsernamePasswordRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// User email address attached to their account. + /// + _Null_terminated_ const char* email; + + /// + /// Password for the PlayFab account (6-100 characters). + /// + _Null_terminated_ const char* password; + + /// + /// PlayFab username for the account (3-20 characters). + /// + _Null_terminated_ const char* username; + +} PFAccountManagementAddUsernamePasswordRequest; + +/// +/// PFAccountManagementAddUsernamePasswordResult data model. Each account must have a unique username +/// and email address in the PlayFab service. Once created, the account may be associated with additional +/// accounts (Steam, Facebook, Game Center, etc.), allowing for added social network lists and achievements +/// systems. This can also be used to provide a recovery method if the user loses their original means +/// of access. +/// +typedef struct PFAccountManagementAddUsernamePasswordResult +{ + /// + /// (Optional) PlayFab unique user name. + /// + _Maybenull_ _Null_terminated_ const char* username; + +} PFAccountManagementAddUsernamePasswordResult; + +/// +/// PFAccountManagementGetAccountInfoRequest data model. +/// +typedef struct PFAccountManagementGetAccountInfoRequest +{ + /// + /// (Optional) User email address for the account to find (if no Username is specified). + /// + _Maybenull_ _Null_terminated_ const char* email; + + /// + /// (Optional) Unique PlayFab identifier of the user whose info is being requested. Optional, defaults + /// to the authenticated user if no other lookup identifier set. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Title-specific username for the account to find (if no Email is set). Note that if + /// the non-unique Title Display Names option is enabled for the title, attempts to look up users + /// by Title Display Name will always return AccountNotFound. + /// + _Maybenull_ _Null_terminated_ const char* titleDisplayName; + + /// + /// (Optional) PlayFab Username for the account to find (if no PlayFabId is specified). + /// + _Maybenull_ _Null_terminated_ const char* username; + +} PFAccountManagementGetAccountInfoRequest; + +/// +/// PFAccountManagementGetAccountInfoResult data model. This API retrieves details regarding the player +/// in the PlayFab service. Note that when this call is used to retrieve data about another player (not +/// the one signed into the local client), some data, such as Personally Identifying Information (PII), +/// will be omitted for privacy reasons or to comply with the requirements of the platform belongs to. +/// The user account returned will be based on the identifier provided in priority order: PlayFabId, Username, +/// Email, then TitleDisplayName. If no identifier is specified, the currently signed in user's information +/// will be returned. +/// +typedef struct PFAccountManagementGetAccountInfoResult +{ + /// + /// (Optional) Account information for the local user. + /// + _Maybenull_ PFUserAccountInfo const* accountInfo; + +} PFAccountManagementGetAccountInfoResult; + +/// +/// PFAccountManagementGetPlayerCombinedInfoRequest data model. +/// +typedef struct PFAccountManagementGetPlayerCombinedInfoRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Flags for which pieces of info to return for the user. + /// + PFGetPlayerCombinedInfoRequestParams const* infoRequestParameters; + + /// + /// PlayFabId of the user whose data will be returned. If not filled included, we return the data + /// for the calling player. . + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementGetPlayerCombinedInfoRequest; + +/// +/// PFAccountManagementGetPlayerCombinedInfoResult data model. Returns whatever info is requested in +/// the response for the user. If no user is explicitly requested this defaults to the authenticated user. +/// If the user is the same as the requester, PII (like email address, facebook id) is returned if available. +/// Otherwise, only public information is returned. All parameters default to false. +/// +typedef struct PFAccountManagementGetPlayerCombinedInfoResult +{ + /// + /// (Optional) Results for requested info. + /// + _Maybenull_ PFGetPlayerCombinedInfoResultPayload const* infoResultPayload; + + /// + /// (Optional) Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementGetPlayerCombinedInfoResult; + +/// +/// PFAccountManagementGetPlayerProfileRequest data model. This API allows for access to details regarding +/// a user in the PlayFab service, usually for purposes of customer support. Note that data returned may +/// be Personally Identifying Information (PII), such as email address, and so care should be taken in +/// how this data is stored and managed. Since this call will always return the relevant information for +/// users who have accessed the title, the recommendation is to not store this data locally. +/// +typedef struct PFAccountManagementGetPlayerProfileRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// (Optional) If non-null, this determines which properties of the resulting player profiles to + /// return. For API calls from the client, only the allowed client profile properties for the title + /// may be requested. These allowed properties are configured in the Game Manager "Client Profile + /// Options" tab in the "Settings" section. + /// + _Maybenull_ PFPlayerProfileViewConstraints const* profileConstraints; + +} PFAccountManagementGetPlayerProfileRequest; + +/// +/// PFAccountManagementGetPlayerProfileResult data model. +/// +typedef struct PFAccountManagementGetPlayerProfileResult +{ + /// + /// (Optional) The profile of the player. This profile is not guaranteed to be up-to-date. For a + /// new player, this profile will not exist. + /// + _Maybenull_ PFPlayerProfileModel const* playerProfile; + +} PFAccountManagementGetPlayerProfileResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest +{ + /// + /// Array of unique Facebook identifiers for which the title needs to get PlayFab identifiers. The + /// array cannot exceed 2,000 in length. + /// + _Field_size_(facebookIDsCount) const char* const* facebookIDs; + + /// + /// Count of facebookIDs + /// + uint32_t facebookIDsCount; + +} PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest; + +/// +/// PFAccountManagementFacebookPlayFabIdPair data model. +/// +typedef struct PFAccountManagementFacebookPlayFabIdPair +{ + /// + /// (Optional) Unique Facebook identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* facebookId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Facebook identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementFacebookPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromFacebookIDsResult data model. For Facebook identifiers which +/// have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromFacebookIDsResult +{ + /// + /// (Optional) Mapping of Facebook identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementFacebookPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromFacebookIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest +{ + /// + /// Array of unique Facebook Instant Games identifiers for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 25 in length. + /// + _Field_size_(facebookInstantGamesIdsCount) const char* const* facebookInstantGamesIds; + + /// + /// Count of facebookInstantGamesIds + /// + uint32_t facebookInstantGamesIdsCount; + +} PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest; + +/// +/// PFAccountManagementFacebookInstantGamesPlayFabIdPair data model. +/// +typedef struct PFAccountManagementFacebookInstantGamesPlayFabIdPair +{ + /// + /// (Optional) Unique Facebook Instant Games identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* facebookInstantGamesId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Facebook Instant Games identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementFacebookInstantGamesPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult data model. For Facebook Instant +/// Game identifiers which have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult +{ + /// + /// (Optional) Mapping of Facebook Instant Games identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementFacebookInstantGamesPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest +{ + /// + /// Array of unique Game Center identifiers (the Player Identifier) for which the title needs to + /// get PlayFab identifiers. The array cannot exceed 2,000 in length. + /// + _Field_size_(gameCenterIDsCount) const char* const* gameCenterIDs; + + /// + /// Count of gameCenterIDs + /// + uint32_t gameCenterIDsCount; + +} PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest; + +/// +/// PFAccountManagementGameCenterPlayFabIdPair data model. +/// +typedef struct PFAccountManagementGameCenterPlayFabIdPair +{ + /// + /// (Optional) Unique Game Center identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* gameCenterId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Game Center identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementGameCenterPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult data model. For Game Center identifiers which +/// have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult +{ + /// + /// (Optional) Mapping of Game Center identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementGameCenterPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest +{ + /// + /// Array of unique Google identifiers (Google+ user IDs) for which the title needs to get PlayFab + /// identifiers. The array cannot exceed 2,000 in length. + /// + _Field_size_(googleIDsCount) const char* const* googleIDs; + + /// + /// Count of googleIDs + /// + uint32_t googleIDsCount; + +} PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest; + +/// +/// PFAccountManagementGooglePlayFabIdPair data model. +/// +typedef struct PFAccountManagementGooglePlayFabIdPair +{ + /// + /// (Optional) Unique Google identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* googleId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Google identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementGooglePlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromGoogleIDsResult data model. For Google identifiers which have +/// not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromGoogleIDsResult +{ + /// + /// (Optional) Mapping of Google identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementGooglePlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromGoogleIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest +{ + /// + /// Array of unique Google Play Games identifiers (Google+ user IDs) for which the title needs to + /// get PlayFab identifiers. The array cannot exceed 2,000 in length. + /// + _Field_size_(googlePlayGamesPlayerIDsCount) const char* const* googlePlayGamesPlayerIDs; + + /// + /// Count of googlePlayGamesPlayerIDs + /// + uint32_t googlePlayGamesPlayerIDsCount; + +} PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest; + +/// +/// PFAccountManagementGooglePlayGamesPlayFabIdPair data model. +/// +typedef struct PFAccountManagementGooglePlayGamesPlayFabIdPair +{ + /// + /// (Optional) Unique Google Play Games identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* googlePlayGamesPlayerId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Google Play Games identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementGooglePlayGamesPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult data model. For Google Play Games +/// identifiers which have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult +{ + /// + /// (Optional) Mapping of Google Play Games identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementGooglePlayGamesPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest +{ + /// + /// Array of unique Kongregate identifiers (Kongregate's user_id) for which the title needs to get + /// PlayFab identifiers. The array cannot exceed 2,000 in length. + /// + _Field_size_(kongregateIDsCount) const char* const* kongregateIDs; + + /// + /// Count of kongregateIDs + /// + uint32_t kongregateIDsCount; + +} PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest; + +/// +/// PFAccountManagementKongregatePlayFabIdPair data model. +/// +typedef struct PFAccountManagementKongregatePlayFabIdPair +{ + /// + /// (Optional) Unique Kongregate identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* kongregateId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Kongregate identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementKongregatePlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromKongregateIDsResult data model. For Kongregate identifiers which +/// have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromKongregateIDsResult +{ + /// + /// (Optional) Mapping of Kongregate identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementKongregatePlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromKongregateIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest +{ + /// + /// Array of unique Nintendo Switch Account identifiers for which the title needs to get PlayFab + /// identifiers. The array cannot exceed 2,000 in length. + /// + _Field_size_(nintendoAccountIdsCount) const char* const* nintendoAccountIds; + + /// + /// Count of nintendoAccountIds + /// + uint32_t nintendoAccountIdsCount; + +} PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest; + +/// +/// PFAccountManagementNintendoServiceAccountPlayFabIdPair data model. +/// +typedef struct PFAccountManagementNintendoServiceAccountPlayFabIdPair +{ + /// + /// (Optional) Unique Nintendo Switch Service Account identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* nintendoServiceAccountId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Nintendo Switch Service Account identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementNintendoServiceAccountPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult data model. For Nintendo Service +/// Account identifiers which have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult +{ + /// + /// (Optional) Mapping of Nintendo Switch Service Account identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementNintendoServiceAccountPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest +{ + /// + /// Array of unique Nintendo Switch Device identifiers for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 2,000 in length. + /// + _Field_size_(nintendoSwitchDeviceIdsCount) const char* const* nintendoSwitchDeviceIds; + + /// + /// Count of nintendoSwitchDeviceIds + /// + uint32_t nintendoSwitchDeviceIdsCount; + +} PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest; + +/// +/// PFAccountManagementNintendoSwitchPlayFabIdPair data model. +/// +typedef struct PFAccountManagementNintendoSwitchPlayFabIdPair +{ + /// + /// (Optional) Unique Nintendo Switch Device identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* nintendoSwitchDeviceId; + + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Nintendo Switch Device identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFAccountManagementNintendoSwitchPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult data model. For Nintendo Switch +/// identifiers which have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult +{ + /// + /// (Optional) Mapping of Nintendo Switch Device identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementNintendoSwitchPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest +{ + /// + /// (Optional) Id of the PlayStation :tm: Network issuer environment. If null, defaults to production + /// environment. + /// + _Maybenull_ int32_t const* issuerId; + + /// + /// Array of unique PlayStation :tm: Network identifiers for which the title needs to get PlayFab + /// identifiers. The array cannot exceed 2,000 in length. + /// + _Field_size_(PSNAccountIDsCount) const char* const* PSNAccountIDs; + + /// + /// Count of PSNAccountIDs + /// + uint32_t PSNAccountIDsCount; + +} PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest; + +/// +/// PFAccountManagementPSNAccountPlayFabIdPair data model. +/// +typedef struct PFAccountManagementPSNAccountPlayFabIdPair +{ + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// PlayStation :tm: Network identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Unique PlayStation :tm: Network identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* PSNAccountId; + +} PFAccountManagementPSNAccountPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult data model. For PlayStation :tm: Network +/// identifiers which have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult +{ + /// + /// (Optional) Mapping of PlayStation :tm: Network identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementPSNAccountPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromSteamIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromSteamIDsRequest +{ + /// + /// (Optional) Array of unique Steam identifiers (Steam profile IDs) for which the title needs to + /// get PlayFab identifiers. The array cannot exceed 2,000 in length. + /// + _Maybenull_ _Field_size_(steamStringIDsCount) const char* const* steamStringIDs; + + /// + /// Count of steamStringIDs + /// + uint32_t steamStringIDsCount; + +} PFAccountManagementGetPlayFabIDsFromSteamIDsRequest; + +/// +/// PFAccountManagementSteamPlayFabIdPair data model. +/// +typedef struct PFAccountManagementSteamPlayFabIdPair +{ + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Steam identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Unique Steam identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* steamStringId; + +} PFAccountManagementSteamPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromSteamIDsResult data model. For Steam identifiers which have not +/// been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromSteamIDsResult +{ + /// + /// (Optional) Mapping of Steam identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementSteamPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromSteamIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest +{ + /// + /// Array of unique Twitch identifiers (Twitch's _id) for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 2,000 in length. + /// + _Field_size_(twitchIdsCount) const char* const* twitchIds; + + /// + /// Count of twitchIds + /// + uint32_t twitchIdsCount; + +} PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest; + +/// +/// PFAccountManagementTwitchPlayFabIdPair data model. +/// +typedef struct PFAccountManagementTwitchPlayFabIdPair +{ + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Twitch identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Unique Twitch identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* twitchId; + +} PFAccountManagementTwitchPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromTwitchIDsResult data model. For Twitch identifiers which have +/// not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromTwitchIDsResult +{ + /// + /// (Optional) Mapping of Twitch identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementTwitchPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromTwitchIDsResult; + +/// +/// PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest data model. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest +{ + /// + /// (Optional) The ID of Xbox Live sandbox. + /// + _Maybenull_ _Null_terminated_ const char* sandbox; + + /// + /// Array of unique Xbox Live account identifiers for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 2,000 in length. + /// + _Field_size_(xboxLiveAccountIDsCount) const char* const* xboxLiveAccountIDs; + + /// + /// Count of xboxLiveAccountIDs + /// + uint32_t xboxLiveAccountIDsCount; + +} PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest; + +/// +/// PFAccountManagementXboxLiveAccountPlayFabIdPair data model. +/// +typedef struct PFAccountManagementXboxLiveAccountPlayFabIdPair +{ + /// + /// (Optional) Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the + /// Xbox Live identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Unique Xbox Live identifier for a user. + /// + _Maybenull_ _Null_terminated_ const char* xboxLiveAccountId; + +} PFAccountManagementXboxLiveAccountPlayFabIdPair; + +/// +/// PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult data model. For XboxLive identifiers which +/// have not been linked to PlayFab accounts, null will be returned. +/// +typedef struct PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult +{ + /// + /// (Optional) Mapping of Xbox Live identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementXboxLiveAccountPlayFabIdPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult; + +/// +/// PFAccountManagementLinkAndroidDeviceIDRequest data model. +/// +typedef struct PFAccountManagementLinkAndroidDeviceIDRequest +{ + /// + /// (Optional) Specific model of the user's device. + /// + _Maybenull_ _Null_terminated_ const char* androidDevice; + + /// + /// Android device identifier for the user's device. + /// + _Null_terminated_ const char* androidDeviceId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the device, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// (Optional) Specific Operating System version for the user's device. + /// + _Maybenull_ _Null_terminated_ const char* OS; + +} PFAccountManagementLinkAndroidDeviceIDRequest; + +/// +/// PFAccountManagementLinkAppleRequest data model. +/// +typedef struct PFAccountManagementLinkAppleRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to a specific Apple account, unlink the other user + /// and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// The JSON Web token (JWT) returned by Apple after login. Represented as the identityToken field + /// in the authorization credential payload. Used to validate the request and find the user ID (Apple + /// subject) to link with. + /// + _Null_terminated_ const char* identityToken; + +} PFAccountManagementLinkAppleRequest; + +/// +/// PFAccountManagementLinkCustomIDRequest data model. +/// +typedef struct PFAccountManagementLinkCustomIDRequest +{ + /// + /// Custom unique identifier for the user, generated by the title. + /// + _Null_terminated_ const char* customId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the custom ID, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + +} PFAccountManagementLinkCustomIDRequest; + +/// +/// PFAccountManagementLinkFacebookAccountRequest data model. Facebook sign-in is accomplished using +/// the Facebook User Access Token. More information on the Token can be found in the Facebook developer +/// documentation (https://developers.facebook.com/docs/facebook-login/access-tokens/). In Unity, for +/// example, the Token is available as AccessToken in the Facebook SDK ScriptableObject FB. Note that +/// titles should never re-use the same Facebook applications between PlayFab Title IDs, as Facebook provides +/// unique user IDs per application and doing so can result in issues with the Facebook ID for the user +/// in their PlayFab account information. If you must re-use an application in a new PlayFab Title ID, +/// please be sure to first unlink all accounts from Facebook, or delete all users in the first Title +/// ID. +/// +typedef struct PFAccountManagementLinkFacebookAccountRequest +{ + /// + /// Unique identifier from Facebook for the user. + /// + _Null_terminated_ const char* accessToken; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + +} PFAccountManagementLinkFacebookAccountRequest; + +/// +/// PFAccountManagementLinkFacebookInstantGamesIdRequest data model. +/// +typedef struct PFAccountManagementLinkFacebookInstantGamesIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Facebook Instant Games signature for the user. + /// + _Null_terminated_ const char* facebookInstantGamesSignature; + + /// + /// (Optional) If another user is already linked to the Facebook Instant Games ID, unlink the other + /// user and re-link. + /// + _Maybenull_ bool const* forceLink; + +} PFAccountManagementLinkFacebookInstantGamesIdRequest; + +/// +/// PFAccountManagementLinkGameCenterAccountRequest data model. +/// +typedef struct PFAccountManagementLinkGameCenterAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// If the current user is already linked, link both accounts. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Game Center identifier for the player account to be linked. + /// + _Null_terminated_ const char* gameCenterId; + + /// + /// (Optional) The URL for the public encryption key that will be used to verify the signature. + /// + _Maybenull_ _Null_terminated_ const char* publicKeyUrl; + + /// + /// (Optional) A random value used to compute the hash and keep it randomized. + /// + _Maybenull_ _Null_terminated_ const char* salt; + + /// + /// (Optional) The verification signature of the authentication payload. + /// + _Maybenull_ _Null_terminated_ const char* signature; + + /// + /// (Optional) The integer representation of date and time that the signature was created on. PlayFab + /// will reject authentication signatures not within 10 minutes of the server's current time. + /// + _Maybenull_ _Null_terminated_ const char* timestamp; + +} PFAccountManagementLinkGameCenterAccountRequest; + +/// +/// PFAccountManagementLinkGoogleAccountRequest data model. Google sign-in is accomplished by obtaining +/// a Google OAuth 2.0 credential using the Google sign-in for Android APIs on the device and passing +/// it to this API. +/// +typedef struct PFAccountManagementLinkGoogleAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// If the current user is already linked, link both accounts. + /// + _Maybenull_ bool const* forceLink; + + /// + /// (Optional) Server authentication code obtained on the client by calling getServerAuthCode() (https://developers.google.com/identity/sign-in/android/offline-access) + /// from Google Play for the user. + /// + _Maybenull_ _Null_terminated_ const char* serverAuthCode; + +} PFAccountManagementLinkGoogleAccountRequest; + +/// +/// PFAccountManagementLinkGooglePlayGamesServicesAccountRequest data model. Google Play Games sign-in +/// is accomplished by obtaining a Google OAuth 2.0 credential using the Google Play Games sign-in for +/// Android APIs on the device and passing it to this API. +/// +typedef struct PFAccountManagementLinkGooglePlayGamesServicesAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// If the current user is already linked, link both accounts. + /// + _Maybenull_ bool const* forceLink; + + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the requestServerSideAccess() + /// (https://developers.google.com/games/services/android/signin) Google Play Games client API. + /// + _Null_terminated_ const char* serverAuthCode; + +} PFAccountManagementLinkGooglePlayGamesServicesAccountRequest; + +/// +/// PFAccountManagementLinkIOSDeviceIDRequest data model. +/// +typedef struct PFAccountManagementLinkIOSDeviceIDRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Vendor-specific iOS identifier for the user's device. + /// + _Null_terminated_ const char* deviceId; + + /// + /// (Optional) Specific model of the user's device. + /// + _Maybenull_ _Null_terminated_ const char* deviceModel; + + /// + /// (Optional) If another user is already linked to the device, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// (Optional) Specific Operating System version for the user's device. + /// + _Maybenull_ _Null_terminated_ const char* OS; + +} PFAccountManagementLinkIOSDeviceIDRequest; + +/// +/// PFAccountManagementLinkKongregateAccountRequest data model. +/// +typedef struct PFAccountManagementLinkKongregateAccountRequest +{ + /// + /// Valid session auth ticket issued by Kongregate. + /// + _Null_terminated_ const char* authTicket; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Numeric user ID assigned by Kongregate. + /// + _Null_terminated_ const char* kongregateId; + +} PFAccountManagementLinkKongregateAccountRequest; + +/// +/// PFAccountManagementClientLinkNintendoServiceAccountRequest data model. +/// +typedef struct PFAccountManagementClientLinkNintendoServiceAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to a specific Nintendo Switch account, unlink the + /// other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// The JSON Web token (JWT) returned by Nintendo after login. Used to validate the request and find + /// the user ID (Nintendo Switch subject) to link with. + /// + _Null_terminated_ const char* identityToken; + +} PFAccountManagementClientLinkNintendoServiceAccountRequest; + +/// +/// PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest data model. +/// +typedef struct PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the Nintendo Switch Device ID, unlink the other + /// user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Nintendo Switch unique identifier for the user's device. + /// + _Null_terminated_ const char* nintendoSwitchDeviceId; + +} PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest; + +/// +/// PFAccountManagementLinkOpenIdConnectRequest data model. +/// +typedef struct PFAccountManagementLinkOpenIdConnectRequest +{ + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum + /// 100 characters. + /// + _Null_terminated_ const char* connectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to a specific OpenId Connect user, unlink the other + /// user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// The JSON Web token (JWT) returned by the identity provider after login. Represented as the id_token + /// field in the identity provider's response. Used to validate the request and find the user ID (OpenID + /// Connect subject) to link with. + /// + _Null_terminated_ const char* idToken; + +} PFAccountManagementLinkOpenIdConnectRequest; + +/// +/// PFAccountManagementClientLinkPSNAccountRequest data model. +/// +typedef struct PFAccountManagementClientLinkPSNAccountRequest +{ + /// + /// Authentication code provided by the PlayStation :tm: Network. + /// + _Null_terminated_ const char* authCode; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// (Optional) Id of the PlayStation :tm: Network issuer environment. If null, defaults to production + /// environment. + /// + _Maybenull_ int32_t const* issuerId; + + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code. + /// + _Null_terminated_ const char* redirectUri; + +} PFAccountManagementClientLinkPSNAccountRequest; + +/// +/// PFAccountManagementLinkSteamAccountRequest data model. Steam authentication is accomplished with +/// the Steam Session Ticket. More information on the Ticket can be found in the Steamworks SDK, here: +/// https://partner.steamgames.com/documentation/auth (requires sign-in). NOTE: For Steam authentication +/// to work, the title must be configured with the Steam Application ID and Publisher Key in the PlayFab +/// Game Manager (under Properties). Information on creating a Publisher Key (referred to as the Secret +/// Key in PlayFab) for your title can be found here: https://partner.steamgames.com/documentation/webapi#publisherkey. +/// +typedef struct PFAccountManagementLinkSteamAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Authentication token for the user, returned as a byte array from Steam, and converted to a string + /// (for example, the byte 0x08 should become "08"). + /// + _Null_terminated_ const char* steamTicket; + + /// + /// (Optional) True if ticket was generated using ISteamUser::GetAuthTicketForWebAPI() using "AzurePlayFab" + /// as the identity string. False if the ticket was generated with ISteamUser::GetAuthSessionTicket(). + /// + _Maybenull_ bool const* ticketIsServiceSpecific; + +} PFAccountManagementLinkSteamAccountRequest; + +/// +/// PFAccountManagementLinkTwitchAccountRequest data model. +/// +typedef struct PFAccountManagementLinkTwitchAccountRequest +{ + /// + /// Valid token issued by Twitch. + /// + _Null_terminated_ const char* accessToken; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + +} PFAccountManagementLinkTwitchAccountRequest; + +/// +/// PFAccountManagementClientLinkXboxAccountRequest data model. +/// +typedef struct PFAccountManagementClientLinkXboxAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + +#if HC_PLATFORM == HC_PLATFORM_GDK + /// + /// XUser of the account to link to. + /// + XUserHandle user; +#else + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", + /// ""). + /// + _Null_terminated_ const char* xboxToken; +#endif + +} PFAccountManagementClientLinkXboxAccountRequest; + +/// +/// PFAccountManagementRemoveContactEmailRequest data model. This API removes an existing contact email +/// from the player's profile. +/// +typedef struct PFAccountManagementRemoveContactEmailRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementRemoveContactEmailRequest; + +/// +/// PFAccountManagementReportPlayerClientRequest data model. +/// +typedef struct PFAccountManagementReportPlayerClientRequest +{ + /// + /// (Optional) Optional additional comment by reporting player. + /// + _Maybenull_ _Null_terminated_ const char* comment; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab identifier of the reported player. + /// + _Null_terminated_ const char* reporteeId; + +} PFAccountManagementReportPlayerClientRequest; + +/// +/// PFAccountManagementReportPlayerClientResult data model. Players are currently limited to five reports +/// per day. Attempts by a single user account to submit reports beyond five will result in Updated being +/// returned as false. +/// +typedef struct PFAccountManagementReportPlayerClientResult +{ + /// + /// The number of remaining reports which may be filed today. + /// + int32_t submissionsRemaining; + +} PFAccountManagementReportPlayerClientResult; + +/// +/// PFAccountManagementSendAccountRecoveryEmailRequest data model. If the account in question is a "temporary" +/// account (for example, one that was created via a call to LoginFromIOSDeviceID), thisfunction will +/// have no effect. Only PlayFab accounts which have valid email addresses will be able to receive a password +/// reset email using this API. +/// +typedef struct PFAccountManagementSendAccountRecoveryEmailRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// User email address attached to their account. + /// + _Null_terminated_ const char* email; + + /// + /// (Optional) The email template id of the account recovery email template to send. + /// + _Maybenull_ _Null_terminated_ const char* emailTemplateId; + + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab + /// developer site when a title has been selected. + /// + _Null_terminated_ const char* titleId; + +} PFAccountManagementSendAccountRecoveryEmailRequest; + +/// +/// PFAccountManagementUnlinkAndroidDeviceIDRequest data model. +/// +typedef struct PFAccountManagementUnlinkAndroidDeviceIDRequest +{ + /// + /// (Optional) Android device identifier for the user's device. If not specified, the most recently + /// signed in Android Device ID will be used. + /// + _Maybenull_ _Null_terminated_ const char* androidDeviceId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkAndroidDeviceIDRequest; + +/// +/// PFAccountManagementUnlinkAppleRequest data model. +/// +typedef struct PFAccountManagementUnlinkAppleRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkAppleRequest; + +/// +/// PFAccountManagementUnlinkCustomIDRequest data model. +/// +typedef struct PFAccountManagementUnlinkCustomIDRequest +{ + /// + /// (Optional) Custom unique identifier for the user, generated by the title. If not specified, the + /// most recently signed in Custom ID will be used. + /// + _Maybenull_ _Null_terminated_ const char* customId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkCustomIDRequest; + +/// +/// PFAccountManagementUnlinkFacebookAccountRequest data model. +/// +typedef struct PFAccountManagementUnlinkFacebookAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkFacebookAccountRequest; + +/// +/// PFAccountManagementUnlinkFacebookInstantGamesIdRequest data model. +/// +typedef struct PFAccountManagementUnlinkFacebookInstantGamesIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Facebook Instant Games identifier for the user. If not specified, the most recently + /// signed in ID will be used. + /// + _Maybenull_ _Null_terminated_ const char* facebookInstantGamesId; + +} PFAccountManagementUnlinkFacebookInstantGamesIdRequest; + +/// +/// PFAccountManagementUnlinkGameCenterAccountRequest data model. +/// +typedef struct PFAccountManagementUnlinkGameCenterAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkGameCenterAccountRequest; + +/// +/// PFAccountManagementUnlinkGoogleAccountRequest data model. +/// +typedef struct PFAccountManagementUnlinkGoogleAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkGoogleAccountRequest; + +/// +/// PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest data model. +/// +typedef struct PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest; + +/// +/// PFAccountManagementUnlinkIOSDeviceIDRequest data model. +/// +typedef struct PFAccountManagementUnlinkIOSDeviceIDRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Vendor-specific iOS identifier for the user's device. If not specified, the most recently + /// signed in iOS Device ID will be used. + /// + _Maybenull_ _Null_terminated_ const char* deviceId; + +} PFAccountManagementUnlinkIOSDeviceIDRequest; + +/// +/// PFAccountManagementUnlinkKongregateAccountRequest data model. +/// +typedef struct PFAccountManagementUnlinkKongregateAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkKongregateAccountRequest; + +/// +/// PFAccountManagementClientUnlinkNintendoServiceAccountRequest data model. +/// +typedef struct PFAccountManagementClientUnlinkNintendoServiceAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementClientUnlinkNintendoServiceAccountRequest; + +/// +/// PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest data model. +/// +typedef struct PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Nintendo Switch Device identifier for the user. If not specified, the most recently + /// signed in device ID will be used. + /// + _Maybenull_ _Null_terminated_ const char* nintendoSwitchDeviceId; + +} PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest; + +/// +/// PFAccountManagementUnlinkOpenIdConnectRequest data model. +/// +typedef struct PFAccountManagementUnlinkOpenIdConnectRequest +{ + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum + /// 100 characters. + /// + _Null_terminated_ const char* connectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkOpenIdConnectRequest; + +/// +/// PFAccountManagementClientUnlinkPSNAccountRequest data model. +/// +typedef struct PFAccountManagementClientUnlinkPSNAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementClientUnlinkPSNAccountRequest; + +/// +/// PFAccountManagementUnlinkSteamAccountRequest data model. +/// +typedef struct PFAccountManagementUnlinkSteamAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkSteamAccountRequest; + +/// +/// PFAccountManagementUnlinkTwitchAccountRequest data model. +/// +typedef struct PFAccountManagementUnlinkTwitchAccountRequest +{ + /// + /// (Optional) Valid token issued by Twitch. Used to specify which twitch account to unlink from + /// the profile. By default it uses the one that is present on the profile. + /// + _Maybenull_ _Null_terminated_ const char* accessToken; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementUnlinkTwitchAccountRequest; + +/// +/// PFAccountManagementClientUnlinkXboxAccountRequest data model. +/// +typedef struct PFAccountManagementClientUnlinkXboxAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementClientUnlinkXboxAccountRequest; + +/// +/// PFAccountManagementClientUpdateAvatarUrlRequest data model. +/// +typedef struct PFAccountManagementClientUpdateAvatarUrlRequest +{ + /// + /// URL of the avatar image. If empty, it removes the existing avatar URL. + /// + _Null_terminated_ const char* imageUrl; + +} PFAccountManagementClientUpdateAvatarUrlRequest; + +/// +/// PFAccountManagementUpdateUserTitleDisplayNameRequest data model. In addition to the PlayFab username, +/// titles can make use of a DisplayName which is also a unique identifier, but specific to the title. +/// This allows for unique names which more closely match the theme or genre of a title, for example. +/// +typedef struct PFAccountManagementUpdateUserTitleDisplayNameRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// New title display name for the user - must be between 3 and 25 characters. + /// + _Null_terminated_ const char* displayName; + +} PFAccountManagementUpdateUserTitleDisplayNameRequest; + +/// +/// PFAccountManagementUpdateUserTitleDisplayNameResult data model. +/// +typedef struct PFAccountManagementUpdateUserTitleDisplayNameResult +{ + /// + /// (Optional) Current title display name for the user (this will be the original display name if + /// the rename attempt failed). + /// + _Maybenull_ _Null_terminated_ const char* displayName; + +} PFAccountManagementUpdateUserTitleDisplayNameResult; + +/// +/// PFAccountManagementBanRequest data model. Represents a single ban request. +/// +typedef struct PFAccountManagementBanRequest +{ + /// + /// (Optional) The duration in hours for the ban. Leave this blank for a permanent ban. + /// + _Maybenull_ uint32_t const* durationInHours; + + /// + /// (Optional) IP address to be banned. May affect multiple players. + /// + _Maybenull_ _Null_terminated_ const char* IPAddress; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// (Optional) The reason for this ban. Maximum 140 characters. + /// + _Maybenull_ _Null_terminated_ const char* reason; + +} PFAccountManagementBanRequest; + +/// +/// PFAccountManagementBanUsersRequest data model. The existence of each user will not be verified. When +/// banning by IP or MAC address, multiple players may be affected, so use this feature with caution. +/// Returns information about the new bans. +/// +typedef struct PFAccountManagementBanUsersRequest +{ + /// + /// List of ban requests to be applied. Maximum 100. + /// + _Field_size_(bansCount) PFAccountManagementBanRequest const* const* bans; + + /// + /// Count of bans + /// + uint32_t bansCount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFAccountManagementBanUsersRequest; + +/// +/// PFAccountManagementBanInfo data model. Contains information for a ban. +/// +typedef struct PFAccountManagementBanInfo +{ + /// + /// The active state of this ban. Expired bans may still have this value set to true but they will + /// have no effect. + /// + bool active; + + /// + /// (Optional) The unique Ban Id associated with this ban. + /// + _Maybenull_ _Null_terminated_ const char* banId; + + /// + /// (Optional) The time when this ban was applied. + /// + _Maybenull_ time_t const* created; + + /// + /// (Optional) The time when this ban expires. Permanent bans do not have expiration date. + /// + _Maybenull_ time_t const* expires; + + /// + /// (Optional) The IP address on which the ban was applied. May affect multiple players. + /// + _Maybenull_ _Null_terminated_ const char* IPAddress; + + /// + /// (Optional) Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) The reason why this ban was applied. + /// + _Maybenull_ _Null_terminated_ const char* reason; + +} PFAccountManagementBanInfo; + +/// +/// PFAccountManagementBanUsersResult data model. +/// +typedef struct PFAccountManagementBanUsersResult +{ + /// + /// (Optional) Information on the bans that were applied. + /// + _Maybenull_ _Field_size_(banDataCount) PFAccountManagementBanInfo const* const* banData; + + /// + /// Count of banData + /// + uint32_t banDataCount; + +} PFAccountManagementBanUsersResult; + +/// +/// PFAccountManagementDeletePlayerRequest data model. Deletes all data associated with the player, including +/// statistics, custom data, inventory, purchases, virtual currency balances, characters and shared group +/// memberships. Removes the player from all leaderboards and player search indexes. Does not delete PlayStream +/// event history associated with the player. Does not delete the publisher user account that created +/// the player in the title nor associated data such as username, password, email address, account linkages, +/// or friends list. Note, this API queues the player for deletion and returns immediately. It may take +/// several minutes or more before all player data is fully deleted. Until the player data is fully deleted, +/// attempts to recreate the player with the same user account in the same title will fail with the 'AccountDeleted' +/// error. This API must be enabled for use as an option in the game manager website. It is disabled by +/// default. +/// +typedef struct PFAccountManagementDeletePlayerRequest +{ + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementDeletePlayerRequest; + +/// +/// PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest data model. +/// +typedef struct PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest +{ + /// + /// Array of unique PlayFab player identifiers for which the title needs to get server custom identifiers. + /// Cannot contain more than 25 identifiers. + /// + _Field_size_(playFabIDsCount) const char* const* playFabIDs; + + /// + /// Count of playFabIDs + /// + uint32_t playFabIDsCount; + +} PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest; + +/// +/// PFAccountManagementServerCustomIDPlayFabIDPair data model. +/// +typedef struct PFAccountManagementServerCustomIDPlayFabIDPair +{ + /// + /// (Optional) Unique PlayFab identifier. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + + /// + /// (Optional) Unique server custom identifier for this player. + /// + _Maybenull_ _Null_terminated_ const char* serverCustomId; + +} PFAccountManagementServerCustomIDPlayFabIDPair; + +/// +/// PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult data model. For a PlayFab account that +/// isn't associated with a server custom identity, ServerCustomId will be null. +/// +typedef struct PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult +{ + /// + /// (Optional) Mapping of server custom player identifiers to PlayFab identifiers. + /// + _Maybenull_ _Field_size_(dataCount) PFAccountManagementServerCustomIDPlayFabIDPair const* const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult; + +/// +/// PFAccountManagementGetUserAccountInfoRequest data model. This API allows for access to details regarding +/// a user in the PlayFab service, usually for purposes of customer support. Note that data returned may +/// be Personally Identifying Information (PII), such as email address, and so care should be taken in +/// how this data is stored and managed. Since this call will always return the relevant information for +/// users who have accessed the title, the recommendation is to not store this data locally. +/// +typedef struct PFAccountManagementGetUserAccountInfoRequest +{ + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementGetUserAccountInfoRequest; + +/// +/// PFAccountManagementGetUserAccountInfoResult data model. +/// +typedef struct PFAccountManagementGetUserAccountInfoResult +{ + /// + /// (Optional) Account details for the user whose information was requested. + /// + _Maybenull_ PFUserAccountInfo const* userInfo; + +} PFAccountManagementGetUserAccountInfoResult; + +/// +/// PFAccountManagementGetUserBansRequest data model. Get all bans for a user, including inactive and +/// expired bans. . +/// +typedef struct PFAccountManagementGetUserBansRequest +{ + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementGetUserBansRequest; + +/// +/// PFAccountManagementGetUserBansResult data model. +/// +typedef struct PFAccountManagementGetUserBansResult +{ + /// + /// (Optional) Information about the bans. + /// + _Maybenull_ _Field_size_(banDataCount) PFAccountManagementBanInfo const* const* banData; + + /// + /// Count of banData + /// + uint32_t banDataCount; + +} PFAccountManagementGetUserBansResult; + +/// +/// PFAccountManagementServerLinkNintendoServiceAccountRequest data model. +/// +typedef struct PFAccountManagementServerLinkNintendoServiceAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to a specific Nintendo Switch account, unlink the + /// other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// The JSON Web token (JWT) returned by Nintendo after login. Used to validate the request and find + /// the user ID (Nintendo Switch subject) to link with. + /// + _Null_terminated_ const char* identityToken; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementServerLinkNintendoServiceAccountRequest; + +/// +/// PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest data model. +/// +typedef struct PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the Nintendo Switch Device ID, unlink the other + /// user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Nintendo Switch unique identifier for the user's device. + /// + _Null_terminated_ const char* nintendoSwitchDeviceId; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest; + +/// +/// PFAccountManagementServerLinkPSNAccountRequest data model. +/// +typedef struct PFAccountManagementServerLinkPSNAccountRequest +{ + /// + /// Authentication code provided by the PlayStation :tm: Network. + /// + _Null_terminated_ const char* authCode; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// (Optional) Id of the PlayStation :tm: Network issuer environment. If null, defaults to production + /// environment. + /// + _Maybenull_ int32_t const* issuerId; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code. + /// + _Null_terminated_ const char* redirectUri; + +} PFAccountManagementServerLinkPSNAccountRequest; + +/// +/// PFAccountManagementLinkPSNIdRequest data model. +/// +typedef struct PFAccountManagementLinkPSNIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// (Optional) Id of the PlayStation :tm: Network issuer environment. If null, defaults to production + /// environment. + /// + _Maybenull_ int32_t const* issuerId; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Id of the PlayStation :tm: Network user. + /// + _Null_terminated_ const char* PSNUserId; + +} PFAccountManagementLinkPSNIdRequest; + +/// +/// PFAccountManagementLinkServerCustomIdRequest data model. +/// +typedef struct PFAccountManagementLinkServerCustomIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the custom ID, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Unique PlayFab identifier. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Unique server custom identifier for this player. + /// + _Null_terminated_ const char* serverCustomId; + +} PFAccountManagementLinkServerCustomIdRequest; + +/// +/// PFAccountManagementLinkSteamIdRequest data model. +/// +typedef struct PFAccountManagementLinkSteamIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live + /// identifier. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Unique Steam identifier for a user. + /// + _Null_terminated_ const char* steamId; + +} PFAccountManagementLinkSteamIdRequest; + +/// +/// PFAccountManagementServerLinkXboxAccountRequest data model. +/// +typedef struct PFAccountManagementServerLinkXboxAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If another user is already linked to the account, unlink the other user and re-link. + /// + _Maybenull_ bool const* forceLink; + + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live + /// identifier. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", + /// ""). + /// + _Null_terminated_ const char* xboxToken; + +} PFAccountManagementServerLinkXboxAccountRequest; + +/// +/// PFAccountManagementRevokeAllBansForUserRequest data model. Setting the active state of all non-expired +/// bans for a user to Inactive. Expired bans with an Active state will be ignored, however. Returns information +/// about applied updates only. +/// +typedef struct PFAccountManagementRevokeAllBansForUserRequest +{ + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementRevokeAllBansForUserRequest; + +/// +/// PFAccountManagementRevokeAllBansForUserResult data model. +/// +typedef struct PFAccountManagementRevokeAllBansForUserResult +{ + /// + /// (Optional) Information on the bans that were revoked. + /// + _Maybenull_ _Field_size_(banDataCount) PFAccountManagementBanInfo const* const* banData; + + /// + /// Count of banData + /// + uint32_t banDataCount; + +} PFAccountManagementRevokeAllBansForUserResult; + +/// +/// PFAccountManagementRevokeBansRequest data model. Setting the active state of all bans requested to +/// Inactive regardless of whether that ban has already expired. BanIds that do not exist will be skipped. +/// Returns information about applied updates only. . +/// +typedef struct PFAccountManagementRevokeBansRequest +{ + /// + /// Ids of the bans to be revoked. Maximum 100. + /// + _Field_size_(banIdsCount) const char* const* banIds; + + /// + /// Count of banIds + /// + uint32_t banIdsCount; + +} PFAccountManagementRevokeBansRequest; + +/// +/// PFAccountManagementRevokeBansResult data model. +/// +typedef struct PFAccountManagementRevokeBansResult +{ + /// + /// (Optional) Information on the bans that were revoked. + /// + _Maybenull_ _Field_size_(banDataCount) PFAccountManagementBanInfo const* const* banData; + + /// + /// Count of banData + /// + uint32_t banDataCount; + +} PFAccountManagementRevokeBansResult; + +/// +/// PFAccountManagementSendCustomAccountRecoveryEmailRequest data model. PlayFab accounts which have +/// valid email address or username will be able to receive a password reset email using this API.The +/// email sent must be an account recovery email template. The username or email can be passed in to send +/// the email. +/// +typedef struct PFAccountManagementSendCustomAccountRecoveryEmailRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) User email address attached to their account. + /// + _Maybenull_ _Null_terminated_ const char* email; + + /// + /// The email template id of the account recovery email template to send. + /// + _Null_terminated_ const char* emailTemplateId; + + /// + /// (Optional) The user's username requesting an account recovery. + /// + _Maybenull_ _Null_terminated_ const char* username; + +} PFAccountManagementSendCustomAccountRecoveryEmailRequest; + +/// +/// PFAccountManagementSendEmailFromTemplateRequest data model. Sends an email for only players that +/// have contact emails associated with them. Takes in an email template ID specifyingthe email template +/// to send. +/// +typedef struct PFAccountManagementSendEmailFromTemplateRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The email template id of the email template to send. + /// + _Null_terminated_ const char* emailTemplateId; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementSendEmailFromTemplateRequest; + +/// +/// PFAccountManagementServerUnlinkNintendoServiceAccountRequest data model. +/// +typedef struct PFAccountManagementServerUnlinkNintendoServiceAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementServerUnlinkNintendoServiceAccountRequest; + +/// +/// PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest data model. +/// +typedef struct PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Nintendo Switch Device identifier for the user. If not specified, the most recently + /// signed in device ID will be used. + /// + _Maybenull_ _Null_terminated_ const char* nintendoSwitchDeviceId; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest; + +/// +/// PFAccountManagementServerUnlinkPSNAccountRequest data model. +/// +typedef struct PFAccountManagementServerUnlinkPSNAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementServerUnlinkPSNAccountRequest; + +/// +/// PFAccountManagementUnlinkServerCustomIdRequest data model. +/// +typedef struct PFAccountManagementUnlinkServerCustomIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab identifier. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Unique server custom identifier for this player. + /// + _Null_terminated_ const char* serverCustomId; + +} PFAccountManagementUnlinkServerCustomIdRequest; + +/// +/// PFAccountManagementUnlinkSteamIdRequest data model. +/// +typedef struct PFAccountManagementUnlinkSteamIdRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Steam account. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementUnlinkSteamIdRequest; + +/// +/// PFAccountManagementServerUnlinkXboxAccountRequest data model. +/// +typedef struct PFAccountManagementServerUnlinkXboxAccountRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live + /// identifier. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementServerUnlinkXboxAccountRequest; + +/// +/// PFAccountManagementServerUpdateAvatarUrlRequest data model. +/// +typedef struct PFAccountManagementServerUpdateAvatarUrlRequest +{ + /// + /// URL of the avatar image. If empty, it removes the existing avatar URL. + /// + _Null_terminated_ const char* imageUrl; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFAccountManagementServerUpdateAvatarUrlRequest; + +/// +/// PFAccountManagementUpdateBanRequest data model. Represents a single update ban request. +/// +typedef struct PFAccountManagementUpdateBanRequest +{ + /// + /// (Optional) The updated active state for the ban. Null for no change. + /// + _Maybenull_ bool const* active; + + /// + /// The id of the ban to be updated. + /// + _Null_terminated_ const char* banId; + + /// + /// (Optional) The updated expiration date for the ban. Null for no change. + /// + _Maybenull_ time_t const* expires; + + /// + /// (Optional) The updated IP address for the ban. Null for no change. + /// + _Maybenull_ _Null_terminated_ const char* IPAddress; + + /// + /// (Optional) Whether to make this ban permanent. Set to true to make this ban permanent. This will + /// not modify Active state. + /// + _Maybenull_ bool const* permanent; + + /// + /// (Optional) The updated reason for the ban to be updated. Maximum 140 characters. Null for no + /// change. + /// + _Maybenull_ _Null_terminated_ const char* reason; + +} PFAccountManagementUpdateBanRequest; + +/// +/// PFAccountManagementUpdateBansRequest data model. For each ban, only updates the values that are set. +/// Leave any value to null for no change. If a ban could not be found, the rest are still applied. Returns +/// information about applied updates only. +/// +typedef struct PFAccountManagementUpdateBansRequest +{ + /// + /// List of bans to be updated. Maximum 100. + /// + _Field_size_(bansCount) PFAccountManagementUpdateBanRequest const* const* bans; + + /// + /// Count of bans + /// + uint32_t bansCount; + +} PFAccountManagementUpdateBansRequest; + +/// +/// PFAccountManagementUpdateBansResult data model. +/// +typedef struct PFAccountManagementUpdateBansResult +{ + /// + /// (Optional) Information on the bans that were updated. + /// + _Maybenull_ _Field_size_(banDataCount) PFAccountManagementBanInfo const* const* banData; + + /// + /// Count of banData + /// + uint32_t banDataCount; + +} PFAccountManagementUpdateBansResult; + +/// +/// PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest data model. Given a collection of Xbox IDs +/// (XUIDs), returns all title player accounts. +/// +typedef struct PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Xbox Sandbox the players had on their Xbox tokens. + /// + _Null_terminated_ const char* sandbox; + + /// + /// (Optional) Optional ID of title to get players from, required if calling using a master_player_account. + /// + _Maybenull_ _Null_terminated_ const char* titleId; + + /// + /// List of Xbox Live XUIDs. + /// + _Field_size_(xboxLiveIdsCount) const char* const* xboxLiveIds; + + /// + /// Count of xboxLiveIds + /// + uint32_t xboxLiveIdsCount; + +} PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest; + +/// +/// PFAccountManagementGetTitlePlayersFromProviderIDsResponse data model. +/// +typedef struct PFAccountManagementGetTitlePlayersFromProviderIDsResponse +{ + /// + /// (Optional) Dictionary of provider identifiers mapped to title_player_account lineage. Missing + /// lineage indicates the player either doesn't exist or doesn't play the requested title. + /// + _Maybenull_ _Field_size_(titlePlayerAccountsCount) struct PFEntityLineageDictionaryEntry const* titlePlayerAccounts; + + /// + /// Count of titlePlayerAccounts + /// + uint32_t titlePlayerAccountsCount; + +} PFAccountManagementGetTitlePlayersFromProviderIDsResponse; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFCatalog.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFCatalog.h new file mode 100644 index 0000000..6581549 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFCatalog.h @@ -0,0 +1,1173 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Creates a new item in the working catalog using provided metadata. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// The item will not be published to the public catalog until the PublishItem API is called for the +/// item. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogCreateDraftItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogCreateDraftItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a CreateDraftItem call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND, E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogCreateDraftItemGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogCreateDraftItemAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND, E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogCreateDraftItemGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogCreateDraftItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Creates one or more upload URLs which can be used by the client to upload raw file data. Content +/// URls and uploaded content will be garbage collected after 24 hours if not attached to a draft or published +/// item. Detailed pricing info around uploading content can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/pricing/meters/catalog-meters +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Upload URLs point to Azure Blobs; clients must follow the Microsoft Azure Storage Blob Service REST +/// API pattern for uploading content. The response contains upload URLs and IDs for each file. The IDs +/// and URLs returned must be added to the item metadata and committed using the CreateDraftItem or UpdateDraftItem +/// Item APIs. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogCreateUploadUrlsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogCreateUploadUrlsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a CreateUploadUrls call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogCreateUploadUrlsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogCreateUploadUrlsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogCreateUploadUrlsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogCreateUploadUrlsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if 0 +/// +/// Deletes all reviews, helpfulness votes, and ratings submitted by the entity specified. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_PROFILE_DOES_NOT_EXIST or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogDeleteEntityItemReviewsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogDeleteEntityItemReviewsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Removes an item from working catalog and all published versions from the public catalog. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, E_PF_ITEM_NOT_FOUND or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogDeleteItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogDeleteItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if 0 +/// +/// Gets the configuration for the catalog. Only Title Entities can call this API. There is a limit of +/// 100 requests in 10 seconds for this API. More information about the Catalog Config can be found here: +/// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogGetCatalogConfigAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetCatalogConfigRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetCatalogConfig call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_BILLING_INFORMATION_REQUIRED, +/// E_PF_INVALID_ENTITY_TYPE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCatalogGetCatalogConfigGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetCatalogConfigAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_BILLING_INFORMATION_REQUIRED, +/// E_PF_INVALID_ENTITY_TYPE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetCatalogConfigGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetCatalogConfigResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +/// +/// Retrieves an item from the working catalog. This item represents the current working state of the +/// item. GetDraftItem does not work off a cache of the Catalog and should be used when trying to get +/// recent item updates. However, please note that item references data is cached and may take a few moments +/// for changes to propagate. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFCatalogGetDraftItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetDraftItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetDraftItem call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND, E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogGetDraftItemGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetDraftItemAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND, E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetDraftItemGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetDraftItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves a paginated list of the items from the draft catalog. Up to 50 IDs can be retrieved in +/// a single request. GetDraftItems does not work off a cache of the Catalog and should be used when trying +/// to get recent item updates. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFCatalogGetDraftItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetDraftItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetDraftItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetDraftItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetDraftItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetDraftItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetDraftItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves a paginated list of the items from the draft catalog created by the Entity. Up to 50 items +/// can be returned at once. You can use continuation tokens to paginate through results that return greater +/// than the limit. GetEntityDraftItems does not work off a cache of the Catalog and should be used when +/// trying to get recent item updates. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogGetEntityDraftItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetEntityDraftItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetEntityDraftItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetEntityDraftItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetEntityDraftItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetEntityDraftItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetEntityDraftItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Gets the submitted review for the specified item by the authenticated entity. Individual ratings +/// and reviews data update in near real time with delays within a few seconds. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogGetEntityItemReviewAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetEntityItemReviewRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetEntityItemReview call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetEntityItemReviewGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetEntityItemReviewAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetEntityItemReviewGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetEntityItemReviewResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves an item from the public catalog. GetItem does not work off a cache of the Catalog and should +/// be used when trying to get recent item updates. However, please note that item references data is +/// cached and may take a few moments for changes to propagate. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFCatalogGetItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetItem call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetItemGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetItemAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetItemGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Search for a given item and return a set of bundles and stores containing the item. Up to 50 items +/// can be returned at once. You can use continuation tokens to paginate through results that return greater +/// than the limit. This API is intended for tooling/automation scenarios and has a reduced RPS with Player +/// Entities limited to 30 requests in 300 seconds and Title Entities limited to 100 requests in 10 seconds. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an item, return a set of bundles and stores containing the item. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogGetItemContainersAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetItemContainersRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetItemContainers call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ITEM_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFCatalogGetItemContainersGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetItemContainersAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ITEM_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetItemContainersGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemContainersResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if 0 +/// +/// Gets the moderation state for an item, including the concern category and string reason. More information +/// about moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogGetItemModerationStateAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetItemModerationStateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetItemModerationState call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetItemModerationStateGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetItemModerationStateAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetItemModerationStateGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemModerationStateResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +/// +/// Gets the status of a publish of an item. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogGetItemPublishStatusAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetItemPublishStatusRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetItemPublishStatus call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetItemPublishStatusGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetItemPublishStatusAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetItemPublishStatusGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemPublishStatusResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Get a paginated set of reviews associated with the specified item. Individual ratings and reviews +/// data update in near real time with delays within a few seconds. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFCatalogGetItemReviewsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetItemReviewsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetItemReviews call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetItemReviewsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetItemReviewsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetItemReviewsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemReviewsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Get a summary of all ratings and reviews associated with the specified item. Summary ratings data +/// is cached with update data coming within 15 minutes. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogGetItemReviewSummaryAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetItemReviewSummaryRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetItemReviewSummary call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetItemReviewSummaryGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetItemReviewSummaryAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetItemReviewSummaryGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemReviewSummaryResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves items from the public catalog. Up to 50 items can be returned at once. GetItems does not +/// work off a cache of the Catalog and should be used when trying to get recent item updates. However, +/// please note that item references data is cached and may take a few moments for changes to propagate. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFCatalogGetItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogGetItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ITEM_NOT_FOUND, +/// E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogGetItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogGetItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ITEM_NOT_FOUND, +/// E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogGetItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Initiates a publish of an item from the working catalog to the public catalog. You can use the GetItemPublishStatus +/// API to track the state of the item publish. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// The call kicks off a workflow to publish the item to the public catalog. The Publish Status API should +/// be used to monitor the publish job. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, E_PF_ITEM_NOT_FOUND or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogPublishDraftItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogPublishDraftItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Submit a report for an item, indicating in what way the item is inappropriate. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, E_PF_ITEM_NOT_FOUND or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogReportItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogReportItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Submit a report for a review +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Submit a report for an inappropriate review, allowing the submitting user to specify their concern. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogReportItemReviewAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogReportItemReviewRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Creates or updates a review for the specified item. More information around the caching surrounding +/// item ratings and reviews can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/ratings#ratings-design-and-caching +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, E_PF_ITEM_NOT_FOUND or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogReviewItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogReviewItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Executes a search against the public catalog using the provided search parameters and returns a set +/// of paginated results. SearchItems uses a cache of the catalog with item updates taking up to a few +/// minutes to propagate. You should use the GetItem API for when trying to immediately get recent item +/// updates. More information about the Search API can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFCatalogSearchItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogSearchItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a SearchItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND, E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogSearchItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogSearchItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND, E_PF_NOT_IMPLEMENTED or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogSearchItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogSearchItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if 0 +/// +/// Sets the moderation state for an item, including the concern category and string reason. More information +/// about moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, E_PF_ITEM_NOT_FOUND or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogSetItemModerationStateAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogSetItemModerationStateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Submit a vote for a review, indicating whether the review was helpful or unhelpful. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogSubmitItemReviewVoteAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogSubmitItemReviewVoteRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if 0 +/// +/// Submit a request to takedown one or more reviews. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Submit a request to takedown one or more reviews, removing them from public view. Authors will still +/// be able to see their reviews after being taken down. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, E_PF_ITEM_NOT_FOUND or any of the global +/// PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCatalogTakedownItemReviewsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogTakedownItemReviewsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Updates the configuration for the catalog. Only Title Entities can call this API. There is a limit +/// of 10 requests in 10 seconds for this API. More information about the Catalog Config can be found +/// here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_BILLING_INFORMATION_REQUIRED, E_PF_CATALOG_CONFIG_INVALID, E_PF_INVALID_ENTITY_TYPE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFCatalogUpdateCatalogConfigAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogUpdateCatalogConfigRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +/// +/// Update the metadata for an item in the working catalog. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCatalogUpdateDraftItemAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCatalogUpdateDraftItemRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a UpdateDraftItem call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCatalogUpdateDraftItemGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCatalogUpdateDraftItemAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCatalogUpdateDraftItemGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogUpdateDraftItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFCatalogTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFCatalogTypes.h new file mode 100644 index 0000000..96e9c86 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFCatalogTypes.h @@ -0,0 +1,2252 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// ModerationStatus enum. +/// +enum class PFCatalogModerationStatus : uint32_t +{ + Unknown, + AwaitingModeration, + Approved, + Rejected +}; + +/// +/// DisplayPropertyType enum. +/// +enum class PFCatalogDisplayPropertyType : uint32_t +{ + None, + QueryDateTime, + QueryDouble, + QueryString, + SearchString +}; + +/// +/// PublishResult enum. +/// +enum class PFCatalogPublishResult : uint32_t +{ + Unknown, + Pending, + Succeeded, + Failed, + Canceled +}; + +/// +/// ConcernCategory enum. +/// +enum class PFCatalogConcernCategory : uint32_t +{ + None, + OffensiveContent, + ChildExploitation, + MalwareOrVirus, + PrivacyConcerns, + MisleadingApp, + PoorPerformance, + ReviewResponse, + SpamAdvertising, + Profanity +}; + +/// +/// HelpfulnessVote enum. +/// +enum class PFCatalogHelpfulnessVote : uint32_t +{ + None, + UnHelpful, + Helpful +}; + +/// +/// PFCatalogCatalogAlternateId data model. +/// +typedef struct PFCatalogCatalogAlternateId +{ + /// + /// (Optional) Type of the alternate ID. + /// + _Maybenull_ _Null_terminated_ const char* type; + + /// + /// (Optional) Value of the alternate ID. + /// + _Maybenull_ _Null_terminated_ const char* value; + +} PFCatalogCatalogAlternateId; + +/// +/// PFCatalogContent data model. +/// +typedef struct PFCatalogContent +{ + /// + /// (Optional) The content unique ID. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The maximum client version that this content is compatible with. Client Versions can + /// be up to 3 segments separated by periods(.) and each segment can have a maximum value of 65535. + /// + _Maybenull_ _Null_terminated_ const char* maxClientVersion; + + /// + /// (Optional) The minimum client version that this content is compatible with. Client Versions can + /// be up to 3 segments separated by periods(.) and each segment can have a maximum value of 65535. + /// + _Maybenull_ _Null_terminated_ const char* minClientVersion; + + /// + /// (Optional) The list of tags that are associated with this content. Tags must be defined in the + /// Catalog Config before being used in content. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + + /// + /// (Optional) The client-defined type of the content. Content Types must be defined in the Catalog + /// Config before being used. + /// + _Maybenull_ _Null_terminated_ const char* type; + + /// + /// (Optional) The Azure CDN URL for retrieval of the catalog item binary content. + /// + _Maybenull_ _Null_terminated_ const char* url; + +} PFCatalogContent; + +/// +/// PFCatalogDeepLink data model. +/// +typedef struct PFCatalogDeepLink +{ + /// + /// (Optional) Target platform for this deep link. + /// + _Maybenull_ _Null_terminated_ const char* platform; + + /// + /// (Optional) The deep link for this platform. + /// + _Maybenull_ _Null_terminated_ const char* url; + +} PFCatalogDeepLink; + +/// +/// PFCatalogImage data model. +/// +typedef struct PFCatalogImage +{ + /// + /// (Optional) The image unique ID. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The client-defined tag associated with this image. Tags must be defined in the Catalog + /// Config before being used in images. + /// + _Maybenull_ _Null_terminated_ const char* tag; + + /// + /// (Optional) Images can be defined as either a "thumbnail" or "screenshot". There can only be one + /// "thumbnail" image per item. + /// + _Maybenull_ _Null_terminated_ const char* type; + + /// + /// (Optional) The URL for retrieval of the image. + /// + _Maybenull_ _Null_terminated_ const char* url; + +} PFCatalogImage; + +/// +/// PFCatalogCatalogPriceAmount data model. +/// +typedef struct PFCatalogCatalogPriceAmount +{ + /// + /// The amount of the price. + /// + int32_t amount; + + /// + /// (Optional) The Item Id of the price. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + +} PFCatalogCatalogPriceAmount; + +/// +/// PFCatalogCatalogPrice data model. +/// +typedef struct PFCatalogCatalogPrice +{ + /// + /// (Optional) The amounts of the catalog item price. Each price can have up to 15 item amounts. + /// + _Maybenull_ _Field_size_(amountsCount) PFCatalogCatalogPriceAmount const* const* amounts; + + /// + /// Count of amounts + /// + uint32_t amountsCount; + + /// + /// (Optional) The per-unit amount this price can be used to purchase. + /// + _Maybenull_ int32_t const* unitAmount; + + /// + /// (Optional) The per-unit duration this price can be used to purchase. The maximum duration is + /// 100 years. + /// + _Maybenull_ double const* unitDurationInSeconds; + +} PFCatalogCatalogPrice; + +/// +/// PFCatalogCatalogPriceOptions data model. +/// +typedef struct PFCatalogCatalogPriceOptions +{ + /// + /// (Optional) Prices of the catalog item. An item can have up to 15 prices. + /// + _Maybenull_ _Field_size_(pricesCount) PFCatalogCatalogPrice const* const* prices; + + /// + /// Count of prices + /// + uint32_t pricesCount; + +} PFCatalogCatalogPriceOptions; + +/// +/// PFCatalogCatalogItemReference data model. +/// +typedef struct PFCatalogCatalogItemReference +{ + /// + /// (Optional) The amount of the catalog item. + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) The unique ID of the catalog item. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The prices the catalog item can be purchased for. + /// + _Maybenull_ PFCatalogCatalogPriceOptions const* priceOptions; + +} PFCatalogCatalogItemReference; + +/// +/// PFCatalogKeywordSet data model. +/// +typedef struct PFCatalogKeywordSet +{ + /// + /// (Optional) A list of localized keywords. + /// + _Maybenull_ _Field_size_(valuesCount) const char* const* values; + + /// + /// Count of values + /// + uint32_t valuesCount; + +} PFCatalogKeywordSet; + +/// +/// PFCatalogModerationState data model. +/// +typedef struct PFCatalogModerationState +{ + /// + /// (Optional) The date and time this moderation state was last updated. + /// + _Maybenull_ time_t const* lastModifiedDate; + + /// + /// (Optional) The current stated reason for the associated item being moderated. + /// + _Maybenull_ _Null_terminated_ const char* reason; + + /// + /// (Optional) The current moderation status for the associated item. + /// + _Maybenull_ PFCatalogModerationStatus const* status; + +} PFCatalogModerationState; + +/// +/// PFCatalogRating data model. +/// +typedef struct PFCatalogRating +{ + /// + /// (Optional) The average rating for this item. + /// + _Maybenull_ float const* average; + + /// + /// (Optional) The total count of 1 star ratings for this item. + /// + _Maybenull_ int32_t const* count1Star; + + /// + /// (Optional) The total count of 2 star ratings for this item. + /// + _Maybenull_ int32_t const* count2Star; + + /// + /// (Optional) The total count of 3 star ratings for this item. + /// + _Maybenull_ int32_t const* count3Star; + + /// + /// (Optional) The total count of 4 star ratings for this item. + /// + _Maybenull_ int32_t const* count4Star; + + /// + /// (Optional) The total count of 5 star ratings for this item. + /// + _Maybenull_ int32_t const* count5Star; + + /// + /// (Optional) The total count of ratings for this item. + /// + _Maybenull_ int32_t const* totalCount; + +} PFCatalogRating; + +/// +/// PFCatalogFilterOptions data model. +/// +typedef struct PFCatalogFilterOptions +{ + /// + /// (Optional) The OData filter utilized. Mutually exclusive with 'IncludeAllItems'. More info about + /// Filter Complexity limits can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search#limits. + /// + _Maybenull_ _Null_terminated_ const char* filter; + + /// + /// (Optional) The flag that overrides the filter and allows for returning all catalog items. Mutually + /// exclusive with 'Filter'. + /// + _Maybenull_ bool const* includeAllItems; + +} PFCatalogFilterOptions; + +/// +/// PFCatalogCatalogPriceAmountOverride data model. +/// +typedef struct PFCatalogCatalogPriceAmountOverride +{ + /// + /// (Optional) The exact value that should be utilized in the override. + /// + _Maybenull_ int32_t const* fixedValue; + + /// + /// (Optional) The id of the item this override should utilize. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) The multiplier that will be applied to the base Catalog value to determine what value + /// should be utilized in the override. + /// + _Maybenull_ double const* multiplier; + +} PFCatalogCatalogPriceAmountOverride; + +/// +/// PFCatalogCatalogPriceOverride data model. +/// +typedef struct PFCatalogCatalogPriceOverride +{ + /// + /// (Optional) The currency amounts utilized in the override for a singular price. + /// + _Maybenull_ _Field_size_(amountsCount) PFCatalogCatalogPriceAmountOverride const* const* amounts; + + /// + /// Count of amounts + /// + uint32_t amountsCount; + +} PFCatalogCatalogPriceOverride; + +/// +/// PFCatalogCatalogPriceOptionsOverride data model. +/// +typedef struct PFCatalogCatalogPriceOptionsOverride +{ + /// + /// (Optional) The prices utilized in the override. + /// + _Maybenull_ _Field_size_(pricesCount) PFCatalogCatalogPriceOverride const* const* prices; + + /// + /// Count of prices + /// + uint32_t pricesCount; + +} PFCatalogCatalogPriceOptionsOverride; + +/// +/// PFCatalogStoreDetails data model. +/// +typedef struct PFCatalogStoreDetails +{ + /// + /// (Optional) The options for the filter in filter-based stores. These options are mutually exclusive + /// with item references. + /// + _Maybenull_ PFCatalogFilterOptions const* filterOptions; + + /// + /// (Optional) The global prices utilized in the store. These options are mutually exclusive with + /// price options in item references. + /// + _Maybenull_ PFCatalogCatalogPriceOptionsOverride const* priceOptionsOverride; + +} PFCatalogStoreDetails; + +/// +/// PFCatalogCatalogItem data model. +/// +typedef struct PFCatalogCatalogItem +{ + /// + /// (Optional) The alternate IDs associated with this item. An alternate ID can be set to 'FriendlyId' + /// or any of the supported marketplace names. + /// + _Maybenull_ _Field_size_(alternateIdsCount) PFCatalogCatalogAlternateId const* const* alternateIds; + + /// + /// Count of alternateIds + /// + uint32_t alternateIdsCount; + + /// + /// (Optional) The set of content/files associated with this item. Up to 100 files can be added to + /// an item. + /// + _Maybenull_ _Field_size_(contentsCount) PFCatalogContent const* const* contents; + + /// + /// Count of contents + /// + uint32_t contentsCount; + + /// + /// (Optional) The client-defined type of the item. + /// + _Maybenull_ _Null_terminated_ const char* contentType; + + /// + /// (Optional) The date and time when this item was created. + /// + _Maybenull_ time_t const* creationDate; + + /// + /// (Optional) The ID of the creator of this catalog item. + /// + _Maybenull_ PFEntityKey const* creatorEntity; + + /// + /// (Optional) The set of platform specific deep links for this item. + /// + _Maybenull_ _Field_size_(deepLinksCount) PFCatalogDeepLink const* const* deepLinks; + + /// + /// Count of deepLinks + /// + uint32_t deepLinksCount; + + /// + /// (Optional) The Stack Id that will be used as default for this item in Inventory when an explicit + /// one is not provided. This DefaultStackId can be a static stack id or '{guid}', which will generate + /// a unique stack id for the item. If null, Inventory's default stack id will be used. + /// + _Maybenull_ _Null_terminated_ const char* defaultStackId; + + /// + /// (Optional) A dictionary of localized descriptions. Key is language code and localized string + /// is the value. The NEUTRAL locale is required. Descriptions have a 10000 character limit per country + /// code. + /// + _Maybenull_ _Field_size_(descriptionCount) struct PFStringDictionaryEntry const* description; + + /// + /// Count of description + /// + uint32_t descriptionCount; + + /// + /// (Optional) Game specific properties for display purposes. This is an arbitrary JSON blob. The + /// Display Properties field has a 10000 byte limit per item. + /// + PFJsonObject displayProperties; + + /// + /// (Optional) The user provided version of the item for display purposes. Maximum character length + /// of 50. + /// + _Maybenull_ _Null_terminated_ const char* displayVersion; + + /// + /// (Optional) The date of when the item will cease to be available. If not provided then the product + /// will be available indefinitely. + /// + _Maybenull_ time_t const* endDate; + + /// + /// (Optional) The current ETag value that can be used for optimistic concurrency in the If-None-Match + /// header. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The images associated with this item. Images can be thumbnails or screenshots. Up + /// to 100 images can be added to an item. Only .png, .jpg, .gif, and .bmp file types can be uploaded. + /// + _Maybenull_ _Field_size_(imagesCount) PFCatalogImage const* const* images; + + /// + /// Count of images + /// + uint32_t imagesCount; + + /// + /// (Optional) Indicates if the item is hidden. + /// + _Maybenull_ bool const* isHidden; + + /// + /// (Optional) The item references associated with this item. For example, the items in a Bundle/Store/Subscription. + /// Every item can have up to 50 item references. + /// + _Maybenull_ _Field_size_(itemReferencesCount) PFCatalogCatalogItemReference const* const* itemReferences; + + /// + /// Count of itemReferences + /// + uint32_t itemReferencesCount; + + /// + /// (Optional) A dictionary of localized keywords. Key is language code and localized list of keywords + /// is the value. Keywords have a 50 character limit per keyword and up to 32 keywords can be added + /// per country code. + /// + _Maybenull_ _Field_size_(keywordsCount) struct PFCatalogKeywordSetDictionaryEntry const* keywords; + + /// + /// Count of keywords + /// + uint32_t keywordsCount; + + /// + /// (Optional) The date and time this item was last updated. + /// + _Maybenull_ time_t const* lastModifiedDate; + + /// + /// (Optional) The moderation state for this item. + /// + _Maybenull_ PFCatalogModerationState const* moderation; + + /// + /// (Optional) The platforms supported by this item. + /// + _Maybenull_ _Field_size_(platformsCount) const char* const* platforms; + + /// + /// Count of platforms + /// + uint32_t platformsCount; + + /// + /// (Optional) The prices the item can be purchased for. + /// + _Maybenull_ PFCatalogCatalogPriceOptions const* priceOptions; + + /// + /// (Optional) Rating summary for this item. + /// + _Maybenull_ PFCatalogRating const* rating; + + /// + /// (Optional) The date of when the item will be available. If not provided then the product will + /// appear immediately. + /// + _Maybenull_ time_t const* startDate; + + /// + /// (Optional) Optional details for stores items. + /// + _Maybenull_ PFCatalogStoreDetails const* storeDetails; + + /// + /// (Optional) The list of tags that are associated with this item. Up to 32 tags can be added to + /// an item. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + + /// + /// (Optional) A dictionary of localized titles. Key is language code and localized string is the + /// value. The NEUTRAL locale is required. Titles have a 512 character limit per country code. + /// + _Maybenull_ _Field_size_(titleCount) struct PFStringDictionaryEntry const* title; + + /// + /// Count of title + /// + uint32_t titleCount; + + /// + /// (Optional) The high-level type of the item. The following item types are supported: bundle, catalogItem, + /// currency, store, ugc, subscription. + /// + _Maybenull_ _Null_terminated_ const char* type; + +} PFCatalogCatalogItem; + +/// +/// PFCatalogCreateDraftItemRequest data model. The item will not be published to the public catalog +/// until the PublishItem API is called for the item. +/// +typedef struct PFCatalogCreateDraftItemRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Metadata describing the new catalog item to be created. + /// + _Maybenull_ PFCatalogCatalogItem const* item; + + /// + /// Whether the item should be published immediately. This value is optional, defaults to false. + /// + bool publish; + +} PFCatalogCreateDraftItemRequest; + +/// +/// PFCatalogCreateDraftItemResponse data model. +/// +typedef struct PFCatalogCreateDraftItemResponse +{ + /// + /// (Optional) Updated metadata describing the catalog item just created. + /// + _Maybenull_ PFCatalogCatalogItem const* item; + +} PFCatalogCreateDraftItemResponse; + +/// +/// PFCatalogUploadInfo data model. +/// +typedef struct PFCatalogUploadInfo +{ + /// + /// (Optional) Name of the file to be uploaded. + /// + _Maybenull_ _Null_terminated_ const char* fileName; + +} PFCatalogUploadInfo; + +/// +/// PFCatalogCreateUploadUrlsRequest data model. Upload URLs point to Azure Blobs; clients must follow +/// the Microsoft Azure Storage Blob Service REST API pattern for uploading content. The response contains +/// upload URLs and IDs for each file. The IDs and URLs returned must be added to the item metadata and +/// committed using the CreateDraftItem or UpdateDraftItem Item APIs. +/// +typedef struct PFCatalogCreateUploadUrlsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Description of the files to be uploaded by the client. + /// + _Maybenull_ _Field_size_(filesCount) PFCatalogUploadInfo const* const* files; + + /// + /// Count of files + /// + uint32_t filesCount; + +} PFCatalogCreateUploadUrlsRequest; + +/// +/// PFCatalogUploadUrlMetadata data model. +/// +typedef struct PFCatalogUploadUrlMetadata +{ + /// + /// (Optional) Name of the file for which this upload URL was requested. + /// + _Maybenull_ _Null_terminated_ const char* fileName; + + /// + /// (Optional) Unique ID for the binary content to be uploaded to the target URL. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) URL for the binary content to be uploaded to. + /// + _Maybenull_ _Null_terminated_ const char* url; + +} PFCatalogUploadUrlMetadata; + +/// +/// PFCatalogCreateUploadUrlsResponse data model. +/// +typedef struct PFCatalogCreateUploadUrlsResponse +{ + /// + /// (Optional) List of URLs metadata for the files to be uploaded by the client. + /// + _Maybenull_ _Field_size_(uploadUrlsCount) PFCatalogUploadUrlMetadata const* const* uploadUrls; + + /// + /// Count of uploadUrls + /// + uint32_t uploadUrlsCount; + +} PFCatalogCreateUploadUrlsResponse; + +/// +/// PFCatalogDeleteEntityItemReviewsRequest data model. +/// +typedef struct PFCatalogDeleteEntityItemReviewsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFCatalogDeleteEntityItemReviewsRequest; + +/// +/// PFCatalogDeleteItemRequest data model. +/// +typedef struct PFCatalogDeleteItemRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogDeleteItemRequest; + +/// +/// PFCatalogGetCatalogConfigRequest data model. +/// +typedef struct PFCatalogGetCatalogConfigRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFCatalogGetCatalogConfigRequest; + +/// +/// PFCatalogCatalogSpecificConfig data model. +/// +typedef struct PFCatalogCatalogSpecificConfig +{ + /// + /// (Optional) The set of content types that will be used for validation. Each content type can have + /// a maximum character length of 40 and up to 128 types can be listed. + /// + _Maybenull_ _Field_size_(contentTypesCount) const char* const* contentTypes; + + /// + /// Count of contentTypes + /// + uint32_t contentTypesCount; + + /// + /// (Optional) The set of tags that will be used for validation. Each tag can have a maximum character + /// length of 32 and up to 1024 tags can be listed. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + +} PFCatalogCatalogSpecificConfig; + +/// +/// PFCatalogDeepLinkFormat data model. +/// +typedef struct PFCatalogDeepLinkFormat +{ + /// + /// (Optional) The format of the deep link to return. The format should contain '{id}' to represent + /// where the item ID should be placed. + /// + _Maybenull_ _Null_terminated_ const char* format; + + /// + /// (Optional) The target platform for the deep link. + /// + _Maybenull_ _Null_terminated_ const char* platform; + +} PFCatalogDeepLinkFormat; + +/// +/// PFCatalogDisplayPropertyIndexInfo data model. +/// +typedef struct PFCatalogDisplayPropertyIndexInfo +{ + /// + /// (Optional) The property name in the 'DisplayProperties' property to be indexed. + /// + _Maybenull_ _Null_terminated_ const char* name; + + /// + /// (Optional) The type of the property to be indexed. + /// + _Maybenull_ PFCatalogDisplayPropertyType const* type; + +} PFCatalogDisplayPropertyIndexInfo; + +/// +/// PFCatalogFileConfig data model. +/// +typedef struct PFCatalogFileConfig +{ + /// + /// (Optional) The set of content types that will be used for validation. Each content type can have + /// a maximum character length of 40 and up to 128 types can be listed. + /// + _Maybenull_ _Field_size_(contentTypesCount) const char* const* contentTypes; + + /// + /// Count of contentTypes + /// + uint32_t contentTypesCount; + + /// + /// (Optional) The set of tags that will be used for validation. Each tag can have a maximum character + /// length of 32 and up to 1024 tags can be listed. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + +} PFCatalogFileConfig; + +/// +/// PFCatalogImageConfig data model. +/// +typedef struct PFCatalogImageConfig +{ + /// + /// (Optional) The set of tags that will be used for validation. Each tag can have a maximum character + /// length of 32 and up to 1024 tags can be listed. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + +} PFCatalogImageConfig; + +/// +/// PFCatalogUserGeneratedContentSpecificConfig data model. +/// +typedef struct PFCatalogUserGeneratedContentSpecificConfig +{ + /// + /// (Optional) The set of content types that will be used for validation. + /// + _Maybenull_ _Field_size_(contentTypesCount) const char* const* contentTypes; + + /// + /// Count of contentTypes + /// + uint32_t contentTypesCount; + + /// + /// (Optional) The set of tags that will be used for validation. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + +} PFCatalogUserGeneratedContentSpecificConfig; + +/// +/// PFCatalogCatalogConfig data model. +/// +typedef struct PFCatalogCatalogConfig +{ + /// + /// (Optional) A list of player entity keys that will have admin permissions. There is a maximum + /// of 64 entities that can be added. + /// + _Maybenull_ _Field_size_(adminEntitiesCount) PFEntityKey const* const* adminEntities; + + /// + /// Count of adminEntities + /// + uint32_t adminEntitiesCount; + + /// + /// (Optional) The set of configuration that only applies to catalog items. + /// + _Maybenull_ PFCatalogCatalogSpecificConfig const* catalog; + + /// + /// (Optional) A list of deep link formats. Up to 10 can be added. + /// + _Maybenull_ _Field_size_(deepLinkFormatsCount) PFCatalogDeepLinkFormat const* const* deepLinkFormats; + + /// + /// Count of deepLinkFormats + /// + uint32_t deepLinkFormatsCount; + + /// + /// (Optional) A list of display properties to index. Up to 5 mappings can be added per Display Property + /// Type. More info on display properties can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/content-types-tags-and-properties#displayproperties. + /// + _Maybenull_ _Field_size_(displayPropertyIndexInfosCount) PFCatalogDisplayPropertyIndexInfo const* const* displayPropertyIndexInfos; + + /// + /// Count of displayPropertyIndexInfos + /// + uint32_t displayPropertyIndexInfosCount; + + /// + /// (Optional) The set of configuration that only applies to Files. + /// + _Maybenull_ PFCatalogFileConfig const* file; + + /// + /// (Optional) The set of configuration that only applies to Images. + /// + _Maybenull_ PFCatalogImageConfig const* image; + + /// + /// Flag defining whether catalog is enabled. + /// + bool isCatalogEnabled; + + /// + /// (Optional) A list of Platforms that can be applied to catalog items. Each platform can have a + /// maximum character length of 40 and up to 128 platforms can be listed. + /// + _Maybenull_ _Field_size_(platformsCount) const char* const* platforms; + + /// + /// Count of platforms + /// + uint32_t platformsCount; + + /// + /// (Optional) A set of player entity keys that are allowed to review content. There is a maximum + /// of 64 entities that can be added. + /// + _Maybenull_ _Field_size_(reviewerEntitiesCount) PFEntityKey const* const* reviewerEntities; + + /// + /// Count of reviewerEntities + /// + uint32_t reviewerEntitiesCount; + + /// + /// (Optional) The set of configuration that only applies to user generated contents. + /// + _Maybenull_ PFCatalogUserGeneratedContentSpecificConfig const* userGeneratedContent; + +} PFCatalogCatalogConfig; + +/// +/// PFCatalogGetCatalogConfigResponse data model. +/// +typedef struct PFCatalogGetCatalogConfigResponse +{ + /// + /// (Optional) The catalog configuration. + /// + _Maybenull_ PFCatalogCatalogConfig const* config; + +} PFCatalogGetCatalogConfigResponse; + +/// +/// PFCatalogGetDraftItemRequest data model. +/// +typedef struct PFCatalogGetDraftItemRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogGetDraftItemRequest; + +/// +/// PFCatalogGetDraftItemResponse data model. +/// +typedef struct PFCatalogGetDraftItemResponse +{ + /// + /// (Optional) Full metadata of the catalog item requested. + /// + _Maybenull_ PFCatalogCatalogItem const* item; + +} PFCatalogGetDraftItemResponse; + +/// +/// PFCatalogGetDraftItemsRequest data model. +/// +typedef struct PFCatalogGetDraftItemsRequest +{ + /// + /// (Optional) List of item alternate IDs. + /// + _Maybenull_ _Field_size_(alternateIdsCount) PFCatalogCatalogAlternateId const* const* alternateIds; + + /// + /// Count of alternateIds + /// + uint32_t alternateIdsCount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) List of Item Ids. + /// + _Maybenull_ _Field_size_(idsCount) const char* const* ids; + + /// + /// Count of ids + /// + uint32_t idsCount; + +} PFCatalogGetDraftItemsRequest; + +/// +/// PFCatalogGetDraftItemsResponse data model. +/// +typedef struct PFCatalogGetDraftItemsResponse +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) A set of items created by the entity. + /// + _Maybenull_ _Field_size_(itemsCount) PFCatalogCatalogItem const* const* items; + + /// + /// Count of items + /// + uint32_t itemsCount; + +} PFCatalogGetDraftItemsResponse; + +/// +/// PFCatalogGetEntityDraftItemsRequest data model. +/// +typedef struct PFCatalogGetEntityDraftItemsRequest +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items created by the caller, if + /// any are available. Should be null on initial request. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + int32_t count; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) OData Filter to refine the items returned. CatalogItem properties 'type' can be used + /// in the filter. For example: "type eq 'ugc'". + /// + _Maybenull_ _Null_terminated_ const char* filter; + +} PFCatalogGetEntityDraftItemsRequest; + +/// +/// PFCatalogGetEntityDraftItemsResponse data model. +/// +typedef struct PFCatalogGetEntityDraftItemsResponse +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) A set of items created by the entity. + /// + _Maybenull_ _Field_size_(itemsCount) PFCatalogCatalogItem const* const* items; + + /// + /// Count of items + /// + uint32_t itemsCount; + +} PFCatalogGetEntityDraftItemsResponse; + +/// +/// PFCatalogGetEntityItemReviewRequest data model. +/// +typedef struct PFCatalogGetEntityItemReviewRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogGetEntityItemReviewRequest; + +/// +/// PFCatalogReview data model. +/// +typedef struct PFCatalogReview +{ + /// + /// The number of negative helpfulness votes for this review. + /// + int32_t helpfulNegative; + + /// + /// The number of positive helpfulness votes for this review. + /// + int32_t helpfulPositive; + + /// + /// Indicates whether the review author has the item installed. + /// + bool isInstalled; + + /// + /// (Optional) The ID of the item being reviewed. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) The version of the item being reviewed. + /// + _Maybenull_ _Null_terminated_ const char* itemVersion; + + /// + /// (Optional) The locale for which this review was submitted in. + /// + _Maybenull_ _Null_terminated_ const char* locale; + + /// + /// Star rating associated with this review. + /// + int32_t rating; + + /// + /// (Optional) The ID of the author of the review. + /// + _Maybenull_ PFEntityKey const* reviewerEntity; + + /// + /// (Optional) Deprecated. Use ReviewerEntity instead. This property will be removed in a future + /// release. + /// + _Maybenull_ _Null_terminated_ const char* reviewerId; + + /// + /// (Optional) The ID of the review. + /// + _Maybenull_ _Null_terminated_ const char* reviewId; + + /// + /// (Optional) The full text of this review. + /// + _Maybenull_ _Null_terminated_ const char* reviewText; + + /// + /// The date and time this review was last submitted. + /// + time_t submitted; + + /// + /// (Optional) The title of this review. + /// + _Maybenull_ _Null_terminated_ const char* title; + +} PFCatalogReview; + +/// +/// PFCatalogGetEntityItemReviewResponse data model. +/// +typedef struct PFCatalogGetEntityItemReviewResponse +{ + /// + /// (Optional) The review the entity submitted for the requested item. + /// + _Maybenull_ PFCatalogReview const* review; + +} PFCatalogGetEntityItemReviewResponse; + +/// +/// PFCatalogGetItemRequest data model. +/// +typedef struct PFCatalogGetItemRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogGetItemRequest; + +/// +/// PFCatalogGetItemResponse data model. Get item result. +/// +typedef struct PFCatalogGetItemResponse +{ + /// + /// (Optional) The item result. + /// + _Maybenull_ PFCatalogCatalogItem const* item; + +} PFCatalogGetItemResponse; + +/// +/// PFCatalogGetItemContainersRequest data model. Given an item, return a set of bundles and stores containing +/// the item. +/// +typedef struct PFCatalogGetItemContainersRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) An opaque token used to retrieve the next page of items in the inventory, if any are + /// available. Should be null on initial request. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + int32_t count; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogGetItemContainersRequest; + +/// +/// PFCatalogGetItemContainersResponse data model. +/// +typedef struct PFCatalogGetItemContainersResponse +{ + /// + /// (Optional) List of Bundles and Stores containing the requested items. + /// + _Maybenull_ _Field_size_(containersCount) PFCatalogCatalogItem const* const* containers; + + /// + /// Count of containers + /// + uint32_t containersCount; + + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + +} PFCatalogGetItemContainersResponse; + +/// +/// PFCatalogGetItemModerationStateRequest data model. +/// +typedef struct PFCatalogGetItemModerationStateRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogGetItemModerationStateRequest; + +/// +/// PFCatalogGetItemModerationStateResponse data model. +/// +typedef struct PFCatalogGetItemModerationStateResponse +{ + /// + /// (Optional) The current moderation state for the requested item. + /// + _Maybenull_ PFCatalogModerationState const* state; + +} PFCatalogGetItemModerationStateResponse; + +/// +/// PFCatalogGetItemPublishStatusRequest data model. +/// +typedef struct PFCatalogGetItemPublishStatusRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogGetItemPublishStatusRequest; + +/// +/// PFCatalogGetItemPublishStatusResponse data model. +/// +typedef struct PFCatalogGetItemPublishStatusResponse +{ + /// + /// (Optional) High level status of the published item. + /// + _Maybenull_ PFCatalogPublishResult const* result; + + /// + /// (Optional) Descriptive message about the current status of the publish. + /// + _Maybenull_ _Null_terminated_ const char* statusMessage; + +} PFCatalogGetItemPublishStatusResponse; + +/// +/// PFCatalogGetItemReviewsRequest data model. +/// +typedef struct PFCatalogGetItemReviewsRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + int32_t count; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) An OData orderBy used to order the results of the query. Possible values are Helpfulness, + /// Rating, and Submitted (For example: "Submitted desc"). + /// + _Maybenull_ _Null_terminated_ const char* orderBy; + +} PFCatalogGetItemReviewsRequest; + +/// +/// PFCatalogGetItemReviewsResponse data model. +/// +typedef struct PFCatalogGetItemReviewsResponse +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) The paginated set of results. + /// + _Maybenull_ _Field_size_(reviewsCount) PFCatalogReview const* const* reviews; + + /// + /// Count of reviews + /// + uint32_t reviewsCount; + +} PFCatalogGetItemReviewsResponse; + +/// +/// PFCatalogGetItemReviewSummaryRequest data model. +/// +typedef struct PFCatalogGetItemReviewSummaryRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogGetItemReviewSummaryRequest; + +/// +/// PFCatalogGetItemReviewSummaryResponse data model. +/// +typedef struct PFCatalogGetItemReviewSummaryResponse +{ + /// + /// (Optional) The least favorable review for this item. + /// + _Maybenull_ PFCatalogReview const* leastFavorableReview; + + /// + /// (Optional) The most favorable review for this item. + /// + _Maybenull_ PFCatalogReview const* mostFavorableReview; + + /// + /// (Optional) The summary of ratings associated with this item. + /// + _Maybenull_ PFCatalogRating const* rating; + + /// + /// The total number of reviews associated with this item. + /// + int32_t reviewsCount; + +} PFCatalogGetItemReviewSummaryResponse; + +/// +/// PFCatalogGetItemsRequest data model. +/// +typedef struct PFCatalogGetItemsRequest +{ + /// + /// (Optional) List of item alternate IDs. + /// + _Maybenull_ _Field_size_(alternateIdsCount) PFCatalogCatalogAlternateId const* const* alternateIds; + + /// + /// Count of alternateIds + /// + uint32_t alternateIdsCount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) List of Item Ids. + /// + _Maybenull_ _Field_size_(idsCount) const char* const* ids; + + /// + /// Count of ids + /// + uint32_t idsCount; + +} PFCatalogGetItemsRequest; + +/// +/// PFCatalogGetItemsResponse data model. +/// +typedef struct PFCatalogGetItemsResponse +{ + /// + /// (Optional) Metadata of set of items. + /// + _Maybenull_ _Field_size_(itemsCount) PFCatalogCatalogItem const* const* items; + + /// + /// Count of items + /// + uint32_t itemsCount; + +} PFCatalogGetItemsResponse; + +/// +/// PFCatalogPublishDraftItemRequest data model. The call kicks off a workflow to publish the item to +/// the public catalog. The Publish Status API should be used to monitor the publish job. +/// +typedef struct PFCatalogPublishDraftItemRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETag of the catalog item to published from the working catalog to the public catalog. + /// Used for optimistic concurrency. If the provided ETag does not match the ETag in the current working + /// catalog, the request will be rejected. If not provided, the current version of the document in + /// the working catalog will be published. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogPublishDraftItemRequest; + +/// +/// PFCatalogReportItemRequest data model. +/// +typedef struct PFCatalogReportItemRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) Category of concern for this report. + /// + _Maybenull_ PFCatalogConcernCategory const* concernCategory; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The string reason for this report. + /// + _Maybenull_ _Null_terminated_ const char* reason; + +} PFCatalogReportItemRequest; + +/// +/// PFCatalogReportItemReviewRequest data model. Submit a report for an inappropriate review, allowing +/// the submitting user to specify their concern. +/// +typedef struct PFCatalogReportItemReviewRequest +{ + /// + /// (Optional) An alternate ID of the item associated with the review. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The reason this review is being reported. + /// + _Maybenull_ PFCatalogConcernCategory const* concernCategory; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The string ID of the item associated with the review. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) The string reason for this report. + /// + _Maybenull_ _Null_terminated_ const char* reason; + + /// + /// (Optional) The ID of the review to submit a report for. + /// + _Maybenull_ _Null_terminated_ const char* reviewId; + +} PFCatalogReportItemReviewRequest; + +/// +/// PFCatalogReviewItemRequest data model. +/// +typedef struct PFCatalogReviewItemRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The review to submit. + /// + _Maybenull_ PFCatalogReview const* review; + +} PFCatalogReviewItemRequest; + +/// +/// PFCatalogStoreReference data model. +/// +typedef struct PFCatalogStoreReference +{ + /// + /// (Optional) An alternate ID of the store. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The unique ID of the store. + /// + _Maybenull_ _Null_terminated_ const char* id; + +} PFCatalogStoreReference; + +/// +/// PFCatalogSearchItemsRequest data model. +/// +typedef struct PFCatalogSearchItemsRequest +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// Number of items to retrieve. This value is optional. Maximum page size is 50. Default value is + /// 10. + /// + int32_t count; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) An OData filter used to refine the search query (For example: "type eq 'ugc'"). More + /// info about Filter Complexity limits can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search#limits. + /// + _Maybenull_ _Null_terminated_ const char* filter; + + /// + /// (Optional) The locale to be returned in the result. + /// + _Maybenull_ _Null_terminated_ const char* language; + + /// + /// (Optional) An OData orderBy used to order the results of the search query. For example: "rating/average + /// asc" . + /// + _Maybenull_ _Null_terminated_ const char* orderBy; + + /// + /// (Optional) The text to search for. + /// + _Maybenull_ _Null_terminated_ const char* search; + + /// + /// (Optional) An OData select query option used to augment the search results. If not defined, the + /// default search result metadata will be returned. + /// + _Maybenull_ _Null_terminated_ const char* select; + + /// + /// (Optional) The store to restrict the search request to. + /// + _Maybenull_ PFCatalogStoreReference const* store; + +} PFCatalogSearchItemsRequest; + +/// +/// PFCatalogSearchItemsResponse data model. +/// +typedef struct PFCatalogSearchItemsResponse +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) The paginated set of results for the search query. + /// + _Maybenull_ _Field_size_(itemsCount) PFCatalogCatalogItem const* const* items; + + /// + /// Count of items + /// + uint32_t itemsCount; + +} PFCatalogSearchItemsResponse; + +/// +/// PFCatalogSetItemModerationStateRequest data model. +/// +typedef struct PFCatalogSetItemModerationStateRequest +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The unique ID of the item. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The reason for the moderation state change for the associated item. + /// + _Maybenull_ _Null_terminated_ const char* reason; + + /// + /// (Optional) The status to set for the associated item. + /// + _Maybenull_ PFCatalogModerationStatus const* status; + +} PFCatalogSetItemModerationStateRequest; + +/// +/// PFCatalogSubmitItemReviewVoteRequest data model. +/// +typedef struct PFCatalogSubmitItemReviewVoteRequest +{ + /// + /// (Optional) An alternate ID of the item associated with the review. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The string ID of the item associated with the review. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) The ID of the review to submit a helpfulness vote for. + /// + _Maybenull_ _Null_terminated_ const char* reviewId; + + /// + /// (Optional) The helpfulness vote of the review. + /// + _Maybenull_ PFCatalogHelpfulnessVote const* vote; + +} PFCatalogSubmitItemReviewVoteRequest; + +/// +/// PFCatalogReviewTakedown data model. +/// +typedef struct PFCatalogReviewTakedown +{ + /// + /// (Optional) An alternate ID associated with this item. + /// + _Maybenull_ PFCatalogCatalogAlternateId const* alternateId; + + /// + /// (Optional) The ID of the item associated with the review to take down. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) The ID of the review to take down. + /// + _Maybenull_ _Null_terminated_ const char* reviewId; + +} PFCatalogReviewTakedown; + +/// +/// PFCatalogTakedownItemReviewsRequest data model. Submit a request to takedown one or more reviews, +/// removing them from public view. Authors will still be able to see their reviews after being taken +/// down. +/// +typedef struct PFCatalogTakedownItemReviewsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The set of reviews to take down. + /// + _Maybenull_ _Field_size_(reviewsCount) PFCatalogReviewTakedown const* const* reviews; + + /// + /// Count of reviews + /// + uint32_t reviewsCount; + +} PFCatalogTakedownItemReviewsRequest; + +/// +/// PFCatalogUpdateCatalogConfigRequest data model. +/// +typedef struct PFCatalogUpdateCatalogConfigRequest +{ + /// + /// (Optional) The updated catalog configuration. + /// + _Maybenull_ PFCatalogCatalogConfig const* config; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFCatalogUpdateCatalogConfigRequest; + +/// +/// PFCatalogUpdateDraftItemRequest data model. +/// +typedef struct PFCatalogUpdateDraftItemRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Updated metadata describing the catalog item to be updated. + /// + _Maybenull_ PFCatalogCatalogItem const* item; + + /// + /// Whether the item should be published immediately. This value is optional, defaults to false. + /// + bool publish; + +} PFCatalogUpdateDraftItemRequest; + +/// +/// PFCatalogUpdateDraftItemResponse data model. +/// +typedef struct PFCatalogUpdateDraftItemResponse +{ + /// + /// (Optional) Updated metadata describing the catalog item just updated. + /// + _Maybenull_ PFCatalogCatalogItem const* item; + +} PFCatalogUpdateDraftItemResponse; + +/// +/// Dictionary entry for an associative array with PFCatalogKeywordSet values. +/// +typedef struct PFCatalogKeywordSetDictionaryEntry +{ + _Null_terminated_ const char* key; + PFCatalogKeywordSet const* value; +} PFCatalogKeywordSetDictionaryEntry; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFCharacter.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFCharacter.h new file mode 100644 index 0000000..39e2512 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFCharacter.h @@ -0,0 +1,758 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +#if 0 +/// +/// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; +/// characterId must be evaluated with the parent PlayFabId to guarantee uniqueness. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Returns a list of every character that currently belongs to a user. See also ClientGetCharacterDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterClientGetAllUsersCharactersAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCharacterListUsersCharactersRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetAllUsersCharacters call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCharacterClientGetAllUsersCharactersGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterClientGetAllUsersCharactersAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterClientGetAllUsersCharactersGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterListUsersCharactersResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title-specific custom data for the character which is readable and writable by the +/// client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom character +/// data will be returned. See also ClientGetCharacterReadOnlyDataAsync, ClientGetUserDataAsync, ClientUpdateCharacterDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterClientGetCharacterDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetCharacterData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterClientGetCharacterDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterClientGetCharacterDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterClientGetCharacterDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterClientGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title-specific custom data for the character which can only be read by the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom character +/// data will be returned. See also ClientGetCharacterDataAsync, ClientGetUserDataAsync, ClientUpdateCharacterDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterClientGetCharacterReadOnlyDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetCharacterReadOnlyData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterClientGetCharacterReadOnlyDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterClientGetCharacterReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterClientGetCharacterReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterClientGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Grants the specified character type to the user. CharacterIds are not globally unique; characterId +/// must be evaluated with the parent PlayFabId to guarantee uniqueness. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Grants a character to the user of the type specified by the item ID. The user must already have an +/// instance of this item in their inventory in order to allow character creation. This item can come +/// from a purchase or grant, which must be done before calling to create the character. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterClientGrantCharacterToUserAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCharacterClientGrantCharacterToUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGrantCharacterToUser call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_ITEM_PROPERTIES, +/// E_PF_ITEM_NOT_OWNED or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFCharacterClientGrantCharacterToUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterClientGrantCharacterToUserAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_INVALID_ITEM_PROPERTIES, +/// E_PF_ITEM_NOT_OWNED or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterClientGrantCharacterToUserGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterClientGrantCharacterToUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Creates and updates the title-specific custom data for the user's character which is readable and +/// writable by the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary strings containing the custom data for +/// the character. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, while keys with null values will be removed. New keys will be added, with +/// the given values. No other key-value pairs will be changed apart from those specified in the call. +/// See also ClientGetCharacterDataAsync, ClientGetCharacterReadOnlyDataAsync, ClientGetUserDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFCharacterClientUpdateCharacterDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCharacterClientUpdateCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFCharacterClientUpdateCharacterDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFCharacterUpdateCharacterDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFCharacterClientUpdateCharacterDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Deletes the specific character ID from the specified user. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function will delete the specified character from the list allowed by the user, and will also +/// delete any inventory or VC currently held by that character. It will NOT delete any statistics associated +/// for this character, in order to preserve leaderboard integrity. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_CHARACTER_NOT_FOUND or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCharacterServerDeleteCharacterFromUserAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterDeleteCharacterFromUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; +/// characterId must be evaluated with the parent PlayFabId to guarantee uniqueness. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Returns a list of every character that currently belongs to a user. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterServerGetAllUsersCharactersAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterListUsersCharactersRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetAllUsersCharacters call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCharacterServerGetAllUsersCharactersGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerGetAllUsersCharactersAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterServerGetAllUsersCharactersGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterListUsersCharactersResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title-specific custom data for the user which is readable and writable by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserDataAsync, ServerUpdateCharacterDataAsync, ServerUpdateCharacterInternalDataAsync, +/// ServerUpdateCharacterReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterServerGetCharacterDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetCharacterData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterServerGetCharacterDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerGetCharacterDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterServerGetCharacterDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title-specific custom data for the user's character which cannot be accessed by the +/// client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserInternalDataAsync, ServerUpdateCharacterDataAsync, ServerUpdateCharacterInternalDataAsync, +/// ServerUpdateCharacterReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterServerGetCharacterInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetCharacterInternalData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterServerGetCharacterInternalDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerGetCharacterInternalDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterServerGetCharacterInternalDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title-specific custom data for the user's character which can only be read by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom data +/// will be returned. See also ServerGetCharacterDataAsync, ServerGetCharacterInternalDataAsync, ServerGetUserReadOnlyDataAsync, +/// ServerUpdateCharacterReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterServerGetCharacterReadOnlyDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetCharacterReadOnlyData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterServerGetCharacterReadOnlyDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerGetCharacterReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterServerGetCharacterReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Grants the specified character type to the user. CharacterIds are not globally unique; characterId +/// must be evaluated with the parent PlayFabId to guarantee uniqueness. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Grants a character to the user of the type and name specified in the request. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCharacterServerGrantCharacterToUserAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterServerGrantCharacterToUserRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGrantCharacterToUser call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFCharacterServerGrantCharacterToUserGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerGrantCharacterToUserAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCharacterServerGrantCharacterToUserGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGrantCharacterToUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Updates the title-specific custom data for the user's character which is readable and writable by +/// the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, while keys with null values will be removed. No other key-value pairs will +/// be changed apart from those specified in the call. See also ServerGetCharacterDataAsync, ServerUpdateCharacterInternalDataAsync, +/// ServerUpdateCharacterReadOnlyDataAsync, ServerUpdateUserDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFCharacterServerUpdateCharacterDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterServerUpdateCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerUpdateCharacterDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFCharacterUpdateCharacterDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterServerUpdateCharacterDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Updates the title-specific custom data for the user's character which cannot be accessed by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, keys with null values will be removed. No other key-value pairs will be +/// changed apart from those specified in the call. See also ServerGetCharacterInternalDataAsync, ServerUpdateCharacterDataAsync, +/// ServerUpdateCharacterReadOnlyDataAsync, ServerUpdateUserInternalDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFCharacterServerUpdateCharacterInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterServerUpdateCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerUpdateCharacterInternalDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFCharacterUpdateCharacterDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterServerUpdateCharacterInternalDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Updates the title-specific custom data for the user's character which can only be read by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, keys with null values will be removed. No other key-value pairs will be +/// changed apart from those specified in the call. See also ServerGetCharacterDataAsync, ServerGetCharacterInternalDataAsync, +/// ServerGetCharacterReadOnlyDataAsync, ServerGetUserReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFCharacterServerUpdateCharacterReadOnlyDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFCharacterServerUpdateCharacterDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFCharacterServerUpdateCharacterReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFCharacterUpdateCharacterDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CHARACTER_NOT_FOUND, +/// E_PF_USERIS_NOT_VALID or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCharacterServerUpdateCharacterReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFCharacterTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFCharacterTypes.h new file mode 100644 index 0000000..c84556d --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFCharacterTypes.h @@ -0,0 +1,422 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFCharacterListUsersCharactersRequest data model. Returns a list of every character that currently +/// belongs to a user. +/// +typedef struct PFCharacterListUsersCharactersRequest +{ + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFCharacterListUsersCharactersRequest; + +/// +/// PFCharacterListUsersCharactersResult data model. +/// +typedef struct PFCharacterListUsersCharactersResult +{ + /// + /// (Optional) The requested list of characters. + /// + _Maybenull_ _Field_size_(charactersCount) PFCharacterResult const* const* characters; + + /// + /// Count of characters + /// + uint32_t charactersCount; + +} PFCharacterListUsersCharactersResult; + +/// +/// PFCharacterGetCharacterDataRequest data model. Data is stored as JSON key-value pairs. If the Keys +/// parameter is provided, the data object returned will only contain the data specific to the indicated +/// Keys. Otherwise, the full set of custom character data will be returned. +/// +typedef struct PFCharacterGetCharacterDataRequest +{ + /// + /// Unique PlayFab assigned ID for a specific character owned by a user. + /// + _Null_terminated_ const char* characterId; + + /// + /// (Optional) The version that currently exists according to the caller. The call will return the + /// data for all of the keys if the version in the system is greater than this. + /// + _Maybenull_ uint32_t const* ifChangedFromDataVersion; + + /// + /// (Optional) Specific keys to search for in the custom user data. + /// + _Maybenull_ _Field_size_(keysCount) const char* const* keys; + + /// + /// Count of keys + /// + uint32_t keysCount; + + /// + /// Unique PlayFab identifier of the user to load data for. Optional, defaults to yourself if not + /// set. + /// + _Null_terminated_ const char* playFabId; + +} PFCharacterGetCharacterDataRequest; + +/// +/// PFCharacterClientGetCharacterDataResult data model. +/// +typedef struct PFCharacterClientGetCharacterDataResult +{ + /// + /// (Optional) Unique PlayFab assigned ID for a specific character owned by a user. + /// + _Maybenull_ _Null_terminated_ const char* characterId; + + /// + /// (Optional) User specific data for this title. + /// + _Maybenull_ _Field_size_(dataCount) struct PFUserDataRecordDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// Indicates the current version of the data that has been set. This is incremented with every set + /// call for that type of data (read-only, internal, etc). This version can be provided in Get calls + /// to find updated data. + /// + uint32_t dataVersion; + +} PFCharacterClientGetCharacterDataResult; + +/// +/// PFCharacterClientGrantCharacterToUserRequest data model. Grants a character to the user of the type +/// specified by the item ID. The user must already have an instance of this item in their inventory in +/// order to allow character creation. This item can come from a purchase or grant, which must be done +/// before calling to create the character. +/// +typedef struct PFCharacterClientGrantCharacterToUserRequest +{ + /// + /// (Optional) Catalog version from which items are to be granted. + /// + _Maybenull_ _Null_terminated_ const char* catalogVersion; + + /// + /// Non-unique display name of the character being granted (1-40 characters in length). + /// + _Null_terminated_ const char* characterName; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Catalog item identifier of the item in the user's inventory that corresponds to the character + /// in the catalog to be created. + /// + _Null_terminated_ const char* itemId; + +} PFCharacterClientGrantCharacterToUserRequest; + +/// +/// PFCharacterClientGrantCharacterToUserResult data model. +/// +typedef struct PFCharacterClientGrantCharacterToUserResult +{ + /// + /// (Optional) Unique identifier tagged to this character. + /// + _Maybenull_ _Null_terminated_ const char* characterId; + + /// + /// (Optional) Type of character that was created. + /// + _Maybenull_ _Null_terminated_ const char* characterType; + + /// + /// Indicates whether this character was created successfully. + /// + bool result; + +} PFCharacterClientGrantCharacterToUserResult; + +/// +/// PFCharacterClientUpdateCharacterDataRequest data model. This function performs an additive update +/// of the arbitrary strings containing the custom data for the character. In updating the custom data +/// object, keys which already exist in the object will have their values overwritten, while keys with +/// null values will be removed. New keys will be added, with the given values. No other key-value pairs +/// will be changed apart from those specified in the call. +/// +typedef struct PFCharacterClientUpdateCharacterDataRequest +{ + /// + /// Unique PlayFab assigned ID for a specific character owned by a user. + /// + _Null_terminated_ const char* characterId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, + /// are limited in size, and may not begin with a '!' character or be null. + /// + _Maybenull_ _Field_size_(dataCount) struct PFStringDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// (Optional) Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values + /// into Data due to language constraints. Use this to delete the keys directly. + /// + _Maybenull_ _Field_size_(keysToRemoveCount) const char* const* keysToRemove; + + /// + /// Count of keysToRemove + /// + uint32_t keysToRemoveCount; + + /// + /// (Optional) Permission to be applied to all user data keys written in this request. Defaults to + /// "private" if not set. + /// + _Maybenull_ PFUserDataPermission const* permission; + +} PFCharacterClientUpdateCharacterDataRequest; + +/// +/// PFCharacterUpdateCharacterDataResult data model. +/// +typedef struct PFCharacterUpdateCharacterDataResult +{ + /// + /// Indicates the current version of the data that has been set. This is incremented with every set + /// call for that type of data (read-only, internal, etc). This version can be provided in Get calls + /// to find updated data. + /// + uint32_t dataVersion; + +} PFCharacterUpdateCharacterDataResult; + +/// +/// PFCharacterDeleteCharacterFromUserRequest data model. This function will delete the specified character +/// from the list allowed by the user, and will also delete any inventory or VC currently held by that +/// character. It will NOT delete any statistics associated for this character, in order to preserve leaderboard +/// integrity. +/// +typedef struct PFCharacterDeleteCharacterFromUserRequest +{ + /// + /// Unique PlayFab assigned ID for a specific character owned by a user. + /// + _Null_terminated_ const char* characterId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// If true, the character's inventory will be transferred up to the owning user; otherwise, this + /// request will purge those items. + /// + bool saveCharacterInventory; + +} PFCharacterDeleteCharacterFromUserRequest; + +/// +/// PFCharacterServerGetCharacterDataResult data model. +/// +typedef struct PFCharacterServerGetCharacterDataResult +{ + /// + /// (Optional) Unique PlayFab assigned ID for a specific character owned by a user. + /// + _Maybenull_ _Null_terminated_ const char* characterId; + + /// + /// (Optional) User specific data for this title. + /// + _Maybenull_ _Field_size_(dataCount) struct PFUserDataRecordDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// Indicates the current version of the data that has been set. This is incremented with every set + /// call for that type of data (read-only, internal, etc). This version can be provided in Get calls + /// to find updated data. + /// + uint32_t dataVersion; + + /// + /// (Optional) Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFCharacterServerGetCharacterDataResult; + +/// +/// PFCharacterServerGrantCharacterToUserRequest data model. Grants a character to the user of the type +/// and name specified in the request. +/// +typedef struct PFCharacterServerGrantCharacterToUserRequest +{ + /// + /// Non-unique display name of the character being granted (1-40 characters in length). + /// + _Null_terminated_ const char* characterName; + + /// + /// Type of the character being granted; statistics can be sliced based on this value. + /// + _Null_terminated_ const char* characterType; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFCharacterServerGrantCharacterToUserRequest; + +/// +/// PFCharacterServerGrantCharacterToUserResult data model. +/// +typedef struct PFCharacterServerGrantCharacterToUserResult +{ + /// + /// (Optional) Unique identifier tagged to this character. + /// + _Maybenull_ _Null_terminated_ const char* characterId; + +} PFCharacterServerGrantCharacterToUserResult; + +/// +/// PFCharacterServerUpdateCharacterDataRequest data model. This function performs an additive update +/// of the arbitrary JSON object containing the custom data for the user. In updating the custom data +/// object, keys which already exist in the object will have their values overwritten, while keys with +/// null values will be removed. No other key-value pairs will be changed apart from those specified in +/// the call. +/// +typedef struct PFCharacterServerUpdateCharacterDataRequest +{ + /// + /// Unique PlayFab assigned ID for a specific character owned by a user. + /// + _Null_terminated_ const char* characterId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, + /// are limited in size, and may not begin with a '!' character or be null. + /// + _Maybenull_ _Field_size_(dataCount) struct PFStringDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// (Optional) Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values + /// into Data due to language constraints. Use this to delete the keys directly. + /// + _Maybenull_ _Field_size_(keysToRemoveCount) const char* const* keysToRemove; + + /// + /// Count of keysToRemove + /// + uint32_t keysToRemoveCount; + + /// + /// (Optional) Permission to be applied to all user data keys written in this request. Defaults to + /// "private" if not set. + /// + _Maybenull_ PFUserDataPermission const* permission; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFCharacterServerUpdateCharacterDataRequest; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScript.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScript.h new file mode 100644 index 0000000..2fb3797 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScript.h @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution +/// of any kind of custom server-side functionality you can implement, and it can be used in conjunction +/// with virtually anything. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Executes an Azure Function with the profile of the entity that is defined in the request. See also +/// CloudScriptRegisterHttpFunctionAsync, CloudScriptRegisterQueuedFunctionAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFCloudScriptExecuteFunctionAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFCloudScriptExecuteFunctionRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ExecuteFunction call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_ARGUMENT_SIZE_EXCEEDED, +/// E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_EXECUTION_TIME_LIMIT_EXCEEDED, E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_HTTP_REQUEST_ERROR, +/// E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_QUEUE_REQUEST_ERROR, E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_RETURN_SIZE_EXCEEDED, +/// E_PF_INVALID_ENTITY_TYPE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFCloudScriptExecuteFunctionGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFCloudScriptExecuteFunctionAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_ARGUMENT_SIZE_EXCEEDED, +/// E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_EXECUTION_TIME_LIMIT_EXCEEDED, E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_HTTP_REQUEST_ERROR, +/// E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_QUEUE_REQUEST_ERROR, E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_RETURN_SIZE_EXCEEDED, +/// E_PF_INVALID_ENTITY_TYPE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFCloudScriptExecuteFunctionGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCloudScriptExecuteFunctionResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScriptTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScriptTypes.h new file mode 100644 index 0000000..395838c --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFCloudScriptTypes.h @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFCloudScriptExecuteFunctionRequest data model. Executes an Azure Function with the profile of the +/// entity that is defined in the request. +/// +typedef struct PFCloudScriptExecuteFunctionRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The name of the CloudScript function to execute. + /// + _Null_terminated_ const char* functionName; + + /// + /// (Optional) Object that is passed in to the function as the FunctionArgument field of the FunctionExecutionContext + /// data structure. + /// + PFJsonObject functionParameter; + + /// + /// (Optional) Generate a 'entity_executed_cloudscript_function' PlayStream event containing the + /// results of the function execution and other contextual information. This event will show up in + /// the PlayStream debugger console for the player in Game Manager. + /// + _Maybenull_ bool const* generatePlayStreamEvent; + +} PFCloudScriptExecuteFunctionRequest; + +/// +/// PFCloudScriptFunctionExecutionError data model. +/// +typedef struct PFCloudScriptFunctionExecutionError +{ + /// + /// (Optional) Error code, such as CloudScriptAzureFunctionsExecutionTimeLimitExceeded, CloudScriptAzureFunctionsArgumentSizeExceeded, + /// CloudScriptAzureFunctionsReturnSizeExceeded or CloudScriptAzureFunctionsHTTPRequestError. + /// + _Maybenull_ _Null_terminated_ const char* error; + + /// + /// (Optional) Details about the error. + /// + _Maybenull_ _Null_terminated_ const char* message; + + /// + /// (Optional) Point during the execution of the function at which the error occurred, if any. + /// + _Maybenull_ _Null_terminated_ const char* stackTrace; + +} PFCloudScriptFunctionExecutionError; + +/// +/// PFCloudScriptExecuteFunctionResult data model. +/// +typedef struct PFCloudScriptExecuteFunctionResult +{ + /// + /// (Optional) Error from the CloudScript Azure Function. + /// + _Maybenull_ PFCloudScriptFunctionExecutionError const* error; + + /// + /// The amount of time the function took to execute. + /// + int32_t executionTimeMilliseconds; + + /// + /// (Optional) The name of the function that executed. + /// + _Maybenull_ _Null_terminated_ const char* functionName; + + /// + /// (Optional) The object returned from the function, if any. + /// + PFJsonObject functionResult; + + /// + /// (Optional) Flag indicating if the FunctionResult was too large and was subsequently dropped from + /// this event. + /// + _Maybenull_ bool const* functionResultTooLarge; + +} PFCloudScriptExecuteFunctionResult; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFData.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFData.h new file mode 100644 index 0000000..dc8c581 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFData.h @@ -0,0 +1,437 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Abort pending file uploads to an entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Aborts the pending upload of the requested files. See also FileDeleteFilesAsync, FileFinalizeFileUploadsAsync, +/// FileGetFilesAsync, FileInitiateFileUploadsAsync. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFDataAbortFileUploadsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFDataAbortFileUploadsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a AbortFileUploads call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_FILE_NOT_FOUND, +/// E_PF_NO_ENTITY_FILE_OPERATION_PENDING or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFDataAbortFileUploadsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFDataAbortFileUploadsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_FILE_NOT_FOUND, +/// E_PF_NO_ENTITY_FILE_OPERATION_PENDING or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFDataAbortFileUploadsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataAbortFileUploadsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Delete files on an entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Deletes the requested files from the entity's profile. See also FileAbortFileUploadsAsync, FileFinalizeFileUploadsAsync, +/// FileGetFilesAsync, FileInitiateFileUploadsAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFDataDeleteFilesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFDataDeleteFilesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a DeleteFiles call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_FILE_OPERATION_PENDING, +/// E_PF_FILE_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFDataDeleteFilesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFDataDeleteFilesAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_FILE_OPERATION_PENDING, +/// E_PF_FILE_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFDataDeleteFilesGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataDeleteFilesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Finalize file uploads to an entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Finalizes the upload of the requested files. Verifies that the files have been successfully uploaded +/// and moves the file pointers from pending to live. See also FileAbortFileUploadsAsync, FileDeleteFilesAsync, +/// FileGetFilesAsync, FileInitiateFileUploadsAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFDataFinalizeFileUploadsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFDataFinalizeFileUploadsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a FinalizeFileUploads call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_FILE_NOT_FOUND, +/// E_PF_NO_ENTITY_FILE_OPERATION_PENDING or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFDataFinalizeFileUploadsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFDataFinalizeFileUploadsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_FILE_NOT_FOUND, +/// E_PF_NO_ENTITY_FILE_OPERATION_PENDING or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFDataFinalizeFileUploadsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataFinalizeFileUploadsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves file metadata from an entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Returns URLs that may be used to download the files for a profile for a limited length of time. Only +/// returns files that have been successfully uploaded, files that are still pending will either return +/// the old value, if it exists, or nothing. See also FileAbortFileUploadsAsync, FileDeleteFilesAsync, +/// FileFinalizeFileUploadsAsync, FileInitiateFileUploadsAsync. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFDataGetFilesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFDataGetFilesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetFiles call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFDataGetFilesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFDataGetFilesAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFDataGetFilesGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataGetFilesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves objects from an entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Gets JSON objects from an entity profile and returns it. See also ObjectSetObjectsAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFDataGetObjectsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFDataGetObjectsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetObjects call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFDataGetObjectsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFDataGetObjectsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFDataGetObjectsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataGetObjectsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Initiates file uploads to an entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Returns URLs that may be used to upload the files for a profile 5 minutes. After using the upload +/// calls FinalizeFileUploads must be called to move the file status from pending to live. See also FileAbortFileUploadsAsync, +/// FileDeleteFilesAsync, FileFinalizeFileUploadsAsync, FileGetFilesAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFDataInitiateFileUploadsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFDataInitiateFileUploadsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a InitiateFileUploads call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_FILE_OPERATION_PENDING +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFDataInitiateFileUploadsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFDataInitiateFileUploadsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_FILE_OPERATION_PENDING +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFDataInitiateFileUploadsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataInitiateFileUploadsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Sets objects on an entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Sets JSON objects on the requested entity profile. May include a version number to be used to perform +/// optimistic concurrency operations during update. If the current version differs from the version in +/// the request the request will be ignored. If no version is set on the request then the value will always +/// be updated if the values differ. Using the version value does not guarantee a write though, ConcurrentEditError +/// may still occur if multiple clients are attempting to update the same profile. See also ObjectGetObjectsAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFDataSetObjectsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFDataSetObjectsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a SetObjects call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFDataSetObjectsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFDataSetObjectsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFDataSetObjectsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataSetObjectsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFDataTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFDataTypes.h new file mode 100644 index 0000000..1b3872b --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFDataTypes.h @@ -0,0 +1,586 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFDataAbortFileUploadsRequest data model. Aborts the pending upload of the requested files. +/// +typedef struct PFDataAbortFileUploadsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// Names of the files to have their pending uploads aborted. + /// + _Field_size_(fileNamesCount) const char* const* fileNames; + + /// + /// Count of fileNames + /// + uint32_t fileNamesCount; + + /// + /// (Optional) The expected version of the profile, if set and doesn't match the current version + /// of the profile the operation will not be performed. + /// + _Maybenull_ int32_t const* profileVersion; + +} PFDataAbortFileUploadsRequest; + +/// +/// PFDataAbortFileUploadsResponse data model. +/// +typedef struct PFDataAbortFileUploadsResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + +} PFDataAbortFileUploadsResponse; + +/// +/// PFDataDeleteFilesRequest data model. Deletes the requested files from the entity's profile. +/// +typedef struct PFDataDeleteFilesRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// Names of the files to be deleted. + /// + _Field_size_(fileNamesCount) const char* const* fileNames; + + /// + /// Count of fileNames + /// + uint32_t fileNamesCount; + + /// + /// (Optional) The expected version of the profile, if set and doesn't match the current version + /// of the profile the operation will not be performed. + /// + _Maybenull_ int32_t const* profileVersion; + +} PFDataDeleteFilesRequest; + +/// +/// PFDataDeleteFilesResponse data model. +/// +typedef struct PFDataDeleteFilesResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + +} PFDataDeleteFilesResponse; + +/// +/// PFDataFinalizeFileUploadsRequest data model. Finalizes the upload of the requested files. Verifies +/// that the files have been successfully uploaded and moves the file pointers from pending to live. +/// +typedef struct PFDataFinalizeFileUploadsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// Names of the files to be finalized. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + _Field_size_(fileNamesCount) const char* const* fileNames; + + /// + /// Count of fileNames + /// + uint32_t fileNamesCount; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + +} PFDataFinalizeFileUploadsRequest; + +/// +/// PFDataGetFileMetadata data model. +/// +typedef struct PFDataGetFileMetadata +{ + /// + /// (Optional) Checksum value for the file, can be used to check if the file on the server has changed. + /// + _Maybenull_ _Null_terminated_ const char* checksum; + + /// + /// (Optional) Download URL where the file can be retrieved. + /// + _Maybenull_ _Null_terminated_ const char* downloadUrl; + + /// + /// (Optional) Name of the file. + /// + _Maybenull_ _Null_terminated_ const char* fileName; + + /// + /// Last UTC time the file was modified. + /// + time_t lastModified; + + /// + /// Storage service's reported byte count. + /// + int32_t size; + +} PFDataGetFileMetadata; + +/// +/// PFDataFinalizeFileUploadsResponse data model. +/// +typedef struct PFDataFinalizeFileUploadsResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) Collection of metadata for the entity's files. + /// + _Maybenull_ _Field_size_(metadataCount) struct PFDataGetFileMetadataDictionaryEntry const* metadata; + + /// + /// Count of metadata + /// + uint32_t metadataCount; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + +} PFDataFinalizeFileUploadsResponse; + +/// +/// PFDataGetFilesRequest data model. Returns URLs that may be used to download the files for a profile +/// for a limited length of time. Only returns files that have been successfully uploaded, files that +/// are still pending will either return the old value, if it exists, or nothing. +/// +typedef struct PFDataGetFilesRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + +} PFDataGetFilesRequest; + +/// +/// PFDataGetFilesResponse data model. +/// +typedef struct PFDataGetFilesResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) Collection of metadata for the entity's files. + /// + _Maybenull_ _Field_size_(metadataCount) struct PFDataGetFileMetadataDictionaryEntry const* metadata; + + /// + /// Count of metadata + /// + uint32_t metadataCount; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + +} PFDataGetFilesResponse; + +/// +/// PFDataGetObjectsRequest data model. Gets JSON objects from an entity profile and returns it. . +/// +typedef struct PFDataGetObjectsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// (Optional) Determines whether the object will be returned as an escaped JSON string or as a un-escaped + /// JSON object. Default is JSON object. + /// + _Maybenull_ bool const* escapeObject; + +} PFDataGetObjectsRequest; + +/// +/// PFDataObjectResult data model. +/// +typedef struct PFDataObjectResult +{ + /// + /// (Optional) Un-escaped JSON object, if EscapeObject false or default. + /// + PFJsonObject dataObject; + + /// + /// (Optional) Escaped string JSON body of the object, if EscapeObject is true. + /// + _Maybenull_ _Null_terminated_ const char* escapedDataObject; + + /// + /// (Optional) Name of the object. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + _Maybenull_ _Null_terminated_ const char* objectName; + +} PFDataObjectResult; + +/// +/// PFDataGetObjectsResponse data model. +/// +typedef struct PFDataGetObjectsResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) Requested objects that the calling entity has access to. + /// + _Maybenull_ _Field_size_(objectsCount) struct PFDataObjectResultDictionaryEntry const* objects; + + /// + /// Count of objects + /// + uint32_t objectsCount; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + +} PFDataGetObjectsResponse; + +/// +/// PFDataInitiateFileUploadsRequest data model. Returns URLs that may be used to upload the files for +/// a profile 5 minutes. After using the upload calls FinalizeFileUploads must be called to move the file +/// status from pending to live. +/// +typedef struct PFDataInitiateFileUploadsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// Names of the files to be set. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + _Field_size_(fileNamesCount) const char* const* fileNames; + + /// + /// Count of fileNames + /// + uint32_t fileNamesCount; + + /// + /// (Optional) The expected version of the profile, if set and doesn't match the current version + /// of the profile the operation will not be performed. + /// + _Maybenull_ int32_t const* profileVersion; + +} PFDataInitiateFileUploadsRequest; + +/// +/// PFDataInitiateFileUploadMetadata data model. +/// +typedef struct PFDataInitiateFileUploadMetadata +{ + /// + /// (Optional) Name of the file. + /// + _Maybenull_ _Null_terminated_ const char* fileName; + + /// + /// (Optional) Location the data should be sent to via an HTTP PUT operation. + /// + _Maybenull_ _Null_terminated_ const char* uploadUrl; + +} PFDataInitiateFileUploadMetadata; + +/// +/// PFDataInitiateFileUploadsResponse data model. +/// +typedef struct PFDataInitiateFileUploadsResponse +{ + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + + /// + /// (Optional) Collection of file names and upload urls. + /// + _Maybenull_ _Field_size_(uploadDetailsCount) PFDataInitiateFileUploadMetadata const* const* uploadDetails; + + /// + /// Count of uploadDetails + /// + uint32_t uploadDetailsCount; + +} PFDataInitiateFileUploadsResponse; + +/// +/// PFDataSetObject data model. +/// +typedef struct PFDataSetObject +{ + /// + /// (Optional) Body of the object to be saved. If empty and DeleteObject is true object will be deleted + /// if it exists, or no operation will occur if it does not exist. Only one of Object or EscapedDataObject + /// fields may be used. + /// + PFJsonObject dataObject; + + /// + /// (Optional) Flag to indicate that this object should be deleted. Both DataObject and EscapedDataObject + /// must not be set as well. + /// + _Maybenull_ bool const* deleteObject; + + /// + /// (Optional) Body of the object to be saved as an escaped JSON string. If empty and DeleteObject + /// is true object will be deleted if it exists, or no operation will occur if it does not exist. + /// Only one of DataObject or EscapedDataObject fields may be used. + /// + _Maybenull_ _Null_terminated_ const char* escapedDataObject; + + /// + /// Name of object. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + _Null_terminated_ const char* objectName; + +} PFDataSetObject; + +/// +/// PFDataSetObjectsRequest data model. Sets JSON objects on the requested entity profile. May include +/// a version number to be used to perform optimistic concurrency operations during update. If the current +/// version differs from the version in the request the request will be ignored. If no version is set +/// on the request then the value will always be updated if the values differ. Using the version value +/// does not guarantee a write though, ConcurrentEditError may still occur if multiple clients are attempting +/// to update the same profile. . +/// +typedef struct PFDataSetObjectsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// (Optional) Optional field used for concurrency control. By specifying the previously returned + /// value of ProfileVersion from GetProfile API, you can ensure that the object set will only be performed + /// if the profile has not been updated by any other clients since the version you last loaded. + /// + _Maybenull_ int32_t const* expectedProfileVersion; + + /// + /// Collection of objects to set on the profile. + /// + _Field_size_(objectsCount) PFDataSetObject const* const* objects; + + /// + /// Count of objects + /// + uint32_t objectsCount; + +} PFDataSetObjectsRequest; + +/// +/// PFDataSetObjectInfo data model. +/// +typedef struct PFDataSetObjectInfo +{ + /// + /// (Optional) Name of the object. + /// + _Maybenull_ _Null_terminated_ const char* objectName; + + /// + /// (Optional) Optional reason to explain why the operation was the result that it was. + /// + _Maybenull_ _Null_terminated_ const char* operationReason; + + /// + /// (Optional) Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + _Maybenull_ PFOperationTypes const* setResult; + +} PFDataSetObjectInfo; + +/// +/// PFDataSetObjectsResponse data model. +/// +typedef struct PFDataSetObjectsResponse +{ + /// + /// New version of the entity profile. + /// + int32_t profileVersion; + + /// + /// (Optional) New version of the entity profile. + /// + _Maybenull_ _Field_size_(setResultsCount) PFDataSetObjectInfo const* const* setResults; + + /// + /// Count of setResults + /// + uint32_t setResultsCount; + +} PFDataSetObjectsResponse; + +/// +/// Dictionary entry for an associative array with PFDataGetFileMetadata values. +/// +typedef struct PFDataGetFileMetadataDictionaryEntry +{ + _Null_terminated_ const char* key; + PFDataGetFileMetadata const* value; +} PFDataGetFileMetadataDictionaryEntry; + +/// +/// Dictionary entry for an associative array with PFDataObjectResult values. +/// +typedef struct PFDataObjectResultDictionaryEntry +{ + _Null_terminated_ const char* key; + PFDataObjectResult const* value; +} PFDataObjectResultDictionaryEntry; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentation.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentation.h new file mode 100644 index 0000000..17b1e86 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentation.h @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Gets the treatment assignments for a player for every running experiment in the title. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFExperimentationGetTreatmentAssignmentAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFExperimentationGetTreatmentAssignmentRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetTreatmentAssignment call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EXPERIMENTATION_CLIENT_TIMEOUT, +/// E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_DISABLED, E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_FAILED, +/// E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_ENTITY_TYPE or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFExperimentationGetTreatmentAssignmentGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFExperimentationGetTreatmentAssignmentAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EXPERIMENTATION_CLIENT_TIMEOUT, +/// E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_DISABLED, E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_FAILED, +/// E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE, E_PF_INVALID_ENTITY_TYPE or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFExperimentationGetTreatmentAssignmentGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFExperimentationGetTreatmentAssignmentResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentationTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentationTypes.h new file mode 100644 index 0000000..8f0f662 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFExperimentationTypes.h @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFExperimentationGetTreatmentAssignmentRequest data model. Given a title player or a title entity +/// token, returns the treatment variants and variables assigned to the entity across all running experiments. +/// +typedef struct PFExperimentationGetTreatmentAssignmentRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFExperimentationGetTreatmentAssignmentRequest; + +/// +/// PFExperimentationGetTreatmentAssignmentResult data model. +/// +typedef struct PFExperimentationGetTreatmentAssignmentResult +{ + /// + /// (Optional) Treatment assignment for the entity. + /// + _Maybenull_ PFTreatmentAssignment const* treatmentAssignment; + +} PFExperimentationGetTreatmentAssignmentResult; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFFriends.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFFriends.h new file mode 100644 index 0000000..93ad3af --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFFriends.h @@ -0,0 +1,296 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Adds the PlayFab user, based upon a match against a supplied unique identifier, to the friend list +/// of the local user. At least one of FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName +/// should be initialized. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientGetFriendsListAsync, ClientSetFriendTagsAsync. +/// +/// When the asynchronous task is complete, call to get +/// the result. +/// +PF_API PFFriendsClientAddFriendAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFFriendsClientAddFriendRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFFriendsClientAddFriendAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFFriendsAddFriendResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_USERS_ALREADY_FRIENDS +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFFriendsClientAddFriendGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFFriendsAddFriendResult* result +) noexcept; + +/// +/// Retrieves the current friend list for the local user, constrained to users who have PlayFab accounts. +/// Friends from linked accounts (Facebook, Steam) are also included. You may optionally exclude some +/// linked services' friends. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientAddFriendAsync, ClientGetPlayerProfileAsync, ClientRemoveFriendAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFFriendsClientGetFriendsListAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFFriendsClientGetFriendsListRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetFriendsList call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_FOUND, +/// E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_FACEBOOK_API_ERROR, E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_SERVICE_TOO_MANY_REQUESTS, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFFriendsClientGetFriendsListGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFFriendsClientGetFriendsListAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_FOUND, +/// E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_FACEBOOK_API_ERROR, E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_SERVICE_TOO_MANY_REQUESTS, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFFriendsClientGetFriendsListGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFFriendsGetFriendsListResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Removes a specified user from the friend list of the local user +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// See also ClientAddFriendAsync, ClientSetFriendTagsAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFFriendsClientRemoveFriendAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFFriendsClientRemoveFriendRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Updates the tag list for a specified user in the friend list of the local user +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This operation is not additive. It will completely replace the tag list for the specified user. Please +/// note that only users in the PlayFab friends list can be assigned tags. Attempting to set a tag on +/// a friend only included in the friends list from a social site integration (such as Facebook or Steam) +/// will return the AccountNotFound error. See also ClientAddFriendAsync, ClientRemoveFriendAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFFriendsClientSetFriendTagsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFFriendsClientSetFriendTagsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +#if 0 +/// +/// Adds the Friend user to the friendlist of the user with PlayFabId. At least one of FriendPlayFabId,FriendUsername,FriendEmail, +/// or FriendTitleDisplayName should be initialized. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerGetFriendsListAsync, ServerRemoveFriendAsync, ServerSetFriendTagsAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_USERS_ALREADY_FRIENDS or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFFriendsServerAddFriendAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFFriendsServerAddFriendRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the current friends for the user with PlayFabId, constrained to users who have PlayFab +/// accounts. Friends from linked accounts (Facebook, Steam) are also included. You may optionally exclude +/// some linked services' friends. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerAddFriendAsync, ServerGetPlayerProfileAsync, ServerRemoveFriendAsync, ServerSetFriendTagsAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFFriendsServerGetFriendsListAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFFriendsServerGetFriendsListRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetFriendsList call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_FOUND, +/// E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_FACEBOOK_API_ERROR, E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_SERVICE_TOO_MANY_REQUESTS, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFFriendsServerGetFriendsListGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFFriendsServerGetFriendsListAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_FOUND, +/// E_PF_EXPIRED_XBOX_LIVE_TOKEN, E_PF_FACEBOOK_API_ERROR, E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_XBOX_INACCESSIBLE, +/// E_PF_XBOX_SERVICE_TOO_MANY_REQUESTS, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFFriendsServerGetFriendsListGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFFriendsGetFriendsListResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Removes the specified friend from the the user's friend list +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerAddFriendAsync, ServerSetFriendTagsAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ACCOUNT_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFFriendsServerRemoveFriendAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFFriendsServerRemoveFriendRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Updates the tag list for a specified user in the friend list of another user +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This operation is not additive. It will completely replace the tag list for the specified user. Please +/// note that only users in the PlayFab friends list can be assigned tags. Attempting to set a tag on +/// a friend only included in the friends list from a social site integration (such as Facebook or Steam) +/// will return the AccountNotFound error. See also ServerAddFriendAsync, ServerGetFriendsListAsync, ServerRemoveFriendAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFFriendsServerSetFriendTagsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFFriendsServerSetFriendTagsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFFriendsTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFFriendsTypes.h new file mode 100644 index 0000000..d383707 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFFriendsTypes.h @@ -0,0 +1,365 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// ExternalFriendSources enum. +/// +enum class PFFriendsExternalFriendSources : uint32_t +{ + None, + Steam, + Facebook, + Xbox, + Psn, + All +}; + +/// +/// PFFriendsClientAddFriendRequest data model. +/// +typedef struct PFFriendsClientAddFriendRequest +{ + /// + /// (Optional) Email address of the user to attempt to add to the local user's friend list. + /// + _Maybenull_ _Null_terminated_ const char* friendEmail; + + /// + /// (Optional) PlayFab identifier of the user to attempt to add to the local user's friend list. + /// + _Maybenull_ _Null_terminated_ const char* friendPlayFabId; + + /// + /// (Optional) Title-specific display name of the user to attempt to add to the local user's friend + /// list. + /// + _Maybenull_ _Null_terminated_ const char* friendTitleDisplayName; + + /// + /// (Optional) PlayFab username of the user to attempt to add to the local user's friend list. + /// + _Maybenull_ _Null_terminated_ const char* friendUsername; + +} PFFriendsClientAddFriendRequest; + +/// +/// PFFriendsAddFriendResult data model. +/// +typedef struct PFFriendsAddFriendResult +{ + /// + /// True if the friend request was processed successfully. + /// + bool created; + +} PFFriendsAddFriendResult; + +/// +/// PFFriendsClientGetFriendsListRequest data model. +/// +typedef struct PFFriendsClientGetFriendsListRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Indicates which other platforms' friends should be included in the response. In HTTP, + /// it is represented as a comma-separated list of platforms. + /// + _Maybenull_ PFFriendsExternalFriendSources const* externalPlatformFriends; + + /// + /// (Optional) If non-null, this determines which properties of the resulting player profiles to + /// return. For API calls from the client, only the allowed client profile properties for the title + /// may be requested. These allowed properties are configured in the Game Manager "Client Profile + /// Options" tab in the "Settings" section. + /// + _Maybenull_ PFPlayerProfileViewConstraints const* profileConstraints; + +#if HC_PLATFORM == HC_PLATFORM_GDK + /// + /// (Optional) XUserHandle if Xbox friends should be included. + /// + XUserHandle user; +#else + /// + /// (Optional) Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + _Maybenull_ _Null_terminated_ const char* xboxToken; +#endif + +} PFFriendsClientGetFriendsListRequest; + +/// +/// PFFriendsFriendInfo data model. +/// +typedef struct PFFriendsFriendInfo +{ + /// + /// (Optional) Available Facebook information (if the user and PlayFab friend are also connected + /// in Facebook). + /// + _Maybenull_ PFUserFacebookInfo const* facebookInfo; + + /// + /// (Optional) PlayFab unique identifier for this friend. + /// + _Maybenull_ _Null_terminated_ const char* friendPlayFabId; + + /// + /// (Optional) Available Game Center information (if the user and PlayFab friend are also connected + /// in Game Center). + /// + _Maybenull_ PFUserGameCenterInfo const* gameCenterInfo; + + /// + /// (Optional) The profile of the user, if requested. + /// + _Maybenull_ PFPlayerProfileModel const* profile; + + /// + /// (Optional) Available PlayStation :tm: Network information, if the user and PlayFab friend are + /// both connected to PlayStation :tm: Network. + /// + _Maybenull_ PFUserPsnInfo const* PSNInfo; + + /// + /// (Optional) Available Steam information (if the user and PlayFab friend are also connected in + /// Steam). + /// + _Maybenull_ PFUserSteamInfo const* steamInfo; + + /// + /// (Optional) Tags which have been associated with this friend. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + + /// + /// (Optional) Title-specific display name for this friend. + /// + _Maybenull_ _Null_terminated_ const char* titleDisplayName; + + /// + /// (Optional) PlayFab unique username for this friend. + /// + _Maybenull_ _Null_terminated_ const char* username; + + /// + /// (Optional) Available Xbox information, if the user and PlayFab friend are both connected to Xbox + /// Live. + /// + _Maybenull_ PFUserXboxInfo const* xboxInfo; + +} PFFriendsFriendInfo; + +/// +/// PFFriendsGetFriendsListResult data model. If any additional services are queried for the user's friends, +/// those friends who also have a PlayFab account registered for the title will be returned in the results. +/// For Facebook, user has to have logged into the title's Facebook app recently, and only friends who +/// also plays this game will be included. For Xbox Live, user has to have logged into the Xbox Live recently, +/// and only friends who also play this game will be included. +/// +typedef struct PFFriendsGetFriendsListResult +{ + /// + /// (Optional) Array of friends found. + /// + _Maybenull_ _Field_size_(friendsCount) PFFriendsFriendInfo const* const* friends; + + /// + /// Count of friends + /// + uint32_t friendsCount; + +} PFFriendsGetFriendsListResult; + +/// +/// PFFriendsClientRemoveFriendRequest data model. +/// +typedef struct PFFriendsClientRemoveFriendRequest +{ + /// + /// PlayFab identifier of the friend account which is to be removed. + /// + _Null_terminated_ const char* friendPlayFabId; + +} PFFriendsClientRemoveFriendRequest; + +/// +/// PFFriendsClientSetFriendTagsRequest data model. This operation is not additive. It will completely +/// replace the tag list for the specified user. Please note that only users in the PlayFab friends list +/// can be assigned tags. Attempting to set a tag on a friend only included in the friends list from a +/// social site integration (such as Facebook or Steam) will return the AccountNotFound error. +/// +typedef struct PFFriendsClientSetFriendTagsRequest +{ + /// + /// PlayFab identifier of the friend account to which the tag(s) should be applied. + /// + _Null_terminated_ const char* friendPlayFabId; + + /// + /// Array of tags to set on the friend account. + /// + _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + +} PFFriendsClientSetFriendTagsRequest; + +/// +/// PFFriendsServerAddFriendRequest data model. +/// +typedef struct PFFriendsServerAddFriendRequest +{ + /// + /// (Optional) Email address of the user being added. + /// + _Maybenull_ _Null_terminated_ const char* friendEmail; + + /// + /// (Optional) The PlayFab identifier of the user being added. + /// + _Maybenull_ _Null_terminated_ const char* friendPlayFabId; + + /// + /// (Optional) Title-specific display name of the user to being added. + /// + _Maybenull_ _Null_terminated_ const char* friendTitleDisplayName; + + /// + /// (Optional) The PlayFab username of the user being added. + /// + _Maybenull_ _Null_terminated_ const char* friendUsername; + + /// + /// PlayFab identifier of the player to add a new friend. + /// + _Null_terminated_ const char* playFabId; + +} PFFriendsServerAddFriendRequest; + +/// +/// PFFriendsServerGetFriendsListRequest data model. +/// +typedef struct PFFriendsServerGetFriendsListRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Indicates which other platforms' friends should be included in the response. In HTTP, + /// it is represented as a comma-separated list of platforms. + /// + _Maybenull_ PFFriendsExternalFriendSources const* externalPlatformFriends; + + /// + /// PlayFab identifier of the player whose friend list to get. + /// + _Null_terminated_ const char* playFabId; + + /// + /// (Optional) If non-null, this determines which properties of the resulting player profiles to + /// return. For API calls from the client, only the allowed client profile properties for the title + /// may be requested. These allowed properties are configured in the Game Manager "Client Profile + /// Options" tab in the "Settings" section. + /// + _Maybenull_ PFPlayerProfileViewConstraints const* profileConstraints; + + /// + /// (Optional) Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + _Maybenull_ _Null_terminated_ const char* xboxToken; + +} PFFriendsServerGetFriendsListRequest; + +/// +/// PFFriendsServerRemoveFriendRequest data model. +/// +typedef struct PFFriendsServerRemoveFriendRequest +{ + /// + /// PlayFab identifier of the friend account which is to be removed. + /// + _Null_terminated_ const char* friendPlayFabId; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFFriendsServerRemoveFriendRequest; + +/// +/// PFFriendsServerSetFriendTagsRequest data model. This operation is not additive. It will completely +/// replace the tag list for the specified user. Please note that only users in the PlayFab friends list +/// can be assigned tags. Attempting to set a tag on a friend only included in the friends list from a +/// social site integration (such as Facebook or Steam) will return the AccountNotFound error. +/// +typedef struct PFFriendsServerSetFriendTagsRequest +{ + /// + /// PlayFab identifier of the friend account to which the tag(s) should be applied. + /// + _Null_terminated_ const char* friendPlayFabId; + + /// + /// PlayFab identifier of the player whose friend is to be updated. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Array of tags to set on the friend account. + /// + _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + +} PFFriendsServerSetFriendTagsRequest; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFGroups.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFGroups.h new file mode 100644 index 0000000..2567f00 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFGroups.h @@ -0,0 +1,1104 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Accepts an outstanding invitation to to join a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Accepts an outstanding invitation to to join a group if the invited entity is not blocked by the +/// group. Nothing is returned in the case of success. See also GroupApplyToGroupAsync, GroupListGroupApplicationsAsync, +/// GroupRemoveGroupApplicationAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ENTITY_BLOCKED_BY_GROUP, E_PF_ENTITY_IS_ALREADY_MEMBER, E_PF_GROUP_APPLICATION_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFGroupsAcceptGroupApplicationAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsAcceptGroupApplicationRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Accepts an invitation to join a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Accepts an outstanding invitation to join the group if the invited entity is not blocked by the group. +/// Only the invited entity or a parent in its chain (e.g. title) may accept the invitation on the invited +/// entity's behalf. Nothing is returned in the case of success. See also GroupInviteToGroupAsync, GroupListGroupInvitationsAsync, +/// GroupListMembershipOpportunitiesAsync, GroupRemoveGroupInvitationAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ENTITY_BLOCKED_BY_GROUP, E_PF_ENTITY_IS_ALREADY_MEMBER, E_PF_GROUP_INVITATION_NOT_FOUND +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFGroupsAcceptGroupInvitationAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsAcceptGroupInvitationRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Adds members to a group or role. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Adds members to a group or role. Existing members of the group will added to roles within the group, +/// but if the user is not already a member of the group, only title claimants may add them to the group, +/// and others must use the group application or invite system to add new members to a group. Returns +/// nothing if successful. See also GroupApplyToGroupAsync, GroupInviteToGroupAsync, GroupListGroupMembersAsync, +/// GroupRemoveMembersAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ROLE_DOES_NOT_EXIST or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsAddMembersAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsAddMembersRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Applies to join a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Creates an application to join a group. Calling this while a group application already exists will +/// return the same application instead of an error and will not refresh the time before the application +/// expires. By default, if the entity has an invitation to join the group outstanding, this will accept +/// the invitation to join the group instead and return an error indicating such, rather than creating +/// a duplicate application to join that will need to be cleaned up later. Returns information about the +/// application or an error indicating an invitation was accepted instead. See also GroupAcceptGroupApplicationAsync, +/// GroupListGroupApplicationsAsync, GroupRemoveGroupApplicationAsync. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFGroupsApplyToGroupAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsApplyToGroupRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ApplyToGroup call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_BLOCKED_BY_GROUP, +/// E_PF_ENTITY_IS_ALREADY_MEMBER, E_PF_OUTSTANDING_INVITATION_ACCEPTED_INSTEAD or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsApplyToGroupGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsApplyToGroupAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_BLOCKED_BY_GROUP, +/// E_PF_ENTITY_IS_ALREADY_MEMBER, E_PF_OUTSTANDING_INVITATION_ACCEPTED_INSTEAD or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsApplyToGroupGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsApplyToGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Blocks a list of entities from joining a group. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Blocks a list of entities from joining a group. Blocked entities may not create new applications +/// to join, be invited to join, accept an invitation, or have an application accepted. Failure due to +/// being blocked does not clean up existing applications or invitations to the group. No data is returned +/// in the case of success. See also GroupListGroupBlocksAsync, GroupUnblockEntityAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFGroupsBlockEntityAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsBlockEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Changes the role membership of a list of entities from one role to another. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Changes the role membership of a list of entities from one role to another in in a single operation. +/// The destination role must already exist. This is equivalent to adding the entities to the destination +/// role and removing from the origin role. Returns nothing if successful. See also GroupAddMembersAsync, +/// GroupCreateRoleAsync, GroupRemoveMembersAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ROLE_DOES_NOT_EXIST or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsChangeMemberRoleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsChangeMemberRoleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Creates a new group. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Creates a new group, as well as administration and member roles, based off of a title's group template. +/// Returns information about the group that was created. See also GroupAddMembersAsync, GroupApplyToGroupAsync, +/// GroupDeleteGroupAsync, GroupInviteToGroupAsync, GroupListGroupMembersAsync, GroupRemoveMembersAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFGroupsCreateGroupAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsCreateGroupRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a CreateGroup call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_GROUP_NAME_NOT_AVAILABLE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFGroupsCreateGroupGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsCreateGroupAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_GROUP_NAME_NOT_AVAILABLE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsCreateGroupGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsCreateGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Creates a new group role. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Creates a new role within an existing group, with no members. Both the role ID and role name must +/// be unique within the group, but the name can be the same as the ID. The role ID is set at creation +/// and cannot be changed. Returns information about the role that was created. See also GroupDeleteRoleAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFGroupsCreateRoleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsCreateGroupRoleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a CreateRole call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DUPLICATE_ROLE_ID, +/// E_PF_ROLE_NAME_NOT_AVAILABLE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFGroupsCreateRoleGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsCreateRoleAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DUPLICATE_ROLE_ID, +/// E_PF_ROLE_NAME_NOT_AVAILABLE or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsCreateRoleGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsCreateGroupRoleResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Deletes a group and all roles, invitations, join requests, and blocks associated with it. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Deletes a group and all roles, invitations, join requests, and blocks associated with it. Permission +/// to delete is only required the group itself to execute this action. The group and data cannot be cannot +/// be recovered once removed, but any abuse reports about the group will remain. No data is returned +/// in the case of success. See also GroupCreateGroupAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFGroupsDeleteGroupAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsDeleteGroupRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Deletes an existing role in a group. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Returns information about the role See also GroupCreateRoleAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ROLE_DOES_NOT_EXIST, E_PF_ROLE_IS_GROUP_ADMIN, E_PF_ROLE_IS_GROUP_DEFAULT_MEMBER +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFGroupsDeleteRoleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsDeleteRoleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets information about a group and its roles +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Returns the ID, name, role list and other non-membership related information about a group. See also +/// GroupUpdateGroupAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFGroupsGetGroupAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsGetGroupRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetGroup call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsGetGroupGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsGetGroupAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsGetGroupGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsGetGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Invites a player to join a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Invites a player to join a group, if they are not blocked by the group. An optional role can be provided +/// to automatically assign the player to the role if they accept the invitation. By default, if the entity +/// has an application to the group outstanding, this will accept the application instead and return an +/// error indicating such, rather than creating a duplicate invitation to join that will need to be cleaned +/// up later. Returns information about the new invitation or an error indicating an existing application +/// to join was accepted. See also GroupAcceptGroupInvitationAsync, GroupListGroupInvitationsAsync, GroupListMembershipOpportunitiesAsync, +/// GroupRemoveGroupInvitationAsync. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFGroupsInviteToGroupAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsInviteToGroupRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a InviteToGroup call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_BLOCKED_BY_GROUP, +/// E_PF_ENTITY_IS_ALREADY_MEMBER, E_PF_OUTSTANDING_APPLICATION_ACCEPTED_INSTEAD, E_PF_ROLE_DOES_NOT_EXIST +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFGroupsInviteToGroupGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsInviteToGroupAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ENTITY_BLOCKED_BY_GROUP, +/// E_PF_ENTITY_IS_ALREADY_MEMBER, E_PF_OUTSTANDING_APPLICATION_ACCEPTED_INSTEAD, E_PF_ROLE_DOES_NOT_EXIST +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsInviteToGroupGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsInviteToGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Checks to see if an entity is a member of a group or role within the group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Checks to see if an entity is a member of a group or role within the group. A result indicating if +/// the entity is a member of the group is returned, or a permission error if the caller does not have +/// permission to read the group's member list. See also GroupGetGroupAsync. +/// +/// When the asynchronous task is complete, call to get the result. +/// +PF_API PFGroupsIsMemberAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsIsMemberRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFGroupsIsMemberAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFGroupsIsMemberResponse object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ROLE_DOES_NOT_EXIST +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFGroupsIsMemberGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFGroupsIsMemberResponse* result +) noexcept; + +/// +/// Lists all outstanding requests to join a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Lists all outstanding requests to join a group. Returns a list of all requests to join, as well as +/// when the request will expire. To get the group applications for a specific entity, use ListMembershipOpportunities. +/// See also GroupAcceptGroupApplicationAsync, GroupApplyToGroupAsync, GroupRemoveGroupApplicationAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFGroupsListGroupApplicationsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsListGroupApplicationsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListGroupApplications call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsListGroupApplicationsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsListGroupApplicationsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsListGroupApplicationsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupApplicationsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Lists all entities blocked from joining a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Lists all entities blocked from joining a group. A list of blocked entities is returned See also +/// GroupBlockEntityAsync, GroupUnblockEntityAsync. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFGroupsListGroupBlocksAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsListGroupBlocksRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListGroupBlocks call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsListGroupBlocksGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsListGroupBlocksAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsListGroupBlocksGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupBlocksResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Lists all outstanding invitations for a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Lists all outstanding invitations for a group. Returns a list of entities that have been invited, +/// as well as when the invitation will expire. To get the group invitations for a specific entity, use +/// ListMembershipOpportunities. See also GroupAcceptGroupInvitationAsync, GroupInviteToGroupAsync, GroupListMembershipOpportunitiesAsync, +/// GroupRemoveGroupInvitationAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFGroupsListGroupInvitationsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsListGroupInvitationsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListGroupInvitations call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsListGroupInvitationsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsListGroupInvitationsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsListGroupInvitationsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupInvitationsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Lists all members for a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Gets a list of members and the roles they belong to within the group. If the caller does not have +/// permission to view the role, and the member is in no other role, the member is not displayed. Returns +/// a list of entities that are members of the group. See also GroupListMembershipAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFGroupsListGroupMembersAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsListGroupMembersRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListGroupMembers call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsListGroupMembersGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsListGroupMembersAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsListGroupMembersGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupMembersResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Lists all groups and roles for an entity +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Lists the groups and roles that an entity is a part of, checking to see if group and role metadata +/// and memberships should be visible to the caller. If the entity is not in any roles that are visible +/// to the caller, the group is not returned in the results, even if the caller otherwise has permission +/// to see that the entity is a member of that group. See also GroupListGroupMembersAsync, GroupListMembershipOpportunitiesAsync. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFGroupsListMembershipAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsListMembershipRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListMembership call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsListMembershipGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsListMembershipAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsListMembershipGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListMembershipResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Lists all outstanding invitations and group applications for an entity +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Lists all outstanding group applications and invitations for an entity. Anyone may call this for +/// any entity, but data will only be returned for the entity or a parent of that entity. To list invitations +/// or applications for a group to check if a player is trying to join, use ListGroupInvitations and ListGroupApplications. +/// See also GroupListGroupApplicationsAsync, GroupListGroupInvitationsAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFGroupsListMembershipOpportunitiesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsListMembershipOpportunitiesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListMembershipOpportunities call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsListMembershipOpportunitiesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsListMembershipOpportunitiesAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsListMembershipOpportunitiesGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListMembershipOpportunitiesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Removes an application to join a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Removes an existing application to join the group. This is used for both rejection of an application +/// as well as withdrawing an application. The applying entity or a parent in its chain (e.g. title) may +/// withdraw the application, and any caller with appropriate access in the group may reject an application. +/// No data is returned in the case of success. See also GroupAcceptGroupApplicationAsync, GroupApplyToGroupAsync, +/// GroupListGroupApplicationsAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_GROUP_APPLICATION_NOT_FOUND or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsRemoveGroupApplicationAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsRemoveGroupApplicationRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Removes an invitation join a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Removes an existing invitation to join the group. This is used for both rejection of an invitation +/// as well as rescinding an invitation. The invited entity or a parent in its chain (e.g. title) may +/// reject the invitation by calling this method, and any caller with appropriate access in the group +/// may rescind an invitation. No data is returned in the case of success. See also GroupAcceptGroupInvitationAsync, +/// GroupInviteToGroupAsync, GroupListGroupInvitationsAsync, GroupListMembershipOpportunitiesAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_GROUP_INVITATION_NOT_FOUND or any of the global PlayFab Service errors. +/// See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsRemoveGroupInvitationAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsRemoveGroupInvitationRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Removes members from a group. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Removes members from a group. A member can always remove themselves from a group, regardless of permissions. +/// Returns nothing if successful. See also GroupAddMembersAsync, GroupListGroupMembersAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_ROLE_DOES_NOT_EXIST or any of the global PlayFab Service errors. See +/// doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFGroupsRemoveMembersAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsRemoveMembersRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Unblocks a list of entities from joining a group +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Unblocks a list of entities from joining a group. No data is returned in the case of success. See +/// also GroupBlockEntityAsync, GroupListGroupBlocksAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFGroupsUnblockEntityAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsUnblockEntityRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Updates non-membership data about a group. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Updates data about a group, such as the name or default member role. Returns information about whether +/// the update was successful. Only title claimants may modify the administration role for a group. See +/// also GroupCreateGroupAsync, GroupDeleteGroupAsync, GroupGetGroupAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFGroupsUpdateGroupAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsUpdateGroupRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a UpdateGroup call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_GROUP_NAME_NOT_AVAILABLE, +/// E_PF_ROLE_DOES_NOT_EXIST or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFGroupsUpdateGroupGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsUpdateGroupAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_GROUP_NAME_NOT_AVAILABLE, +/// E_PF_ROLE_DOES_NOT_EXIST or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsUpdateGroupGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsUpdateGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Updates metadata about a role. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Updates the role name. Returns information about whether the update was successful. See also GroupCreateRoleAsync, +/// GroupDeleteRoleAsync. +/// +/// When the asynchronous task is complete, call and to get the result. +/// +PF_API PFGroupsUpdateRoleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFGroupsUpdateGroupRoleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a UpdateRole call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ROLE_DOES_NOT_EXIST +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFGroupsUpdateRoleGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFGroupsUpdateRoleAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ROLE_DOES_NOT_EXIST +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFGroupsUpdateRoleGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsUpdateGroupRoleResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFGroupsTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFGroupsTypes.h new file mode 100644 index 0000000..6ad1a00 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFGroupsTypes.h @@ -0,0 +1,1366 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFGroupsAcceptGroupApplicationRequest data model. Accepts an outstanding invitation to to join a +/// group if the invited entity is not blocked by the group. Nothing is returned in the case of success. +/// +typedef struct PFGroupsAcceptGroupApplicationRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Type of the entity to accept as. Must be the same entity as the claimant or an entity that is + /// a child of the claimant entity. + /// + PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsAcceptGroupApplicationRequest; + +/// +/// PFGroupsAcceptGroupInvitationRequest data model. Accepts an outstanding invitation to join the group +/// if the invited entity is not blocked by the group. Only the invited entity or a parent in its chain +/// (e.g. title) may accept the invitation on the invited entity's behalf. Nothing is returned in the +/// case of success. +/// +typedef struct PFGroupsAcceptGroupInvitationRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsAcceptGroupInvitationRequest; + +/// +/// PFGroupsAddMembersRequest data model. Adds members to a group or role. Existing members of the group +/// will added to roles within the group, but if the user is not already a member of the group, only title +/// claimants may add them to the group, and others must use the group application or invite system to +/// add new members to a group. Returns nothing if successful. +/// +typedef struct PFGroupsAddMembersRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// List of entities to add to the group. Only entities of type title_player_account and character + /// may be added to groups. + /// + _Field_size_(membersCount) PFEntityKey const* const* members; + + /// + /// Count of members + /// + uint32_t membersCount; + + /// + /// (Optional) Optional: The ID of the existing role to add the entities to. If this is not specified, + /// the default member role for the group will be used. Role IDs must be between 1 and 64 characters + /// long. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + +} PFGroupsAddMembersRequest; + +/// +/// PFGroupsApplyToGroupRequest data model. Creates an application to join a group. Calling this while +/// a group application already exists will return the same application instead of an error and will not +/// refresh the time before the application expires. By default, if the entity has an invitation to join +/// the group outstanding, this will accept the invitation to join the group instead and return an error +/// indicating such, rather than creating a duplicate application to join that will need to be cleaned +/// up later. Returns information about the application or an error indicating an invitation was accepted +/// instead. +/// +typedef struct PFGroupsApplyToGroupRequest +{ + /// + /// (Optional) Optional, default true. Automatically accept an outstanding invitation if one exists + /// instead of creating an application. + /// + _Maybenull_ bool const* autoAcceptOutstandingInvite; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsApplyToGroupRequest; + +/// +/// PFGroupsEntityWithLineage data model. Entity wrapper class that contains the entity key and the entities +/// that make up the lineage of the entity. +/// +typedef struct PFGroupsEntityWithLineage +{ + /// + /// (Optional) The entity key for the specified entity. + /// + _Maybenull_ PFEntityKey const* key; + + /// + /// (Optional) Dictionary of entity keys for related entities. Dictionary key is entity type. + /// + _Maybenull_ _Field_size_(lineageCount) struct PFEntityKeyDictionaryEntry const* lineage; + + /// + /// Count of lineage + /// + uint32_t lineageCount; + +} PFGroupsEntityWithLineage; + +/// +/// PFGroupsApplyToGroupResponse data model. Describes an application to join a group. +/// +typedef struct PFGroupsApplyToGroupResponse +{ + /// + /// (Optional) Type of entity that requested membership. + /// + _Maybenull_ PFGroupsEntityWithLineage const* entity; + + /// + /// When the application to join will expire and be deleted. + /// + time_t expires; + + /// + /// (Optional) ID of the group that the entity requesting membership to. + /// + _Maybenull_ PFEntityKey const* group; + +} PFGroupsApplyToGroupResponse; + +/// +/// PFGroupsBlockEntityRequest data model. Blocks a list of entities from joining a group. Blocked entities +/// may not create new applications to join, be invited to join, accept an invitation, or have an application +/// accepted. Failure due to being blocked does not clean up existing applications or invitations to the +/// group. No data is returned in the case of success. +/// +typedef struct PFGroupsBlockEntityRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsBlockEntityRequest; + +/// +/// PFGroupsChangeMemberRoleRequest data model. Changes the role membership of a list of entities from +/// one role to another in in a single operation. The destination role must already exist. This is equivalent +/// to adding the entities to the destination role and removing from the origin role. Returns nothing +/// if successful. +/// +typedef struct PFGroupsChangeMemberRoleRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The ID of the role that the entities will become a member of. This must be an existing + /// role. Role IDs must be between 1 and 64 characters long. + /// + _Maybenull_ _Null_terminated_ const char* destinationRoleId; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// List of entities to move between roles in the group. All entities in this list must be members + /// of the group and origin role. + /// + _Field_size_(membersCount) PFEntityKey const* const* members; + + /// + /// Count of members + /// + uint32_t membersCount; + + /// + /// The ID of the role that the entities currently are a member of. Role IDs must be between 1 and + /// 64 characters long. + /// + _Null_terminated_ const char* originRoleId; + +} PFGroupsChangeMemberRoleRequest; + +/// +/// PFGroupsCreateGroupRequest data model. Creates a new group, as well as administration and member +/// roles, based off of a title's group template. Returns information about the group that was created. +/// +typedef struct PFGroupsCreateGroupRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// The name of the group. This is unique at the title level by default. + /// + _Null_terminated_ const char* groupName; + +} PFGroupsCreateGroupRequest; + +/// +/// PFGroupsCreateGroupResponse data model. +/// +typedef struct PFGroupsCreateGroupResponse +{ + /// + /// (Optional) The ID of the administrator role for the group. + /// + _Maybenull_ _Null_terminated_ const char* adminRoleId; + + /// + /// The server date and time the group was created. + /// + time_t created; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// (Optional) The name of the group. + /// + _Maybenull_ _Null_terminated_ const char* groupName; + + /// + /// (Optional) The ID of the default member role for the group. + /// + _Maybenull_ _Null_terminated_ const char* memberRoleId; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + + /// + /// (Optional) The list of roles and names that belong to the group. + /// + _Maybenull_ _Field_size_(rolesCount) struct PFStringDictionaryEntry const* roles; + + /// + /// Count of roles + /// + uint32_t rolesCount; + +} PFGroupsCreateGroupResponse; + +/// +/// PFGroupsCreateGroupRoleRequest data model. Creates a new role within an existing group, with no members. +/// Both the role ID and role name must be unique within the group, but the name can be the same as the +/// ID. The role ID is set at creation and cannot be changed. Returns information about the role that +/// was created. +/// +typedef struct PFGroupsCreateGroupRoleRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// The ID of the role. This must be unique within the group and cannot be changed. Role IDs must + /// be between 1 and 64 characters long and are restricted to a-Z, A-Z, 0-9, '(', ')', '_', '-' and + /// '.'. + /// + _Null_terminated_ const char* roleId; + + /// + /// The name of the role. This must be unique within the group and can be changed later. Role names + /// must be between 1 and 100 characters long. + /// + _Null_terminated_ const char* roleName; + +} PFGroupsCreateGroupRoleRequest; + +/// +/// PFGroupsCreateGroupRoleResponse data model. +/// +typedef struct PFGroupsCreateGroupRoleResponse +{ + /// + /// The current version of the group profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + + /// + /// (Optional) ID for the role. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + + /// + /// (Optional) The name of the role. + /// + _Maybenull_ _Null_terminated_ const char* roleName; + +} PFGroupsCreateGroupRoleResponse; + +/// +/// PFGroupsDeleteGroupRequest data model. Deletes a group and all roles, invitations, join requests, +/// and blocks associated with it. Permission to delete is only required the group itself to execute this +/// action. The group and data cannot be cannot be recovered once removed, but any abuse reports about +/// the group will remain. No data is returned in the case of success. +/// +typedef struct PFGroupsDeleteGroupRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// ID of the group or role to remove. + /// + PFEntityKey const* group; + +} PFGroupsDeleteGroupRequest; + +/// +/// PFGroupsDeleteRoleRequest data model. Returns information about the role. +/// +typedef struct PFGroupsDeleteRoleRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// (Optional) The ID of the role to delete. Role IDs must be between 1 and 64 characters long. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + +} PFGroupsDeleteRoleRequest; + +/// +/// PFGroupsGetGroupRequest data model. Returns the ID, name, role list and other non-membership related +/// information about a group. +/// +typedef struct PFGroupsGetGroupRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The identifier of the group. + /// + _Maybenull_ PFEntityKey const* group; + + /// + /// (Optional) The full name of the group. + /// + _Maybenull_ _Null_terminated_ const char* groupName; + +} PFGroupsGetGroupRequest; + +/// +/// PFGroupsGetGroupResponse data model. +/// +typedef struct PFGroupsGetGroupResponse +{ + /// + /// (Optional) The ID of the administrator role for the group. + /// + _Maybenull_ _Null_terminated_ const char* adminRoleId; + + /// + /// The server date and time the group was created. + /// + time_t created; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// (Optional) The name of the group. + /// + _Maybenull_ _Null_terminated_ const char* groupName; + + /// + /// (Optional) The ID of the default member role for the group. + /// + _Maybenull_ _Null_terminated_ const char* memberRoleId; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + + /// + /// (Optional) The list of roles and names that belong to the group. + /// + _Maybenull_ _Field_size_(rolesCount) struct PFStringDictionaryEntry const* roles; + + /// + /// Count of roles + /// + uint32_t rolesCount; + +} PFGroupsGetGroupResponse; + +/// +/// PFGroupsInviteToGroupRequest data model. Invites a player to join a group, if they are not blocked +/// by the group. An optional role can be provided to automatically assign the player to the role if they +/// accept the invitation. By default, if the entity has an application to the group outstanding, this +/// will accept the application instead and return an error indicating such, rather than creating a duplicate +/// invitation to join that will need to be cleaned up later. Returns information about the new invitation +/// or an error indicating an existing application to join was accepted. +/// +typedef struct PFGroupsInviteToGroupRequest +{ + /// + /// (Optional) Optional, default true. Automatically accept an application if one exists instead + /// of creating an invitation. + /// + _Maybenull_ bool const* autoAcceptOutstandingApplication; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// (Optional) Optional. ID of an existing a role in the group to assign the user to. The group's + /// default member role is used if this is not specified. Role IDs must be between 1 and 64 characters + /// long. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + +} PFGroupsInviteToGroupRequest; + +/// +/// PFGroupsInviteToGroupResponse data model. Describes an invitation to a group. +/// +typedef struct PFGroupsInviteToGroupResponse +{ + /// + /// When the invitation will expire and be deleted. + /// + time_t expires; + + /// + /// (Optional) The group that the entity invited to. + /// + _Maybenull_ PFEntityKey const* group; + + /// + /// (Optional) The entity that created the invitation. + /// + _Maybenull_ PFGroupsEntityWithLineage const* invitedByEntity; + + /// + /// (Optional) The entity that is invited. + /// + _Maybenull_ PFGroupsEntityWithLineage const* invitedEntity; + + /// + /// (Optional) ID of the role in the group to assign the user to. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + +} PFGroupsInviteToGroupResponse; + +/// +/// PFGroupsIsMemberRequest data model. Checks to see if an entity is a member of a group or role within +/// the group. A result indicating if the entity is a member of the group is returned, or a permission +/// error if the caller does not have permission to read the group's member list. +/// +typedef struct PFGroupsIsMemberRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// (Optional) Optional: ID of the role to check membership of. Defaults to any role (that is, check + /// to see if the entity is a member of the group in any capacity) if not specified. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + +} PFGroupsIsMemberRequest; + +/// +/// PFGroupsIsMemberResponse data model. +/// +typedef struct PFGroupsIsMemberResponse +{ + /// + /// A value indicating whether or not the entity is a member. + /// + bool isMember; + +} PFGroupsIsMemberResponse; + +/// +/// PFGroupsListGroupApplicationsRequest data model. Lists all outstanding requests to join a group. +/// Returns a list of all requests to join, as well as when the request will expire. To get the group +/// applications for a specific entity, use ListMembershipOpportunities. +/// +typedef struct PFGroupsListGroupApplicationsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsListGroupApplicationsRequest; + +/// +/// PFGroupsGroupApplication data model. Describes an application to join a group. +/// +typedef struct PFGroupsGroupApplication +{ + /// + /// (Optional) Type of entity that requested membership. + /// + _Maybenull_ PFGroupsEntityWithLineage const* entity; + + /// + /// When the application to join will expire and be deleted. + /// + time_t expires; + + /// + /// (Optional) ID of the group that the entity requesting membership to. + /// + _Maybenull_ PFEntityKey const* group; + +} PFGroupsGroupApplication; + +/// +/// PFGroupsListGroupApplicationsResponse data model. +/// +typedef struct PFGroupsListGroupApplicationsResponse +{ + /// + /// (Optional) The requested list of applications to the group. + /// + _Maybenull_ _Field_size_(applicationsCount) PFGroupsGroupApplication const* const* applications; + + /// + /// Count of applications + /// + uint32_t applicationsCount; + +} PFGroupsListGroupApplicationsResponse; + +/// +/// PFGroupsListGroupBlocksRequest data model. Lists all entities blocked from joining a group. A list +/// of blocked entities is returned. +/// +typedef struct PFGroupsListGroupBlocksRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsListGroupBlocksRequest; + +/// +/// PFGroupsGroupBlock data model. Describes an entity that is blocked from joining a group. +/// +typedef struct PFGroupsGroupBlock +{ + /// + /// (Optional) The entity that is blocked. + /// + _Maybenull_ PFGroupsEntityWithLineage const* entity; + + /// + /// ID of the group that the entity is blocked from. + /// + PFEntityKey const* group; + +} PFGroupsGroupBlock; + +/// +/// PFGroupsListGroupBlocksResponse data model. +/// +typedef struct PFGroupsListGroupBlocksResponse +{ + /// + /// (Optional) The requested list blocked entities. + /// + _Maybenull_ _Field_size_(blockedEntitiesCount) PFGroupsGroupBlock const* const* blockedEntities; + + /// + /// Count of blockedEntities + /// + uint32_t blockedEntitiesCount; + +} PFGroupsListGroupBlocksResponse; + +/// +/// PFGroupsListGroupInvitationsRequest data model. Lists all outstanding invitations for a group. Returns +/// a list of entities that have been invited, as well as when the invitation will expire. To get the +/// group invitations for a specific entity, use ListMembershipOpportunities. +/// +typedef struct PFGroupsListGroupInvitationsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsListGroupInvitationsRequest; + +/// +/// PFGroupsGroupInvitation data model. Describes an invitation to a group. +/// +typedef struct PFGroupsGroupInvitation +{ + /// + /// When the invitation will expire and be deleted. + /// + time_t expires; + + /// + /// (Optional) The group that the entity invited to. + /// + _Maybenull_ PFEntityKey const* group; + + /// + /// (Optional) The entity that created the invitation. + /// + _Maybenull_ PFGroupsEntityWithLineage const* invitedByEntity; + + /// + /// (Optional) The entity that is invited. + /// + _Maybenull_ PFGroupsEntityWithLineage const* invitedEntity; + + /// + /// (Optional) ID of the role in the group to assign the user to. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + +} PFGroupsGroupInvitation; + +/// +/// PFGroupsListGroupInvitationsResponse data model. +/// +typedef struct PFGroupsListGroupInvitationsResponse +{ + /// + /// (Optional) The requested list of group invitations. + /// + _Maybenull_ _Field_size_(invitationsCount) PFGroupsGroupInvitation const* const* invitations; + + /// + /// Count of invitations + /// + uint32_t invitationsCount; + +} PFGroupsListGroupInvitationsResponse; + +/// +/// PFGroupsListGroupMembersRequest data model. Gets a list of members and the roles they belong to within +/// the group. If the caller does not have permission to view the role, and the member is in no other +/// role, the member is not displayed. Returns a list of entities that are members of the group. +/// +typedef struct PFGroupsListGroupMembersRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// ID of the group to list the members and roles for. + /// + PFEntityKey const* group; + +} PFGroupsListGroupMembersRequest; + +/// +/// PFGroupsEntityMemberRole data model. +/// +typedef struct PFGroupsEntityMemberRole +{ + /// + /// (Optional) The list of members in the role. + /// + _Maybenull_ _Field_size_(membersCount) PFGroupsEntityWithLineage const* const* members; + + /// + /// Count of members + /// + uint32_t membersCount; + + /// + /// (Optional) The ID of the role. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + + /// + /// (Optional) The name of the role. + /// + _Maybenull_ _Null_terminated_ const char* roleName; + +} PFGroupsEntityMemberRole; + +/// +/// PFGroupsListGroupMembersResponse data model. +/// +typedef struct PFGroupsListGroupMembersResponse +{ + /// + /// (Optional) The requested list of roles and member entity IDs. + /// + _Maybenull_ _Field_size_(membersCount) PFGroupsEntityMemberRole const* const* members; + + /// + /// Count of members + /// + uint32_t membersCount; + +} PFGroupsListGroupMembersResponse; + +/// +/// PFGroupsListMembershipRequest data model. Lists the groups and roles that an entity is a part of, +/// checking to see if group and role metadata and memberships should be visible to the caller. If the +/// entity is not in any roles that are visible to the caller, the group is not returned in the results, +/// even if the caller otherwise has permission to see that the entity is a member of that group. +/// +typedef struct PFGroupsListMembershipRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFGroupsListMembershipRequest; + +/// +/// PFGroupsGroupRole data model. Describes a group role. +/// +typedef struct PFGroupsGroupRole +{ + /// + /// (Optional) ID for the role. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + + /// + /// (Optional) The name of the role. + /// + _Maybenull_ _Null_terminated_ const char* roleName; + +} PFGroupsGroupRole; + +/// +/// PFGroupsGroupWithRoles data model. Describes a group and the roles that it contains. +/// +typedef struct PFGroupsGroupWithRoles +{ + /// + /// (Optional) ID for the group. + /// + _Maybenull_ PFEntityKey const* group; + + /// + /// (Optional) The name of the group. + /// + _Maybenull_ _Null_terminated_ const char* groupName; + + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + int32_t profileVersion; + + /// + /// (Optional) The list of roles within the group. + /// + _Maybenull_ _Field_size_(rolesCount) PFGroupsGroupRole const* const* roles; + + /// + /// Count of roles + /// + uint32_t rolesCount; + +} PFGroupsGroupWithRoles; + +/// +/// PFGroupsListMembershipResponse data model. +/// +typedef struct PFGroupsListMembershipResponse +{ + /// + /// (Optional) The list of groups. + /// + _Maybenull_ _Field_size_(groupsCount) PFGroupsGroupWithRoles const* const* groups; + + /// + /// Count of groups + /// + uint32_t groupsCount; + +} PFGroupsListMembershipResponse; + +/// +/// PFGroupsListMembershipOpportunitiesRequest data model. Lists all outstanding group applications and +/// invitations for an entity. Anyone may call this for any entity, but data will only be returned for +/// the entity or a parent of that entity. To list invitations or applications for a group to check if +/// a player is trying to join, use ListGroupInvitations and ListGroupApplications. +/// +typedef struct PFGroupsListMembershipOpportunitiesRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFGroupsListMembershipOpportunitiesRequest; + +/// +/// PFGroupsListMembershipOpportunitiesResponse data model. +/// +typedef struct PFGroupsListMembershipOpportunitiesResponse +{ + /// + /// (Optional) The requested list of group applications. + /// + _Maybenull_ _Field_size_(applicationsCount) PFGroupsGroupApplication const* const* applications; + + /// + /// Count of applications + /// + uint32_t applicationsCount; + + /// + /// (Optional) The requested list of group invitations. + /// + _Maybenull_ _Field_size_(invitationsCount) PFGroupsGroupInvitation const* const* invitations; + + /// + /// Count of invitations + /// + uint32_t invitationsCount; + +} PFGroupsListMembershipOpportunitiesResponse; + +/// +/// PFGroupsRemoveGroupApplicationRequest data model. Removes an existing application to join the group. +/// This is used for both rejection of an application as well as withdrawing an application. The applying +/// entity or a parent in its chain (e.g. title) may withdraw the application, and any caller with appropriate +/// access in the group may reject an application. No data is returned in the case of success. +/// +typedef struct PFGroupsRemoveGroupApplicationRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsRemoveGroupApplicationRequest; + +/// +/// PFGroupsRemoveGroupInvitationRequest data model. Removes an existing invitation to join the group. +/// This is used for both rejection of an invitation as well as rescinding an invitation. The invited +/// entity or a parent in its chain (e.g. title) may reject the invitation by calling this method, and +/// any caller with appropriate access in the group may rescind an invitation. No data is returned in +/// the case of success. +/// +typedef struct PFGroupsRemoveGroupInvitationRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsRemoveGroupInvitationRequest; + +/// +/// PFGroupsRemoveMembersRequest data model. Removes members from a group. A member can always remove +/// themselves from a group, regardless of permissions. Returns nothing if successful. +/// +typedef struct PFGroupsRemoveMembersRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// List of entities to remove. + /// + _Field_size_(membersCount) PFEntityKey const* const* members; + + /// + /// Count of members + /// + uint32_t membersCount; + + /// + /// (Optional) The ID of the role to remove the entities from. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + +} PFGroupsRemoveMembersRequest; + +/// +/// PFGroupsUnblockEntityRequest data model. Unblocks a list of entities from joining a group. No data +/// is returned in the case of success. +/// +typedef struct PFGroupsUnblockEntityRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + +} PFGroupsUnblockEntityRequest; + +/// +/// PFGroupsUpdateGroupRequest data model. Updates data about a group, such as the name or default member +/// role. Returns information about whether the update was successful. Only title claimants may modify +/// the administration role for a group. +/// +typedef struct PFGroupsUpdateGroupRequest +{ + /// + /// (Optional) Optional: the ID of an existing role to set as the new administrator role for the + /// group. + /// + _Maybenull_ _Null_terminated_ const char* adminRoleId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Optional field used for concurrency control. By specifying the previously returned + /// value of ProfileVersion from the GetGroup API, you can ensure that the group data update will + /// only be performed if the group has not been updated by any other clients since the version you + /// last loaded. + /// + _Maybenull_ int32_t const* expectedProfileVersion; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// (Optional) Optional: the new name of the group. + /// + _Maybenull_ _Null_terminated_ const char* groupName; + + /// + /// (Optional) Optional: the ID of an existing role to set as the new member role for the group. + /// + _Maybenull_ _Null_terminated_ const char* memberRoleId; + +} PFGroupsUpdateGroupRequest; + +/// +/// PFGroupsUpdateGroupResponse data model. +/// +typedef struct PFGroupsUpdateGroupResponse +{ + /// + /// (Optional) Optional reason to explain why the operation was the result that it was. + /// + _Maybenull_ _Null_terminated_ const char* operationReason; + + /// + /// New version of the group data. + /// + int32_t profileVersion; + + /// + /// (Optional) Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + _Maybenull_ PFOperationTypes const* setResult; + +} PFGroupsUpdateGroupResponse; + +/// +/// PFGroupsUpdateGroupRoleRequest data model. Updates the role name. Returns information about whether +/// the update was successful. +/// +typedef struct PFGroupsUpdateGroupRoleRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Optional field used for concurrency control. By specifying the previously returned + /// value of ProfileVersion from the GetGroup API, you can ensure that the group data update will + /// only be performed if the group has not been updated by any other clients since the version you + /// last loaded. + /// + _Maybenull_ int32_t const* expectedProfileVersion; + + /// + /// The identifier of the group. + /// + PFEntityKey const* group; + + /// + /// (Optional) ID of the role to update. Role IDs must be between 1 and 64 characters long. + /// + _Maybenull_ _Null_terminated_ const char* roleId; + + /// + /// The new name of the role. + /// + _Null_terminated_ const char* roleName; + +} PFGroupsUpdateGroupRoleRequest; + +/// +/// PFGroupsUpdateGroupRoleResponse data model. +/// +typedef struct PFGroupsUpdateGroupRoleResponse +{ + /// + /// (Optional) Optional reason to explain why the operation was the result that it was. + /// + _Maybenull_ _Null_terminated_ const char* operationReason; + + /// + /// New version of the role data. + /// + int32_t profileVersion; + + /// + /// (Optional) Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + _Maybenull_ PFOperationTypes const* setResult; + +} PFGroupsUpdateGroupRoleResponse; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFInventory.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFInventory.h new file mode 100644 index 0000000..d380425 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFInventory.h @@ -0,0 +1,1063 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Add inventory items. Up to 3500 stacks of items can be added to a single inventory collection. Stack +/// size is uncapped. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an entity type, entity identifier and container details, will add the specified inventory items. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryAddInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryAddInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a AddInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFInventoryAddInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryAddInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryAddInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryAddInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Delete an Inventory Collection. More information about Inventory Collections can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/collections +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Delete an Inventory Collection by the specified Id for an Entity. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFInventoryDeleteInventoryCollectionAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryDeleteInventoryCollectionRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Delete inventory items +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an entity type, entity identifier and container details, will delete the entity's inventory +/// items. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryDeleteInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryDeleteInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a DeleteInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryDeleteInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryDeleteInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryDeleteInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryDeleteInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Execute a list of Inventory Operations. A maximum list of 10 operations can be performed by a single +/// request. There is also a limit to 250 items that can be modified/added in a single request. For example, +/// adding a bundle with 50 items counts as 50 items modified. All operations must be done within a single +/// inventory collection. This API has a reduced RPS compared to an individual inventory operation with +/// Player Entities limited to 15 requests in 90 seconds and Title Entities limited to 500 requests in +/// 10 seconds. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Execute a list of Inventory Operations for an Entity. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryExecuteInventoryOperationsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryExecuteInventoryOperationsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ExecuteInventoryOperations call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryExecuteInventoryOperationsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryExecuteInventoryOperationsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryExecuteInventoryOperationsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryExecuteInventoryOperationsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Get Inventory Collection Ids. Up to 50 Ids can be returned at once. You can use continuation tokens +/// to paginate through results that return greater than the limit. It can take a few seconds for new +/// collection Ids to show up. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Get a list of Inventory Collection Ids for the specified Entity. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryGetInventoryCollectionIdsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryGetInventoryCollectionIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetInventoryCollectionIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryGetInventoryCollectionIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryGetInventoryCollectionIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryGetInventoryCollectionIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetInventoryCollectionIdsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Get current inventory items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an entity type, entity identifier and container details, will get the entity's inventory items. +/// . +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryGetInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryGetInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_DELETED, +/// E_PF_DATABASE_THROUGHPUT_EXCEEDED or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryGetInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryGetInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_DELETED, +/// E_PF_DATABASE_THROUGHPUT_EXCEEDED or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryGetInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Gets the access tokens. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32 and GDK. +/// Gets the access tokens for Microsoft Store authentication. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryGetMicrosoftStoreAccessTokensAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryGetMicrosoftStoreAccessTokensRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetMicrosoftStoreAccessTokens call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_NOT_IMPLEMENTED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFInventoryGetMicrosoftStoreAccessTokensGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryGetMicrosoftStoreAccessTokensAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_NOT_IMPLEMENTED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryGetMicrosoftStoreAccessTokensGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetMicrosoftStoreAccessTokensResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Get transaction history for a player. Up to 50 Events can be returned at once. You can use continuation +/// tokens to paginate through results that return greater than the limit. Getting transaction history +/// has a lower RPS limit than getting a Player's inventory with Player Entities having a limit of 30 +/// requests in 300 seconds and Title Entities having a limit of 100 requests in 10 seconds. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Get transaction history for specified entity and collection. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryGetTransactionHistoryAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryGetTransactionHistoryRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetTransactionHistory call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryGetTransactionHistoryGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryGetTransactionHistoryAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryGetTransactionHistoryGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetTransactionHistoryResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +/// +/// Purchase an item or bundle. Up to 3500 stacks of items can be added to a single inventory collection. +/// Stack size is uncapped. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Purchase a single item or bundle, paying the associated price. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryPurchaseInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryPurchaseInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a PurchaseInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryPurchaseInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryPurchaseInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryPurchaseInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryPurchaseInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if 0 +/// +/// Redeem items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Redeem items from the Apple App Store. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryRedeemAppleAppStoreInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryRedeemAppleAppStoreInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RedeemAppleAppStoreInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryRedeemAppleAppStoreInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryRedeemAppleAppStoreInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryRedeemAppleAppStoreInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemAppleAppStoreInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Redeem items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Redeem items from the Google Play Store. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryRedeemGooglePlayInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryRedeemGooglePlayInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RedeemGooglePlayInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryRedeemGooglePlayInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryRedeemGooglePlayInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryRedeemGooglePlayInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemGooglePlayInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Redeem items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32 and GDK. +/// Redeem items from the Microsoft Store. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryRedeemMicrosoftStoreInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryRedeemMicrosoftStoreInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RedeemMicrosoftStoreInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED, +/// E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_XBOX_INACCESSIBLE, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryRedeemMicrosoftStoreInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryRedeemMicrosoftStoreInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED, +/// E_PF_INVALID_XBOX_LIVE_TOKEN, E_PF_XBOX_INACCESSIBLE, E_PF_XBOX_XASS_EXCHANGE_FAILURE or any of the +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryRedeemMicrosoftStoreInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemMicrosoftStoreInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +/// +/// Redeem items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Nintendo Switch. +/// Redeem items from the Nintendo EShop. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryRedeemNintendoEShopInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryRedeemNintendoEShopInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RedeemNintendoEShopInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED, +/// E_PF_INVALID_NINTENDO_SWITCH_ACCOUNT_ID or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryRedeemNintendoEShopInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryRedeemNintendoEShopInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED, +/// E_PF_INVALID_NINTENDO_SWITCH_ACCOUNT_ID or any of the global PlayFab Service errors. See doc page +/// "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryRedeemNintendoEShopInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemNintendoEShopInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +/// +/// Redeem items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Sony PlayStation®. +/// Redeem items from the PlayStation Store. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryRedeemPlayStationStoreInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryRedeemPlayStationStoreInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RedeemPlayStationStoreInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED, +/// E_PF_INVALID_PSN_AUTH_CODE, E_PF_NOT_AUTHORIZED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryRedeemPlayStationStoreInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryRedeemPlayStationStoreInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED, +/// E_PF_INVALID_PSN_AUTH_CODE, E_PF_NOT_AUTHORIZED or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryRedeemPlayStationStoreInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemPlayStationStoreInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +/// +/// Redeem items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on Win32. +/// Redeem inventory items from Steam. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryRedeemSteamInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryRedeemSteamInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RedeemSteamInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFInventoryRedeemSteamInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryRedeemSteamInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_ACCOUNT_NOT_LINKED +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryRedeemSteamInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemSteamInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +/// +/// Subtract inventory items. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an entity type, entity identifier and container details, will subtract the specified inventory +/// items. . +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventorySubtractInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventorySubtractInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a SubtractInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventorySubtractInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventorySubtractInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventorySubtractInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventorySubtractInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Transfer inventory items. When transferring across collections, a 202 response indicates that the +/// transfer is in progress and will complete soon. More information about item transfer scenarios can +/// be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/?tabs=inventory-game-manager#transfer-inventory-items +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Transfer the specified inventory items of an entity's container Id to another entity's container +/// Id. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryTransferInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryTransferInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a TransferInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFInventoryTransferInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryTransferInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_INSUFFICIENT_FUNDS, E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryTransferInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryTransferInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Update inventory items +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an entity type, entity identifier and container details, will update the entity's inventory +/// items. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFInventoryUpdateInventoryItemsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFInventoryUpdateInventoryItemsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a UpdateInventoryItems call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFInventoryUpdateInventoryItemsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFInventoryUpdateInventoryItemsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_DATABASE_THROUGHPUT_EXCEEDED, +/// E_PF_ITEM_NOT_FOUND or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFInventoryUpdateInventoryItemsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryUpdateInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFInventoryTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFInventoryTypes.h new file mode 100644 index 0000000..063c92e --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFInventoryTypes.h @@ -0,0 +1,1915 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFInventoryAlternateId data model. +/// +typedef struct PFInventoryAlternateId +{ + /// + /// (Optional) Type of the alternate ID. + /// + _Maybenull_ _Null_terminated_ const char* type; + + /// + /// (Optional) Value of the alternate ID. + /// + _Maybenull_ _Null_terminated_ const char* value; + +} PFInventoryAlternateId; + +/// +/// PFInventoryInventoryItemReference data model. +/// +typedef struct PFInventoryInventoryItemReference +{ + /// + /// (Optional) The inventory item alternate id the request applies to. + /// + _Maybenull_ PFInventoryAlternateId const* alternateId; + + /// + /// (Optional) The inventory item id the request applies to. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The inventory stack id the request should redeem to. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* stackId; + +} PFInventoryInventoryItemReference; + +/// +/// PFInventoryInitialValues data model. +/// +typedef struct PFInventoryInitialValues +{ + /// + /// (Optional) Game specific properties for display purposes. The Display Properties field has a + /// 1000 byte limit. + /// + PFJsonObject displayProperties; + +} PFInventoryInitialValues; + +/// +/// PFInventoryAddInventoryItemsRequest data model. Given an entity type, entity identifier and container +/// details, will add the specified inventory items. +/// +typedef struct PFInventoryAddInventoryItemsRequest +{ + /// + /// (Optional) The amount to add for the current item. + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// The number of inventory collections is unlimited. + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The duration to add to the current item expiration date. + /// + _Maybenull_ double const* durationInSeconds; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The Idempotency ID for this request. Idempotency IDs can be used to prevent operation + /// replay in the medium term but will be garbage collected eventually. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The inventory item the request applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + + /// + /// (Optional) The values to apply to a stack newly created by this request. + /// + _Maybenull_ PFInventoryInitialValues const* newStackValues; + +} PFInventoryAddInventoryItemsRequest; + +/// +/// PFInventoryAddInventoryItemsResponse data model. +/// +typedef struct PFInventoryAddInventoryItemsResponse +{ + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The idempotency id used in the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The ids of transactions that occurred as a result of the request. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryAddInventoryItemsResponse; + +/// +/// PFInventoryDeleteInventoryCollectionRequest data model. Delete an Inventory Collection by the specified +/// Id for an Entity. +/// +typedef struct PFInventoryDeleteInventoryCollectionRequest +{ + /// + /// (Optional) The inventory collection id the request applies to. + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity the request is about. Set to the caller by default. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + +} PFInventoryDeleteInventoryCollectionRequest; + +/// +/// PFInventoryDeleteInventoryItemsRequest data model. Given an entity type, entity identifier and container +/// details, will delete the entity's inventory items. +/// +typedef struct PFInventoryDeleteInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// The number of inventory collections is unlimited. + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The Idempotency ID for this request. Idempotency IDs can be used to prevent operation + /// replay in the medium term but will be garbage collected eventually. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The inventory item the request applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + +} PFInventoryDeleteInventoryItemsRequest; + +/// +/// PFInventoryDeleteInventoryItemsResponse data model. +/// +typedef struct PFInventoryDeleteInventoryItemsResponse +{ + /// + /// (Optional) ETags are used for concurrency checking when updating resources. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The idempotency id used in the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The ids of transactions that occurred as a result of the request. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryDeleteInventoryItemsResponse; + +/// +/// PFInventoryAddInventoryItemsOperation data model. +/// +typedef struct PFInventoryAddInventoryItemsOperation +{ + /// + /// (Optional) The amount to add to the current item amount. + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) The duration to add to the current item expiration date. + /// + _Maybenull_ double const* durationInSeconds; + + /// + /// (Optional) The inventory item the operation applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + + /// + /// (Optional) The values to apply to a stack newly created by this operation. + /// + _Maybenull_ PFInventoryInitialValues const* newStackValues; + +} PFInventoryAddInventoryItemsOperation; + +/// +/// PFInventoryDeleteInventoryItemsOperation data model. +/// +typedef struct PFInventoryDeleteInventoryItemsOperation +{ + /// + /// (Optional) The inventory item the operation applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + +} PFInventoryDeleteInventoryItemsOperation; + +/// +/// PFInventoryPurchasePriceAmount data model. +/// +typedef struct PFInventoryPurchasePriceAmount +{ + /// + /// The amount of the inventory item to use in the purchase . + /// + int32_t amount; + + /// + /// (Optional) The inventory item id to use in the purchase . + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) The inventory stack id the to use in the purchase. Set to "default" by default. + /// + _Maybenull_ _Null_terminated_ const char* stackId; + +} PFInventoryPurchasePriceAmount; + +/// +/// PFInventoryPurchaseInventoryItemsOperation data model. +/// +typedef struct PFInventoryPurchaseInventoryItemsOperation +{ + /// + /// (Optional) The amount to purchase. + /// + _Maybenull_ int32_t const* amount; + + /// + /// Indicates whether stacks reduced to an amount of 0 during the operation should be deleted from + /// the inventory. (Default = false). + /// + bool deleteEmptyStacks; + + /// + /// (Optional) The duration to purchase. + /// + _Maybenull_ double const* durationInSeconds; + + /// + /// (Optional) The inventory item the operation applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + + /// + /// (Optional) The values to apply to a stack newly created by this operation. + /// + _Maybenull_ PFInventoryInitialValues const* newStackValues; + + /// + /// (Optional) The per-item price the item is expected to be purchased at. This must match a value + /// configured in the Catalog or specified Store. + /// + _Maybenull_ _Field_size_(priceAmountsCount) PFInventoryPurchasePriceAmount const* const* priceAmounts; + + /// + /// Count of priceAmounts + /// + uint32_t priceAmountsCount; + + /// + /// (Optional) The id of the Store to purchase the item from. + /// + _Maybenull_ _Null_terminated_ const char* storeId; + +} PFInventoryPurchaseInventoryItemsOperation; + +/// +/// PFInventorySubtractInventoryItemsOperation data model. +/// +typedef struct PFInventorySubtractInventoryItemsOperation +{ + /// + /// (Optional) The amount to subtract from the current item amount. + /// + _Maybenull_ int32_t const* amount; + + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from + /// the inventory. (Default = false). + /// + bool deleteEmptyStacks; + + /// + /// (Optional) The duration to subtract from the current item expiration date. + /// + _Maybenull_ double const* durationInSeconds; + + /// + /// (Optional) The inventory item the operation applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + +} PFInventorySubtractInventoryItemsOperation; + +/// +/// PFInventoryTransferInventoryItemsOperation data model. +/// +typedef struct PFInventoryTransferInventoryItemsOperation +{ + /// + /// (Optional) The amount to transfer. + /// + _Maybenull_ int32_t const* amount; + + /// + /// Indicates whether stacks reduced to an amount of 0 during the operation should be deleted from + /// the inventory. (Default = false). + /// + bool deleteEmptyStacks; + + /// + /// (Optional) The inventory item the operation is transferring from. + /// + _Maybenull_ PFInventoryInventoryItemReference const* givingItem; + + /// + /// (Optional) The values to apply to a stack newly created by this operation. + /// + _Maybenull_ PFInventoryInitialValues const* newStackValues; + + /// + /// (Optional) The inventory item the operation is transferring to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* receivingItem; + +} PFInventoryTransferInventoryItemsOperation; + +/// +/// PFInventoryInventoryItem data model. +/// +typedef struct PFInventoryInventoryItem +{ + /// + /// (Optional) The amount of the item. + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) Game specific properties for display purposes. This is an arbitrary JSON blob. The + /// Display Properties field has a 1000 byte limit. + /// + PFJsonObject displayProperties; + + /// + /// (Optional) Only used for subscriptions. The date of when the item will expire in UTC. + /// + _Maybenull_ time_t const* expirationDate; + + /// + /// (Optional) The id of the item. This should correspond to the item id in the catalog. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) The stack id of the item. + /// + _Maybenull_ _Null_terminated_ const char* stackId; + + /// + /// (Optional) The type of the item. This should correspond to the item type in the catalog. + /// + _Maybenull_ _Null_terminated_ const char* type; + +} PFInventoryInventoryItem; + +/// +/// PFInventoryUpdateInventoryItemsOperation data model. +/// +typedef struct PFInventoryUpdateInventoryItemsOperation +{ + /// + /// (Optional) The inventory item to update with the specified values. + /// + _Maybenull_ PFInventoryInventoryItem const* item; + +} PFInventoryUpdateInventoryItemsOperation; + +/// +/// PFInventoryInventoryOperation data model. +/// +typedef struct PFInventoryInventoryOperation +{ + /// + /// (Optional) The add operation. + /// + _Maybenull_ PFInventoryAddInventoryItemsOperation const* add; + + /// + /// (Optional) The delete operation. + /// + _Maybenull_ PFInventoryDeleteInventoryItemsOperation const* deleteOp; + + /// + /// (Optional) The purchase operation. + /// + _Maybenull_ PFInventoryPurchaseInventoryItemsOperation const* purchase; + + /// + /// (Optional) The subtract operation. + /// + _Maybenull_ PFInventorySubtractInventoryItemsOperation const* subtract; + + /// + /// (Optional) The transfer operation. + /// + _Maybenull_ PFInventoryTransferInventoryItemsOperation const* transfer; + + /// + /// (Optional) The update operation. + /// + _Maybenull_ PFInventoryUpdateInventoryItemsOperation const* update; + +} PFInventoryInventoryOperation; + +/// +/// PFInventoryExecuteInventoryOperationsRequest data model. Execute a list of Inventory Operations for +/// an Entity. +/// +typedef struct PFInventoryExecuteInventoryOperationsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// The number of inventory collections is unlimited. + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The Idempotency ID for this request. Idempotency IDs can be used to prevent operation + /// replay in the medium term but will be garbage collected eventually. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The operations to run transactionally. The operations will be executed in-order sequentially + /// and will succeed or fail as a batch. Up to 10 operations can be added. + /// + _Maybenull_ _Field_size_(operationsCount) PFInventoryInventoryOperation const* const* operations; + + /// + /// Count of operations + /// + uint32_t operationsCount; + +} PFInventoryExecuteInventoryOperationsRequest; + +/// +/// PFInventoryExecuteInventoryOperationsResponse data model. +/// +typedef struct PFInventoryExecuteInventoryOperationsResponse +{ + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The idempotency id used in the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The ids of the transactions that occurred as a result of the request. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryExecuteInventoryOperationsResponse; + +/// +/// PFInventoryGetInventoryCollectionIdsRequest data model. Get a list of Inventory Collection Ids for +/// the specified Entity. +/// +typedef struct PFInventoryGetInventoryCollectionIdsRequest +{ + /// + /// (Optional) An opaque token used to retrieve the next page of collection ids, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// Number of items to retrieve. This value is optional. The default value is 10. + /// + int32_t count; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity the request is about. Set to the caller by default. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFInventoryGetInventoryCollectionIdsRequest; + +/// +/// PFInventoryGetInventoryCollectionIdsResponse data model. +/// +typedef struct PFInventoryGetInventoryCollectionIdsResponse +{ + /// + /// (Optional) The requested inventory collection ids. + /// + _Maybenull_ _Field_size_(collectionIdsCount) const char* const* collectionIds; + + /// + /// Count of collectionIds + /// + uint32_t collectionIdsCount; + + /// + /// (Optional) An opaque token used to retrieve the next page of collection ids, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + +} PFInventoryGetInventoryCollectionIdsResponse; + +/// +/// PFInventoryGetInventoryItemsRequest data model. Given an entity type, entity identifier and container +/// details, will get the entity's inventory items. . +/// +typedef struct PFInventoryGetInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) An opaque token used to retrieve the next page of items in the inventory, if any are + /// available. Should be null on initial request. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// Number of items to retrieve. This value is optional. Maximum page size is 50. The default value + /// is 10. + /// + int32_t count; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) OData Filter to refine the items returned. InventoryItem properties 'type', 'id', + /// and 'stackId' can be used in the filter. For example: "type eq 'currency'". + /// + _Maybenull_ _Null_terminated_ const char* filter; + +} PFInventoryGetInventoryItemsRequest; + +/// +/// PFInventoryGetInventoryItemsResponse data model. +/// +typedef struct PFInventoryGetInventoryItemsResponse +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The requested inventory items. + /// + _Maybenull_ _Field_size_(itemsCount) PFInventoryInventoryItem const* const* items; + + /// + /// Count of items + /// + uint32_t itemsCount; + +} PFInventoryGetInventoryItemsResponse; + +/// +/// PFInventoryGetMicrosoftStoreAccessTokensRequest data model. Gets the access tokens for Microsoft +/// Store authentication. +/// +typedef struct PFInventoryGetMicrosoftStoreAccessTokensRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFInventoryGetMicrosoftStoreAccessTokensRequest; + +/// +/// PFInventoryGetMicrosoftStoreAccessTokensResponse data model. +/// +typedef struct PFInventoryGetMicrosoftStoreAccessTokensResponse +{ + /// + /// (Optional) The collections access token for calling https://onestore.microsoft.com/b2b/keys/create/collections + /// to obtain a CollectionsIdKey for the user. + /// + _Maybenull_ _Null_terminated_ const char* collectionsAccessToken; + + /// + /// The date the collections access token expires. + /// + time_t collectionsAccessTokenExpirationDate; + +} PFInventoryGetMicrosoftStoreAccessTokensResponse; + +/// +/// PFInventoryGetTransactionHistoryRequest data model. Get transaction history for specified entity +/// and collection. +/// +typedef struct PFInventoryGetTransactionHistoryRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. Should + /// be null on initial request. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// Number of items to retrieve. This value is optional. The default value is 10. + /// + int32_t count; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) An OData filter used to refine the TransactionHistory. Transaction properties 'timestamp', + /// 'transactionid', 'apiname' and 'operationtype' can be used in the filter. Properties 'transactionid', + /// 'apiname', and 'operationtype' cannot be used together in a single request. The 'timestamp' property + /// can be combined with 'apiname' or 'operationtype' in a single request. For example: "timestamp + /// ge 2023-06-20T23:30Z" or "transactionid eq '10'" or "(timestamp ge 2023-06-20T23:30Z) and (apiname + /// eq 'AddInventoryItems')". By default, a 6 month timespan from the current date is used. + /// + _Maybenull_ _Null_terminated_ const char* filter; + +} PFInventoryGetTransactionHistoryRequest; + +/// +/// PFInventoryTransactionOperation data model. +/// +typedef struct PFInventoryTransactionOperation +{ + /// + /// (Optional) The amount of items in this transaction. + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) The duration modified in this transaction. + /// + _Maybenull_ double const* durationInSeconds; + + /// + /// (Optional) The item id of the items in this transaction. + /// + _Maybenull_ _Null_terminated_ const char* itemId; + + /// + /// (Optional) The type of item that the operation occurred on. + /// + _Maybenull_ _Null_terminated_ const char* itemType; + + /// + /// (Optional) The stack id of the items in this transaction. + /// + _Maybenull_ _Null_terminated_ const char* stackId; + + /// + /// (Optional) The type of the operation that occurred. + /// + _Maybenull_ _Null_terminated_ const char* type; + +} PFInventoryTransactionOperation; + +/// +/// PFInventoryTransactionPurchaseDetails data model. +/// +typedef struct PFInventoryTransactionPurchaseDetails +{ + /// + /// (Optional) The id of the Store the item was purchased from or null. + /// + _Maybenull_ _Null_terminated_ const char* storeId; + +} PFInventoryTransactionPurchaseDetails; + +/// +/// PFInventoryTransactionRedeemDetails data model. +/// +typedef struct PFInventoryTransactionRedeemDetails +{ + /// + /// (Optional) The marketplace that the offer is being redeemed from. + /// + _Maybenull_ _Null_terminated_ const char* marketplace; + + /// + /// (Optional) The transaction Id returned from the marketplace. + /// + _Maybenull_ _Null_terminated_ const char* marketplaceTransactionId; + + /// + /// (Optional) The offer Id of the item being redeemed. + /// + _Maybenull_ _Null_terminated_ const char* offerId; + +} PFInventoryTransactionRedeemDetails; + +/// +/// PFInventoryTransactionTransferDetails data model. +/// +typedef struct PFInventoryTransactionTransferDetails +{ + /// + /// (Optional) The collection id the items were transferred from or null if it was the current collection. + /// + _Maybenull_ _Null_terminated_ const char* givingCollectionId; + + /// + /// (Optional) The entity the items were transferred from or null if it was the current entity. + /// + _Maybenull_ PFEntityKey const* givingEntity; + + /// + /// (Optional) The collection id the items were transferred to or null if it was the current collection. + /// + _Maybenull_ _Null_terminated_ const char* receivingCollectionId; + + /// + /// (Optional) The entity the items were transferred to or null if it was the current entity. + /// + _Maybenull_ PFEntityKey const* receivingEntity; + + /// + /// (Optional) The id of the transfer that occurred. + /// + _Maybenull_ _Null_terminated_ const char* transferId; + +} PFInventoryTransactionTransferDetails; + +/// +/// PFInventoryTransaction data model. +/// +typedef struct PFInventoryTransaction +{ + /// + /// (Optional) The API call that caused this transaction. + /// + _Maybenull_ _Null_terminated_ const char* apiName; + + /// + /// (Optional) The type of item that the the operation occurred on. + /// + _Maybenull_ _Null_terminated_ const char* itemType; + + /// + /// (Optional) The operations that occurred. + /// + _Maybenull_ _Field_size_(operationsCount) PFInventoryTransactionOperation const* const* operations; + + /// + /// Count of operations + /// + uint32_t operationsCount; + + /// + /// (Optional) The type of operation that was run. + /// + _Maybenull_ _Null_terminated_ const char* operationType; + + /// + /// (Optional) Additional details about the transaction. Null if it was not a purchase operation. + /// + _Maybenull_ PFInventoryTransactionPurchaseDetails const* purchaseDetails; + + /// + /// (Optional) Additional details about the transaction. Null if it was not a redeem operation. + /// + _Maybenull_ PFInventoryTransactionRedeemDetails const* redeemDetails; + + /// + /// The time this transaction occurred in UTC. + /// + time_t timestamp; + + /// + /// (Optional) The id of the transaction. This should be treated like an opaque token. + /// + _Maybenull_ _Null_terminated_ const char* transactionId; + + /// + /// (Optional) Additional details about the transaction. Null if it was not a transfer operation. + /// + _Maybenull_ PFInventoryTransactionTransferDetails const* transferDetails; + +} PFInventoryTransaction; + +/// +/// PFInventoryGetTransactionHistoryResponse data model. +/// +typedef struct PFInventoryGetTransactionHistoryResponse +{ + /// + /// (Optional) An opaque token used to retrieve the next page of items, if any are available. Should + /// be null on initial request. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) The requested inventory transactions. + /// + _Maybenull_ _Field_size_(transactionsCount) PFInventoryTransaction const* const* transactions; + + /// + /// Count of transactions + /// + uint32_t transactionsCount; + +} PFInventoryGetTransactionHistoryResponse; + +/// +/// PFInventoryPurchaseInventoryItemsRequest data model. Purchase a single item or bundle, paying the +/// associated price. +/// +typedef struct PFInventoryPurchaseInventoryItemsRequest +{ + /// + /// (Optional) The amount to purchase. + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// The number of inventory collections is unlimited. + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from + /// the inventory. (Default=false). + /// + bool deleteEmptyStacks; + + /// + /// (Optional) The duration to purchase. + /// + _Maybenull_ double const* durationInSeconds; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The Idempotency ID for this request. Idempotency IDs can be used to prevent operation + /// replay in the medium term but will be garbage collected eventually. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The inventory item the request applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + + /// + /// (Optional) The values to apply to a stack newly created by this request. + /// + _Maybenull_ PFInventoryInitialValues const* newStackValues; + + /// + /// (Optional) The per-item price the item is expected to be purchased at. This must match a value + /// configured in the Catalog or specified Store. . + /// + _Maybenull_ _Field_size_(priceAmountsCount) PFInventoryPurchasePriceAmount const* const* priceAmounts; + + /// + /// Count of priceAmounts + /// + uint32_t priceAmountsCount; + + /// + /// (Optional) The id of the Store to purchase the item from. + /// + _Maybenull_ _Null_terminated_ const char* storeId; + +} PFInventoryPurchaseInventoryItemsRequest; + +/// +/// PFInventoryPurchaseInventoryItemsResponse data model. +/// +typedef struct PFInventoryPurchaseInventoryItemsResponse +{ + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The idempotency id used in the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The ids of transactions that occurred as a result of the request. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryPurchaseInventoryItemsResponse; + +/// +/// PFInventoryRedeemAppleAppStoreInventoryItemsRequest data model. Redeem items from the Apple App Store. +/// +typedef struct PFInventoryRedeemAppleAppStoreInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The receipt provided by the Apple marketplace upon successful purchase. + /// + _Maybenull_ _Null_terminated_ const char* receipt; + +} PFInventoryRedeemAppleAppStoreInventoryItemsRequest; + +/// +/// PFInventoryRedemptionFailure data model. +/// +typedef struct PFInventoryRedemptionFailure +{ + /// + /// (Optional) The marketplace failure code. + /// + _Maybenull_ _Null_terminated_ const char* failureCode; + + /// + /// (Optional) The marketplace error details explaining why the offer failed to redeem. + /// + _Maybenull_ _Null_terminated_ const char* failureDetails; + + /// + /// (Optional) The transaction id in the external marketplace. + /// + _Maybenull_ _Null_terminated_ const char* marketplaceTransactionId; + + /// + /// (Optional) The ID of the offer being redeemed. + /// + _Maybenull_ _Null_terminated_ const char* offerId; + +} PFInventoryRedemptionFailure; + +/// +/// PFInventoryRedemptionSuccess data model. +/// +typedef struct PFInventoryRedemptionSuccess +{ + /// + /// (Optional) The transaction id in the external marketplace. + /// + _Maybenull_ _Null_terminated_ const char* marketplaceTransactionId; + + /// + /// (Optional) The ID of the offer being redeemed. + /// + _Maybenull_ _Null_terminated_ const char* offerId; + + /// + /// The timestamp for when the redeem was completed. + /// + time_t successTimestamp; + +} PFInventoryRedemptionSuccess; + +/// +/// PFInventoryRedeemAppleAppStoreInventoryItemsResponse data model. +/// +typedef struct PFInventoryRedeemAppleAppStoreInventoryItemsResponse +{ + /// + /// (Optional) The list of failed redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(failedCount) PFInventoryRedemptionFailure const* const* failed; + + /// + /// Count of failed + /// + uint32_t failedCount; + + /// + /// (Optional) The list of successful redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(succeededCount) PFInventoryRedemptionSuccess const* const* succeeded; + + /// + /// Count of succeeded + /// + uint32_t succeededCount; + + /// + /// (Optional) The Transaction IDs associated with the inventory modifications. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryRedeemAppleAppStoreInventoryItemsResponse; + +/// +/// PFInventoryGooglePlayProductPurchase data model. +/// +typedef struct PFInventoryGooglePlayProductPurchase +{ + /// + /// (Optional) The Product ID (SKU) of the InApp product purchased from the Google Play store. + /// + _Maybenull_ _Null_terminated_ const char* productId; + + /// + /// (Optional) The token provided to the player's device when the product was purchased. + /// + _Maybenull_ _Null_terminated_ const char* token; + +} PFInventoryGooglePlayProductPurchase; + +/// +/// PFInventoryRedeemGooglePlayInventoryItemsRequest data model. Redeem items from the Google Play Store. +/// +typedef struct PFInventoryRedeemGooglePlayInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The list of purchases to redeem. + /// + _Maybenull_ _Field_size_(purchasesCount) PFInventoryGooglePlayProductPurchase const* const* purchases; + + /// + /// Count of purchases + /// + uint32_t purchasesCount; + +} PFInventoryRedeemGooglePlayInventoryItemsRequest; + +/// +/// PFInventoryRedeemGooglePlayInventoryItemsResponse data model. +/// +typedef struct PFInventoryRedeemGooglePlayInventoryItemsResponse +{ + /// + /// (Optional) The list of failed redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(failedCount) PFInventoryRedemptionFailure const* const* failed; + + /// + /// Count of failed + /// + uint32_t failedCount; + + /// + /// (Optional) The list of successful redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(succeededCount) PFInventoryRedemptionSuccess const* const* succeeded; + + /// + /// Count of succeeded + /// + uint32_t succeededCount; + + /// + /// (Optional) The Transaction IDs associated with the inventory modifications. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryRedeemGooglePlayInventoryItemsResponse; + +/// +/// PFInventoryRedeemMicrosoftStoreInventoryItemsRequest data model. Redeem items from the Microsoft +/// Store. +/// +typedef struct PFInventoryRedeemMicrosoftStoreInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The OneStore Collections Id Key used for AAD authentication. + /// + _Maybenull_ _Null_terminated_ const char* collectionsIdKey; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + +#if HC_PLATFORM == HC_PLATFORM_GDK + /// + /// XUserHandle used for delegated Microsoft Store authentication. + /// + XUserHandle user; +#else + /// + /// (Optional) Xbox Token used for delegated business partner authentication. + /// + _Maybenull_ _Null_terminated_ const char* xboxToken; +#endif + +} PFInventoryRedeemMicrosoftStoreInventoryItemsRequest; + +/// +/// PFInventoryRedeemMicrosoftStoreInventoryItemsResponse data model. +/// +typedef struct PFInventoryRedeemMicrosoftStoreInventoryItemsResponse +{ + /// + /// (Optional) The list of failed redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(failedCount) PFInventoryRedemptionFailure const* const* failed; + + /// + /// Count of failed + /// + uint32_t failedCount; + + /// + /// (Optional) The list of successful redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(succeededCount) PFInventoryRedemptionSuccess const* const* succeeded; + + /// + /// Count of succeeded + /// + uint32_t succeededCount; + + /// + /// (Optional) The Transaction IDs associated with the inventory modifications. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryRedeemMicrosoftStoreInventoryItemsResponse; + +/// +/// PFInventoryRedeemNintendoEShopInventoryItemsRequest data model. Redeem items from the Nintendo EShop. +/// +typedef struct PFInventoryRedeemNintendoEShopInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The Nintendo provided token authorizing redemption. + /// + _Maybenull_ _Null_terminated_ const char* nintendoServiceAccountIdToken; + +} PFInventoryRedeemNintendoEShopInventoryItemsRequest; + +/// +/// PFInventoryRedeemNintendoEShopInventoryItemsResponse data model. +/// +typedef struct PFInventoryRedeemNintendoEShopInventoryItemsResponse +{ + /// + /// (Optional) The list of failed redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(failedCount) PFInventoryRedemptionFailure const* const* failed; + + /// + /// Count of failed + /// + uint32_t failedCount; + + /// + /// (Optional) The list of successful redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(succeededCount) PFInventoryRedemptionSuccess const* const* succeeded; + + /// + /// Count of succeeded + /// + uint32_t succeededCount; + + /// + /// (Optional) The Transaction IDs associated with the inventory modifications. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryRedeemNintendoEShopInventoryItemsResponse; + +/// +/// PFInventoryRedeemPlayStationStoreInventoryItemsRequest data model. Redeem items from the PlayStation +/// Store. +/// +typedef struct PFInventoryRedeemPlayStationStoreInventoryItemsRequest +{ + /// + /// (Optional) Auth code returned by PlayStation :tm: Network OAuth system. + /// + _Maybenull_ _Null_terminated_ const char* authorizationCode; + + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) Redirect URI supplied to PlayStation :tm: Network when requesting an auth code. + /// + _Maybenull_ _Null_terminated_ const char* redirectUri; + + /// + /// (Optional) Optional Service Label to pass into the request. + /// + _Maybenull_ _Null_terminated_ const char* serviceLabel; + +} PFInventoryRedeemPlayStationStoreInventoryItemsRequest; + +/// +/// PFInventoryRedeemPlayStationStoreInventoryItemsResponse data model. +/// +typedef struct PFInventoryRedeemPlayStationStoreInventoryItemsResponse +{ + /// + /// (Optional) The list of failed redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(failedCount) PFInventoryRedemptionFailure const* const* failed; + + /// + /// Count of failed + /// + uint32_t failedCount; + + /// + /// (Optional) The list of successful redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(succeededCount) PFInventoryRedemptionSuccess const* const* succeeded; + + /// + /// Count of succeeded + /// + uint32_t succeededCount; + + /// + /// (Optional) The Transaction IDs associated with the inventory modifications. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryRedeemPlayStationStoreInventoryItemsResponse; + +/// +/// PFInventoryRedeemSteamInventoryItemsRequest data model. Redeem inventory items from Steam. +/// +typedef struct PFInventoryRedeemSteamInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFInventoryRedeemSteamInventoryItemsRequest; + +/// +/// PFInventoryRedeemSteamInventoryItemsResponse data model. +/// +typedef struct PFInventoryRedeemSteamInventoryItemsResponse +{ + /// + /// (Optional) The list of failed redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(failedCount) PFInventoryRedemptionFailure const* const* failed; + + /// + /// Count of failed + /// + uint32_t failedCount; + + /// + /// (Optional) The list of successful redemptions from the external marketplace. + /// + _Maybenull_ _Field_size_(succeededCount) PFInventoryRedemptionSuccess const* const* succeeded; + + /// + /// Count of succeeded + /// + uint32_t succeededCount; + + /// + /// (Optional) The Transaction IDs associated with the inventory modifications. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryRedeemSteamInventoryItemsResponse; + +/// +/// PFInventorySubtractInventoryItemsRequest data model. Given an entity type, entity identifier and +/// container details, will subtract the specified inventory items. . +/// +typedef struct PFInventorySubtractInventoryItemsRequest +{ + /// + /// (Optional) The amount to subtract for the current item. + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// The number of inventory collections is unlimited. + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from + /// the inventory. (Default=false). + /// + bool deleteEmptyStacks; + + /// + /// (Optional) The duration to subtract from the current item expiration date. + /// + _Maybenull_ double const* durationInSeconds; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The Idempotency ID for this request. Idempotency IDs can be used to prevent operation + /// replay in the medium term but will be garbage collected eventually. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The inventory item the request applies to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* item; + +} PFInventorySubtractInventoryItemsRequest; + +/// +/// PFInventorySubtractInventoryItemsResponse data model. +/// +typedef struct PFInventorySubtractInventoryItemsResponse +{ + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The idempotency id used in the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The ids of transactions that occurred as a result of the request. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventorySubtractInventoryItemsResponse; + +/// +/// PFInventoryTransferInventoryItemsRequest data model. Transfer the specified inventory items of an +/// entity's container Id to another entity's container Id. +/// +typedef struct PFInventoryTransferInventoryItemsRequest +{ + /// + /// (Optional) The amount to transfer . + /// + _Maybenull_ int32_t const* amount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from + /// the inventory. (Default = false). + /// + bool deleteEmptyStacks; + + /// + /// (Optional) The inventory collection id the request is transferring from. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* givingCollectionId; + + /// + /// (Optional) The entity the request is transferring from. Set to the caller by default. + /// + _Maybenull_ PFEntityKey const* givingEntity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources (before transferring + /// from). More information about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* givingETag; + + /// + /// (Optional) The inventory item the request is transferring from. + /// + _Maybenull_ PFInventoryInventoryItemReference const* givingItem; + + /// + /// (Optional) The idempotency id for the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The values to apply to a stack newly created by this request. + /// + _Maybenull_ PFInventoryInitialValues const* newStackValues; + + /// + /// (Optional) The inventory collection id the request is transferring to. (Default="default"). + /// + _Maybenull_ _Null_terminated_ const char* receivingCollectionId; + + /// + /// (Optional) The entity the request is transferring to. Set to the caller by default. + /// + _Maybenull_ PFEntityKey const* receivingEntity; + + /// + /// (Optional) The inventory item the request is transferring to. + /// + _Maybenull_ PFInventoryInventoryItemReference const* receivingItem; + +} PFInventoryTransferInventoryItemsRequest; + +/// +/// PFInventoryTransferInventoryItemsResponse data model. +/// +typedef struct PFInventoryTransferInventoryItemsResponse +{ + /// + /// (Optional) ETags are used for concurrency checking when updating resources (after transferring + /// from). More information about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* givingETag; + + /// + /// (Optional) The ids of transactions that occurred as a result of the request's giving action. + /// + _Maybenull_ _Field_size_(givingTransactionIdsCount) const char* const* givingTransactionIds; + + /// + /// Count of givingTransactionIds + /// + uint32_t givingTransactionIdsCount; + + /// + /// (Optional) The idempotency id for the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The ids of transactions that occurred as a result of the request's receiving action. + /// + _Maybenull_ _Field_size_(receivingTransactionIdsCount) const char* const* receivingTransactionIds; + + /// + /// Count of receivingTransactionIds + /// + uint32_t receivingTransactionIdsCount; + +} PFInventoryTransferInventoryItemsResponse; + +/// +/// PFInventoryUpdateInventoryItemsRequest data model. Given an entity type, entity identifier and container +/// details, will update the entity's inventory items. +/// +typedef struct PFInventoryUpdateInventoryItemsRequest +{ + /// + /// (Optional) The id of the entity's collection to perform this action on. (Default="default"). + /// The number of inventory collections is unlimited. + /// + _Maybenull_ _Null_terminated_ const char* collectionId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The entity to perform this action on. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The Idempotency ID for this request. Idempotency IDs can be used to prevent operation + /// replay in the medium term but will be garbage collected eventually. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The inventory item to update with the specified values. + /// + _Maybenull_ PFInventoryInventoryItem const* item; + +} PFInventoryUpdateInventoryItemsRequest; + +/// +/// PFInventoryUpdateInventoryItemsResponse data model. +/// +typedef struct PFInventoryUpdateInventoryItemsResponse +{ + /// + /// (Optional) ETags are used for concurrency checking when updating resources. More information + /// about using ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags. + /// + _Maybenull_ _Null_terminated_ const char* eTag; + + /// + /// (Optional) The idempotency id used in the request. + /// + _Maybenull_ _Null_terminated_ const char* idempotencyId; + + /// + /// (Optional) The ids of transactions that occurred as a result of the request. + /// + _Maybenull_ _Field_size_(transactionIdsCount) const char* const* transactionIds; + + /// + /// Count of transactionIds + /// + uint32_t transactionIdsCount; + +} PFInventoryUpdateInventoryItemsResponse; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFLocalization.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFLocalization.h new file mode 100644 index 0000000..af57bb9 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFLocalization.h @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +#if 0 +/// +/// Retrieves the list of allowed languages, only accessible by title entities +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFLocalizationGetLanguageListAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFLocalizationGetLanguageListRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetLanguageList call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFLocalizationGetLanguageListGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFLocalizationGetLanguageListAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFLocalizationGetLanguageListGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFLocalizationGetLanguageListResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFLocalizationTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFLocalizationTypes.h new file mode 100644 index 0000000..e8e3547 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFLocalizationTypes.h @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFLocalizationGetLanguageListRequest data model. +/// +typedef struct PFLocalizationGetLanguageListRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + +} PFLocalizationGetLanguageListRequest; + +/// +/// PFLocalizationGetLanguageListResponse data model. +/// +typedef struct PFLocalizationGetLanguageListResponse +{ + /// + /// (Optional) The list of allowed languages, in BCP47 two-letter format. + /// + _Maybenull_ _Field_size_(languageListCount) const char* const* languageList; + + /// + /// Count of languageList + /// + uint32_t languageListCount; + +} PFLocalizationGetLanguageListResponse; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServer.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServer.h new file mode 100644 index 0000000..5320ad2 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServer.h @@ -0,0 +1,277 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Lists details of all build aliases for a title. Accepts tokens for title and if game client access +/// is enabled, allows game client to request list of builds with player entity token. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Returns a list of summarized details of all multiplayer server builds for a title. See also MultiplayerServerCreateBuildWithManagedContainerAsync, +/// MultiplayerServerDeleteBuildAsync, MultiplayerServerGetBuildAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFMultiplayerServerListBuildAliasesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFMultiplayerServerListBuildAliasesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListBuildAliases call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, E_PF_MULTIPLAYER_SERVER_UNAVAILABLE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFMultiplayerServerListBuildAliasesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFMultiplayerServerListBuildAliasesAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, E_PF_MULTIPLAYER_SERVER_UNAVAILABLE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFMultiplayerServerListBuildAliasesGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerListBuildAliasesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Lists summarized details of all multiplayer server builds for a title. Accepts tokens for title and +/// if game client access is enabled, allows game client to request list of builds with player entity +/// token. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Returns a list of summarized details of all multiplayer server builds for a title. See also MultiplayerServerCreateBuildWithManagedContainerAsync, +/// MultiplayerServerDeleteBuildAsync, MultiplayerServerGetBuildAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFMultiplayerServerListBuildSummariesV2Async( + _In_ PFEntityHandle entityHandle, + _In_ const PFMultiplayerServerListBuildSummariesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListBuildSummariesV2 call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_TOO_MANY_REQUESTS, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, +/// E_PF_MULTIPLAYER_SERVER_UNAVAILABLE or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFMultiplayerServerListBuildSummariesV2GetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFMultiplayerServerListBuildSummariesV2Async call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_TOO_MANY_REQUESTS, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, +/// E_PF_MULTIPLAYER_SERVER_UNAVAILABLE or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFMultiplayerServerListBuildSummariesV2GetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerListBuildSummariesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Lists quality of service servers for the title. By default, servers are only returned for regions +/// where a Multiplayer Servers build has been deployed. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Returns a list of quality of service servers for a title. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFMultiplayerServerListQosServersForTitleAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFMultiplayerServerListQosServersForTitleRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ListQosServersForTitle call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, E_PF_MULTIPLAYER_SERVER_UNAVAILABLE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFMultiplayerServerListQosServersForTitleGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFMultiplayerServerListQosServersForTitleAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, E_PF_MULTIPLAYER_SERVER_UNAVAILABLE +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFMultiplayerServerListQosServersForTitleGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerListQosServersForTitleResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Request a multiplayer server session. Accepts tokens for title and if game client access is enabled, +/// allows game client to request a server with player entity token. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Requests a multiplayer server session from a particular build in any of the given preferred regions. +/// See also MultiplayerServerGetMultiplayerServerDetailsAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFMultiplayerServerRequestMultiplayerServerAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFMultiplayerServerRequestMultiplayerServerRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a RequestMultiplayerServer call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_TOO_MANY_REQUESTS, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, +/// E_PF_MULTIPLAYER_SERVER_UNAVAILABLE or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +PF_API PFMultiplayerServerRequestMultiplayerServerGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFMultiplayerServerRequestMultiplayerServerAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS, +/// E_PF_MULTIPLAYER_SERVER_BAD_REQUEST, E_PF_MULTIPLAYER_SERVER_FORBIDDEN, E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR, +/// E_PF_MULTIPLAYER_SERVER_NOT_FOUND, E_PF_MULTIPLAYER_SERVER_TOO_MANY_REQUESTS, E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED, +/// E_PF_MULTIPLAYER_SERVER_UNAVAILABLE or any of the global PlayFab Service errors. See doc page "Handling +/// PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFMultiplayerServerRequestMultiplayerServerGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerRequestMultiplayerServerResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServerTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServerTypes.h new file mode 100644 index 0000000..4a76fd3 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFMultiplayerServerTypes.h @@ -0,0 +1,784 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// AzureVmSize enum. +/// +enum class PFMultiplayerServerAzureVmSize : uint32_t +{ + Standard_A1, + Standard_A2, + Standard_A3, + Standard_A4, + Standard_A1_v2, + Standard_A2_v2, + Standard_A4_v2, + Standard_A8_v2, + Standard_D1_v2, + Standard_D2_v2, + Standard_D3_v2, + Standard_D4_v2, + Standard_D5_v2, + Standard_D2_v3, + Standard_D4_v3, + Standard_D8_v3, + Standard_D16_v3, + Standard_F1, + Standard_F2, + Standard_F4, + Standard_F8, + Standard_F16, + Standard_F2s_v2, + Standard_F4s_v2, + Standard_F8s_v2, + Standard_F16s_v2, + Standard_D2as_v4, + Standard_D4as_v4, + Standard_D8as_v4, + Standard_D16as_v4, + Standard_D2a_v4, + Standard_D4a_v4, + Standard_D8a_v4, + Standard_D16a_v4, + Standard_D2ads_v5, + Standard_D4ads_v5, + Standard_D8ads_v5, + Standard_D16ads_v5, + Standard_E2a_v4, + Standard_E4a_v4, + Standard_E8a_v4, + Standard_E16a_v4, + Standard_E2as_v4, + Standard_E4as_v4, + Standard_E8as_v4, + Standard_E16as_v4, + Standard_D2s_v3, + Standard_D4s_v3, + Standard_D8s_v3, + Standard_D16s_v3, + Standard_DS1_v2, + Standard_DS2_v2, + Standard_DS3_v2, + Standard_DS4_v2, + Standard_DS5_v2, + Standard_NC4as_T4_v3, + Standard_D2d_v4, + Standard_D4d_v4, + Standard_D8d_v4, + Standard_D16d_v4, + Standard_D2ds_v4, + Standard_D4ds_v4, + Standard_D8ds_v4, + Standard_D16ds_v4, + Standard_HB120_16rs_v3, + Standard_HB120_32rs_v3, + Standard_HB120_64rs_v3, + Standard_HB120_96rs_v3, + Standard_HB120rs_v3 +}; + +/// +/// ProtocolType enum. +/// +enum class PFMultiplayerServerProtocolType : uint32_t +{ + TCP, + UDP +}; + +/// +/// PFMultiplayerServerListBuildAliasesRequest data model. Returns a list of summarized details of all +/// multiplayer server builds for a title. +/// +typedef struct PFMultiplayerServerListBuildAliasesRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The page size for the request. + /// + _Maybenull_ int32_t const* pageSize; + + /// + /// (Optional) The skip token for the paged request. + /// + _Maybenull_ _Null_terminated_ const char* skipToken; + +} PFMultiplayerServerListBuildAliasesRequest; + +/// +/// PFMultiplayerServerBuildSelectionCriterion data model. +/// +typedef struct PFMultiplayerServerBuildSelectionCriterion +{ + /// + /// (Optional) Dictionary of build ids and their respective weights for distribution of allocation + /// requests. + /// + _Maybenull_ _Field_size_(buildWeightDistributionCount) struct PFUint32DictionaryEntry const* buildWeightDistribution; + + /// + /// Count of buildWeightDistribution + /// + uint32_t buildWeightDistributionCount; + +} PFMultiplayerServerBuildSelectionCriterion; + +/// +/// PFMultiplayerServerBuildAliasDetailsResponse data model. +/// +typedef struct PFMultiplayerServerBuildAliasDetailsResponse +{ + /// + /// (Optional) The guid string alias Id of the alias to be created or updated. + /// + _Maybenull_ _Null_terminated_ const char* aliasId; + + /// + /// (Optional) The alias name. + /// + _Maybenull_ _Null_terminated_ const char* aliasName; + + /// + /// (Optional) Array of build selection criteria. + /// + _Maybenull_ _Field_size_(buildSelectionCriteriaCount) PFMultiplayerServerBuildSelectionCriterion const* const* buildSelectionCriteria; + + /// + /// Count of buildSelectionCriteria + /// + uint32_t buildSelectionCriteriaCount; + +} PFMultiplayerServerBuildAliasDetailsResponse; + +/// +/// PFMultiplayerServerListBuildAliasesResponse data model. +/// +typedef struct PFMultiplayerServerListBuildAliasesResponse +{ + /// + /// (Optional) The list of build aliases for the title. + /// + _Maybenull_ _Field_size_(buildAliasesCount) PFMultiplayerServerBuildAliasDetailsResponse const* const* buildAliases; + + /// + /// Count of buildAliases + /// + uint32_t buildAliasesCount; + + /// + /// The page size on the response. + /// + int32_t pageSize; + + /// + /// (Optional) The skip token for the paged response. + /// + _Maybenull_ _Null_terminated_ const char* skipToken; + +} PFMultiplayerServerListBuildAliasesResponse; + +/// +/// PFMultiplayerServerListBuildSummariesRequest data model. Returns a list of summarized details of +/// all multiplayer server builds for a title. +/// +typedef struct PFMultiplayerServerListBuildSummariesRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The page size for the request. + /// + _Maybenull_ int32_t const* pageSize; + + /// + /// (Optional) The skip token for the paged request. + /// + _Maybenull_ _Null_terminated_ const char* skipToken; + +} PFMultiplayerServerListBuildSummariesRequest; + +/// +/// PFMultiplayerServerCurrentServerStats data model. +/// +typedef struct PFMultiplayerServerCurrentServerStats +{ + /// + /// The number of active multiplayer servers. + /// + int32_t active; + + /// + /// The number of multiplayer servers still downloading game resources (such as assets). + /// + int32_t propping; + + /// + /// The number of standingby multiplayer servers. + /// + int32_t standingBy; + + /// + /// The total number of multiplayer servers. + /// + int32_t total; + +} PFMultiplayerServerCurrentServerStats; + +/// +/// PFMultiplayerServerDynamicStandbyThreshold data model. +/// +typedef struct PFMultiplayerServerDynamicStandbyThreshold +{ + /// + /// When the trigger threshold is reached, multiply by this value. + /// + double multiplier; + + /// + /// The multiplier will be applied when the actual standby divided by target standby floor is less + /// than this value. + /// + double triggerThresholdPercentage; + +} PFMultiplayerServerDynamicStandbyThreshold; + +/// +/// PFMultiplayerServerDynamicStandbySettings data model. +/// +typedef struct PFMultiplayerServerDynamicStandbySettings +{ + /// + /// (Optional) List of auto standing by trigger values and corresponding standing by multiplier. + /// Defaults to 1.5X at 50%, 3X at 25%, and 4X at 5%. + /// + _Maybenull_ _Field_size_(dynamicFloorMultiplierThresholdsCount) PFMultiplayerServerDynamicStandbyThreshold const* const* dynamicFloorMultiplierThresholds; + + /// + /// Count of dynamicFloorMultiplierThresholds + /// + uint32_t dynamicFloorMultiplierThresholdsCount; + + /// + /// When true, dynamic standby will be enabled. + /// + bool isEnabled; + + /// + /// (Optional) The time it takes to reduce target standing by to configured floor value after an + /// increase. Defaults to 30 minutes. + /// + _Maybenull_ int32_t const* rampDownSeconds; + +} PFMultiplayerServerDynamicStandbySettings; + +/// +/// PFMultiplayerServerSchedule data model. +/// +typedef struct PFMultiplayerServerSchedule +{ + /// + /// (Optional) A short description about this schedule. For example, "Game launch on July 15th". + /// + _Maybenull_ _Null_terminated_ const char* description; + + /// + /// The date and time in UTC at which the schedule ends. If IsRecurringWeekly is true, this schedule + /// will keep renewing for future weeks until disabled or removed. + /// + time_t endTime; + + /// + /// Disables the schedule. + /// + bool isDisabled; + + /// + /// If true, the StartTime and EndTime will get renewed every week. + /// + bool isRecurringWeekly; + + /// + /// The date and time in UTC at which the schedule starts. + /// + time_t startTime; + + /// + /// The standby target to maintain for the duration of the schedule. + /// + int32_t targetStandby; + +} PFMultiplayerServerSchedule; + +/// +/// PFMultiplayerServerScheduledStandbySettings data model. +/// +typedef struct PFMultiplayerServerScheduledStandbySettings +{ + /// + /// When true, scheduled standby will be enabled. + /// + bool isEnabled; + + /// + /// (Optional) A list of non-overlapping schedules. + /// + _Maybenull_ _Field_size_(scheduleListCount) PFMultiplayerServerSchedule const* const* scheduleList; + + /// + /// Count of scheduleList + /// + uint32_t scheduleListCount; + +} PFMultiplayerServerScheduledStandbySettings; + +/// +/// PFMultiplayerServerBuildRegion data model. +/// +typedef struct PFMultiplayerServerBuildRegion +{ + /// + /// (Optional) The current multiplayer server stats for the region. + /// + _Maybenull_ PFMultiplayerServerCurrentServerStats const* currentServerStats; + + /// + /// (Optional) Optional settings to control dynamic adjustment of standby target. + /// + _Maybenull_ PFMultiplayerServerDynamicStandbySettings const* dynamicStandbySettings; + + /// + /// Whether the game assets provided for the build have been replicated to this region. + /// + bool isAssetReplicationComplete; + + /// + /// The maximum number of multiplayer servers for the region. + /// + int32_t maxServers; + + /// + /// (Optional) Regional override for the number of multiplayer servers to host on a single VM of + /// the build. + /// + _Maybenull_ int32_t const* multiplayerServerCountPerVm; + + /// + /// (Optional) The build region. + /// + _Maybenull_ _Null_terminated_ const char* region; + + /// + /// (Optional) Optional settings to set the standby target to specified values during the supplied + /// schedules. + /// + _Maybenull_ PFMultiplayerServerScheduledStandbySettings const* scheduledStandbySettings; + + /// + /// The target number of standby multiplayer servers for the region. + /// + int32_t standbyServers; + + /// + /// (Optional) The status of multiplayer servers in the build region. Valid values are - Unknown, + /// Initialized, Deploying, Deployed, Unhealthy, Deleting, Deleted. + /// + _Maybenull_ _Null_terminated_ const char* status; + + /// + /// (Optional) Regional override for the VM size the build was created on. + /// + _Maybenull_ PFMultiplayerServerAzureVmSize const* vmSize; + +} PFMultiplayerServerBuildRegion; + +/// +/// PFMultiplayerServerBuildSummary data model. +/// +typedef struct PFMultiplayerServerBuildSummary +{ + /// + /// (Optional) The guid string build ID of the build. + /// + _Maybenull_ _Null_terminated_ const char* buildId; + + /// + /// (Optional) The build name. + /// + _Maybenull_ _Null_terminated_ const char* buildName; + + /// + /// (Optional) The time the build was created in UTC. + /// + _Maybenull_ time_t const* creationTime; + + /// + /// (Optional) The metadata of the build. + /// + _Maybenull_ _Field_size_(metadataCount) struct PFStringDictionaryEntry const* metadata; + + /// + /// Count of metadata + /// + uint32_t metadataCount; + + /// + /// (Optional) The configuration and status for each region in the build. + /// + _Maybenull_ _Field_size_(regionConfigurationsCount) PFMultiplayerServerBuildRegion const* const* regionConfigurations; + + /// + /// Count of regionConfigurations + /// + uint32_t regionConfigurationsCount; + +} PFMultiplayerServerBuildSummary; + +/// +/// PFMultiplayerServerListBuildSummariesResponse data model. +/// +typedef struct PFMultiplayerServerListBuildSummariesResponse +{ + /// + /// (Optional) The list of build summaries for a title. + /// + _Maybenull_ _Field_size_(buildSummariesCount) PFMultiplayerServerBuildSummary const* const* buildSummaries; + + /// + /// Count of buildSummaries + /// + uint32_t buildSummariesCount; + + /// + /// The page size on the response. + /// + int32_t pageSize; + + /// + /// (Optional) The skip token for the paged response. + /// + _Maybenull_ _Null_terminated_ const char* skipToken; + +} PFMultiplayerServerListBuildSummariesResponse; + +/// +/// PFMultiplayerServerListQosServersForTitleRequest data model. Returns a list of quality of service +/// servers for a title. +/// +typedef struct PFMultiplayerServerListQosServersForTitleRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Indicates that the response should contain Qos servers for all regions, including + /// those where there are no builds deployed for the title. + /// + _Maybenull_ bool const* includeAllRegions; + +} PFMultiplayerServerListQosServersForTitleRequest; + +/// +/// PFMultiplayerServerQosServer data model. +/// +typedef struct PFMultiplayerServerQosServer +{ + /// + /// (Optional) The region the QoS server is located in. + /// + _Maybenull_ _Null_terminated_ const char* region; + + /// + /// (Optional) The QoS server URL. + /// + _Maybenull_ _Null_terminated_ const char* serverUrl; + +} PFMultiplayerServerQosServer; + +/// +/// PFMultiplayerServerListQosServersForTitleResponse data model. +/// +typedef struct PFMultiplayerServerListQosServersForTitleResponse +{ + /// + /// The page size on the response. + /// + int32_t pageSize; + + /// + /// (Optional) The list of QoS servers. + /// + _Maybenull_ _Field_size_(qosServersCount) PFMultiplayerServerQosServer const* const* qosServers; + + /// + /// Count of qosServers + /// + uint32_t qosServersCount; + + /// + /// (Optional) The skip token for the paged response. + /// + _Maybenull_ _Null_terminated_ const char* skipToken; + +} PFMultiplayerServerListQosServersForTitleResponse; + +/// +/// PFMultiplayerServerBuildAliasParams data model. +/// +typedef struct PFMultiplayerServerBuildAliasParams +{ + /// + /// The guid string alias ID to use for the request. + /// + _Null_terminated_ const char* aliasId; + +} PFMultiplayerServerBuildAliasParams; + +/// +/// PFMultiplayerServerRequestMultiplayerServerRequest data model. Requests a multiplayer server session +/// from a particular build in any of the given preferred regions. +/// +typedef struct PFMultiplayerServerRequestMultiplayerServerRequest +{ + /// + /// (Optional) The identifiers of the build alias to use for the request. + /// + _Maybenull_ PFMultiplayerServerBuildAliasParams const* buildAliasParams; + + /// + /// (Optional) The guid string build ID of the multiplayer server to request. + /// + _Maybenull_ _Null_terminated_ const char* buildId; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Initial list of players (potentially matchmade) allowed to connect to the game. This + /// list is passed to the game server when requested (via GSDK) and can be used to validate players + /// connecting to it. + /// + _Maybenull_ _Field_size_(initialPlayersCount) const char* const* initialPlayers; + + /// + /// Count of initialPlayers + /// + uint32_t initialPlayersCount; + + /// + /// The preferred regions to request a multiplayer server from. The Multiplayer Service will iterate + /// through the regions in the specified order and allocate a server from the first one that has servers + /// available. + /// + _Field_size_(preferredRegionsCount) const char* const* preferredRegions; + + /// + /// Count of preferredRegions + /// + uint32_t preferredRegionsCount; + + /// + /// (Optional) Data encoded as a string that is passed to the game server when requested. This can + /// be used to to communicate information such as game mode or map through the request flow. + /// + _Maybenull_ _Null_terminated_ const char* sessionCookie; + + /// + /// A guid string session ID created track the multiplayer server session over its life. + /// + _Null_terminated_ const char* sessionId; + +} PFMultiplayerServerRequestMultiplayerServerRequest; + +/// +/// PFMultiplayerServerConnectedPlayer data model. +/// +typedef struct PFMultiplayerServerConnectedPlayer +{ + /// + /// (Optional) The player ID of the player connected to the multiplayer server. + /// + _Maybenull_ _Null_terminated_ const char* playerId; + +} PFMultiplayerServerConnectedPlayer; + +/// +/// PFMultiplayerServerPort data model. +/// +typedef struct PFMultiplayerServerPort +{ + /// + /// The name for the port. + /// + _Null_terminated_ const char* name; + + /// + /// The number for the port. + /// + int32_t num; + + /// + /// The protocol for the port. + /// + PFMultiplayerServerProtocolType protocol; + +} PFMultiplayerServerPort; + +/// +/// PFMultiplayerServerPublicIpAddress data model. +/// +typedef struct PFMultiplayerServerPublicIpAddress +{ + /// + /// FQDN of the public IP. + /// + _Null_terminated_ const char* fQDN; + + /// + /// Server IP Address. + /// + _Null_terminated_ const char* ipAddress; + + /// + /// Routing Type of the public IP. + /// + _Null_terminated_ const char* routingType; + +} PFMultiplayerServerPublicIpAddress; + +/// +/// PFMultiplayerServerRequestMultiplayerServerResponse data model. +/// +typedef struct PFMultiplayerServerRequestMultiplayerServerResponse +{ + /// + /// (Optional) The identity of the build in which the server was allocated. + /// + _Maybenull_ _Null_terminated_ const char* buildId; + + /// + /// (Optional) The connected players in the multiplayer server. + /// + _Maybenull_ _Field_size_(connectedPlayersCount) PFMultiplayerServerConnectedPlayer const* const* connectedPlayers; + + /// + /// Count of connectedPlayers + /// + uint32_t connectedPlayersCount; + + /// + /// (Optional) The fully qualified domain name of the virtual machine that is hosting this multiplayer + /// server. + /// + _Maybenull_ _Null_terminated_ const char* fQDN; + + /// + /// (Optional) The public IPv4 address of the virtual machine that is hosting this multiplayer server. + /// + _Maybenull_ _Null_terminated_ const char* iPV4Address; + + /// + /// (Optional) The time (UTC) at which a change in the multiplayer server state was observed. + /// + _Maybenull_ time_t const* lastStateTransitionTime; + + /// + /// (Optional) The ports the multiplayer server uses. + /// + _Maybenull_ _Field_size_(portsCount) PFMultiplayerServerPort const* const* ports; + + /// + /// Count of ports + /// + uint32_t portsCount; + + /// + /// (Optional) The list of public Ipv4 addresses associated with the server. + /// + _Maybenull_ _Field_size_(publicIPV4AddressesCount) PFMultiplayerServerPublicIpAddress const* const* publicIPV4Addresses; + + /// + /// Count of publicIPV4Addresses + /// + uint32_t publicIPV4AddressesCount; + + /// + /// (Optional) The region the multiplayer server is located in. + /// + _Maybenull_ _Null_terminated_ const char* region; + + /// + /// (Optional) The string server ID of the multiplayer server generated by PlayFab. + /// + _Maybenull_ _Null_terminated_ const char* serverId; + + /// + /// (Optional) The guid string session ID of the multiplayer server. + /// + _Maybenull_ _Null_terminated_ const char* sessionId; + + /// + /// (Optional) The state of the multiplayer server. + /// + _Maybenull_ _Null_terminated_ const char* state; + + /// + /// (Optional) The virtual machine ID that the multiplayer server is located on. + /// + _Maybenull_ _Null_terminated_ const char* vmId; + +} PFMultiplayerServerRequestMultiplayerServerResponse; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecific.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecific.h new file mode 100644 index 0000000..bc250c1 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecific.h @@ -0,0 +1,144 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +#if 0 +/// +/// Registers the Android device to receive push notifications +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// More information can be found on configuring your game for the Google Cloud Messaging service in +/// the Google developer documentation, here: http://developer.android.com/google/gcm/client.html. The +/// steps to configure and send Push Notifications is described in the PlayFab tutorials, here: https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_NO_PUSH_NOTIFICATION_ARN_FOR_TITLE, E_PF_PUSH_SERVICE_ERROR or any of +/// the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFPlatformSpecificClientAndroidDevicePushNotificationRegistrationAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Uses the supplied OAuth code to refresh the internally cached player PlayStation :tm: Network auth +/// token +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_INVALID_PSN_AUTH_CODE, E_PF_PSN_INACCESSIBLE or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlatformSpecificClientRefreshPSNAuthTokenAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlatformSpecificRefreshPSNAuthTokenRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Registers the iOS device to receive push notifications +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// The steps to configure and send Push Notifications is described in the PlayFab tutorials, here: https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_NO_PUSH_NOTIFICATION_ARN_FOR_TITLE, E_PF_PUSH_SERVICE_ERROR or any of +/// the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error +/// handling. +/// +PF_API PFPlatformSpecificClientRegisterForIOSPushNotificationAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlatformSpecificRegisterForIOSPushNotificationRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Awards the specified users the specified Steam achievements +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlatformSpecificServerAwardSteamAchievementAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlatformSpecificAwardSteamAchievementRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerAwardSteamAchievement call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_USERIS_NOT_VALID +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlatformSpecificServerAwardSteamAchievementGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlatformSpecificServerAwardSteamAchievementAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_USERIS_NOT_VALID +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlatformSpecificServerAwardSteamAchievementGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlatformSpecificAwardSteamAchievementResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecificTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecificTypes.h new file mode 100644 index 0000000..fb7e25e --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlatformSpecificTypes.h @@ -0,0 +1,153 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest data model. More information can +/// be found on configuring your game for the Google Cloud Messaging service in the Google developer documentation, +/// here: http://developer.android.com/google/gcm/client.html. The steps to configure and send Push Notifications +/// is described in the PlayFab tutorials, here: https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart. +/// +typedef struct PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest +{ + /// + /// (Optional) Message to display when confirming push notification. + /// + _Maybenull_ _Null_terminated_ const char* confirmationMessage; + + /// + /// Registration ID provided by the Google Cloud Messaging service when the title registered to receive + /// push notifications (see the GCM documentation, here: http://developer.android.com/google/gcm/client.html). + /// + _Null_terminated_ const char* deviceToken; + + /// + /// (Optional) If true, send a test push message immediately after sucessful registration. Defaults + /// to false. + /// + _Maybenull_ bool const* sendPushNotificationConfirmation; + +} PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest; + +/// +/// PFPlatformSpecificRefreshPSNAuthTokenRequest data model. +/// +typedef struct PFPlatformSpecificRefreshPSNAuthTokenRequest +{ + /// + /// Auth code returned by PlayStation :tm: Network OAuth system. + /// + _Null_terminated_ const char* authCode; + + /// + /// (Optional) Id of the PlayStation :tm: Network issuer environment. If null, defaults to production + /// environment. + /// + _Maybenull_ int32_t const* issuerId; + + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code. + /// + _Null_terminated_ const char* redirectUri; + +} PFPlatformSpecificRefreshPSNAuthTokenRequest; + +/// +/// PFPlatformSpecificRegisterForIOSPushNotificationRequest data model. The steps to configure and send +/// Push Notifications is described in the PlayFab tutorials, here: https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart. +/// +typedef struct PFPlatformSpecificRegisterForIOSPushNotificationRequest +{ + /// + /// (Optional) Message to display when confirming push notification. + /// + _Maybenull_ _Null_terminated_ const char* confirmationMessage; + + /// + /// Unique token generated by the Apple Push Notification service when the title registered to receive + /// push notifications. + /// + _Null_terminated_ const char* deviceToken; + + /// + /// (Optional) If true, send a test push message immediately after sucessful registration. Defaults + /// to false. + /// + _Maybenull_ bool const* sendPushNotificationConfirmation; + +} PFPlatformSpecificRegisterForIOSPushNotificationRequest; + +/// +/// PFPlatformSpecificAwardSteamAchievementItem data model. +/// +typedef struct PFPlatformSpecificAwardSteamAchievementItem +{ + /// + /// Unique Steam achievement name. + /// + _Null_terminated_ const char* achievementName; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Result of the award attempt (only valid on response, not on request). + /// + bool result; + +} PFPlatformSpecificAwardSteamAchievementItem; + +/// +/// PFPlatformSpecificAwardSteamAchievementRequest data model. +/// +typedef struct PFPlatformSpecificAwardSteamAchievementRequest +{ + /// + /// Array of achievements to grant and the users to whom they are to be granted. + /// + _Field_size_(achievementsCount) PFPlatformSpecificAwardSteamAchievementItem const* const* achievements; + + /// + /// Count of achievements + /// + uint32_t achievementsCount; + +} PFPlatformSpecificAwardSteamAchievementRequest; + +/// +/// PFPlatformSpecificAwardSteamAchievementResult data model. +/// +typedef struct PFPlatformSpecificAwardSteamAchievementResult +{ + /// + /// (Optional) Array of achievements granted. + /// + _Maybenull_ _Field_size_(achievementResultsCount) PFPlatformSpecificAwardSteamAchievementItem const* const* achievementResults; + + /// + /// Count of achievementResults + /// + uint32_t achievementResultsCount; + +} PFPlatformSpecificAwardSteamAchievementResult; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagement.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagement.h new file mode 100644 index 0000000..2f23d5c --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagement.h @@ -0,0 +1,949 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Retrieves the title-specific custom data for the user which is readable and writable by the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Data is stored as JSON key-value pairs. Every time the data is updated via any source, the version +/// counter is incremented. If the Version parameter is provided, then this call will only return data +/// if the current version on the system is greater than the value provided. If the Keys parameter is +/// provided, the data object returned will only contain the data specific to the indicated Keys. Otherwise, +/// the full set of custom user data will be returned. See also ClientGetUserReadOnlyDataAsync, ClientUpdateUserDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementClientGetUserDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetUserData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementClientGetUserDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementClientGetUserDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementClientGetUserDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the publisher-specific custom data for the user which is readable and writable by the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ClientGetUserPublisherReadOnlyDataAsync, ClientUpdateUserPublisherDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementClientGetUserPublisherDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetUserPublisherData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementClientGetUserPublisherDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementClientGetUserPublisherDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementClientGetUserPublisherDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the publisher-specific custom data for the user which can only be read by the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ClientGetUserPublisherDataAsync, ClientUpdateUserPublisherDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementClientGetUserPublisherReadOnlyDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetUserPublisherReadOnlyData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementClientGetUserPublisherReadOnlyDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementClientGetUserPublisherReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementClientGetUserPublisherReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the title-specific custom data for the user which can only be read by the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Data is stored as JSON key-value pairs. Every time the data is updated via any source, the version +/// counter is incremented. If the Version parameter is provided, then this call will only return data +/// if the current version on the system is greater than the value provided. If the Keys parameter is +/// provided, the data object returned will only contain the data specific to the indicated Keys. Otherwise, +/// the full set of custom user data will be returned. See also ClientGetUserDataAsync, ClientUpdateUserDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementClientGetUserReadOnlyDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetUserReadOnlyData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementClientGetUserReadOnlyDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementClientGetUserReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementClientGetUserReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Creates and updates the title-specific custom data for the user which is readable and writable by +/// the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This function performs an additive update of the arbitrary strings containing the custom data for +/// the user. In updating the custom data object, keys which already exist in the object will have their +/// values overwritten, while keys with null values will be removed. New keys will be added, with the +/// given values. No other key-value pairs will be changed apart from those specified in the call. See +/// also ClientGetUserDataAsync, ClientGetUserReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementClientUpdateUserDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlayerDataManagementClientUpdateUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementClientUpdateUserDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementClientUpdateUserDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; + +/// +/// Creates and updates the publisher-specific custom data for the user which is readable and writable +/// by the client +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This function performs an additive update of the arbitrary strings containing the custom data for +/// the user. In updating the custom data object, keys which already exist in the object will have their +/// values overwritten, while keys with null values will be removed. New keys will be added, with the +/// given values. No other key-value pairs will be changed apart from those specified in the call. See +/// also ClientGetUserPublisherDataAsync, ClientGetUserPublisherReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementClientUpdateUserPublisherDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFPlayerDataManagementClientUpdateUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementClientUpdateUserPublisherDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementClientUpdateUserPublisherDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; + +#if 0 +/// +/// Retrieves the title-specific custom data for the user which is readable and writable by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserInternalDataAsync, ServerGetUserReadOnlyDataAsync, ServerUpdateUserDataAsync, +/// ServerUpdateUserInternalDataAsync, ServerUpdateUserReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementServerGetUserDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementServerGetUserDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerGetUserDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementServerGetUserDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title-specific custom data for the user which cannot be accessed by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserDataAsync, ServerGetUserReadOnlyDataAsync, ServerUpdateUserDataAsync, +/// ServerUpdateUserInternalDataAsync, ServerUpdateUserReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementServerGetUserInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserInternalData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementServerGetUserInternalDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerGetUserInternalDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementServerGetUserInternalDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the publisher-specific custom data for the user which is readable and writable by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserPublisherInternalDataAsync, ServerGetUserPublisherReadOnlyDataAsync, +/// ServerUpdateUserPublisherDataAsync, ServerUpdateUserPublisherInternalDataAsync, ServerUpdateUserPublisherReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserPublisherData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerGetUserPublisherDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserPublisherDataAsync, ServerGetUserPublisherReadOnlyDataAsync, +/// ServerUpdateUserPublisherDataAsync, ServerUpdateUserPublisherInternalDataAsync, ServerUpdateUserPublisherReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserPublisherInternalData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherInternalDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerGetUserPublisherInternalDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherInternalDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the publisher-specific custom data for the user which can only be read by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserPublisherDataAsync, ServerGetUserPublisherInternalDataAsync, +/// ServerUpdateUserPublisherDataAsync, ServerUpdateUserPublisherInternalDataAsync, ServerUpdateUserPublisherReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherReadOnlyDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserPublisherReadOnlyData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherReadOnlyDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerGetUserPublisherReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementServerGetUserPublisherReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title-specific custom data for the user which can only be read by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned +/// will only contain the data specific to the indicated Keys. Otherwise, the full set of custom user +/// data will be returned. See also ServerGetUserDataAsync, ServerGetUserInternalDataAsync, ServerUpdateUserDataAsync, +/// ServerUpdateUserInternalDataAsync, ServerUpdateUserReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFPlayerDataManagementServerGetUserReadOnlyDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetUserReadOnlyData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementServerGetUserReadOnlyDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerGetUserReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFPlayerDataManagementServerGetUserReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Updates the title-specific custom data for the user which is readable and writable by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, while keys with null values will be removed. No other key-value pairs will +/// be changed apart from those specified in the call. See also ServerGetUserDataAsync, ServerGetUserInternalDataAsync, +/// ServerGetUserReadOnlyDataAsync, ServerUpdateUserInternalDataAsync, ServerUpdateUserReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementServerUpdateUserDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerUpdateUserDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementServerUpdateUserDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Updates the title-specific custom data for the user which cannot be accessed by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, keys with null values will be removed. No other key-value pairs will be +/// changed apart from those specified in the call. See also ServerGetUserDataAsync, ServerGetUserInternalDataAsync, +/// ServerGetUserReadOnlyDataAsync, ServerUpdateUserDataAsync, ServerUpdateUserReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementServerUpdateUserInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementUpdateUserInternalDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerUpdateUserInternalDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementServerUpdateUserInternalDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Updates the publisher-specific custom data for the user which is readable and writable by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, while keys with null values will be removed. No other key-value pairs will +/// be changed apart from those specified in the call. See also ServerGetUserPublisherDataAsync, ServerGetUserPublisherInternalDataAsync, +/// ServerGetUserPublisherReadOnlyDataAsync, ServerUpdateUserPublisherInternalDataAsync, ServerUpdateUserPublisherReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementServerUpdateUserPublisherDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerUpdateUserPublisherDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementServerUpdateUserPublisherDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Updates the publisher-specific custom data for the user which cannot be accessed by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, keys with null values will be removed. No other key-value pairs will be +/// changed apart from those specified in the call. See also ServerGetUserPublisherDataAsync, ServerGetUserPublisherInternalDataAsync, +/// ServerGetUserPublisherReadOnlyDataAsync, ServerUpdateUserPublisherDataAsync, ServerUpdateUserPublisherReadOnlyDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementServerUpdateUserPublisherInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementUpdateUserInternalDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerUpdateUserPublisherInternalDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementServerUpdateUserPublisherInternalDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Updates the publisher-specific custom data for the user which can only be read by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, keys with null values will be removed. No other key-value pairs will be +/// changed apart from those specified in the call. See also ServerGetUserPublisherDataAsync, ServerGetUserPublisherInternalDataAsync, +/// ServerGetUserPublisherReadOnlyDataAsync, ServerUpdateUserPublisherDataAsync, ServerUpdateUserPublisherInternalDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; +#endif + +#if 0 +/// +/// Updates the title-specific custom data for the user which can only be read by the client +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This function performs an additive update of the arbitrary JSON object containing the custom data +/// for the user. In updating the custom data object, keys which already exist in the object will have +/// their values overwritten, keys with null values will be removed. No other key-value pairs will be +/// changed apart from those specified in the call. See also ServerGetUserDataAsync, ServerGetUserInternalDataAsync, +/// ServerGetUserReadOnlyDataAsync, ServerUpdateUserDataAsync, ServerUpdateUserInternalDataAsync. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFPlayerDataManagementServerUpdateUserReadOnlyDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFPlayerDataManagementServerUpdateUserReadOnlyDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFPlayerDataManagementUpdateUserDataResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPlayerDataManagementServerUpdateUserReadOnlyDataGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagementTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagementTypes.h new file mode 100644 index 0000000..1f5cb18 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFPlayerDataManagementTypes.h @@ -0,0 +1,278 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFPlayerDataManagementGetUserDataRequest data model. Data is stored as JSON key-value pairs. Every +/// time the data is updated via any source, the version counter is incremented. If the Version parameter +/// is provided, then this call will only return data if the current version on the system is greater +/// than the value provided. If the Keys parameter is provided, the data object returned will only contain +/// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. +/// +typedef struct PFPlayerDataManagementGetUserDataRequest +{ + /// + /// (Optional) The version that currently exists according to the caller. The call will return the + /// data for all of the keys if the version in the system is greater than this. + /// + _Maybenull_ uint32_t const* ifChangedFromDataVersion; + + /// + /// (Optional) List of unique keys to load from. + /// + _Maybenull_ _Field_size_(keysCount) const char* const* keys; + + /// + /// Count of keys + /// + uint32_t keysCount; + + /// + /// Unique PlayFab identifier of the user to load data for. Optional, defaults to yourself if not + /// set. When specified to a PlayFab id of another player, then this will only return public keys + /// for that account. + /// + _Null_terminated_ const char* playFabId; + +} PFPlayerDataManagementGetUserDataRequest; + +/// +/// PFPlayerDataManagementClientGetUserDataResult data model. +/// +typedef struct PFPlayerDataManagementClientGetUserDataResult +{ + /// + /// (Optional) User specific data for this title. + /// + _Maybenull_ _Field_size_(dataCount) struct PFUserDataRecordDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// Indicates the current version of the data that has been set. This is incremented with every set + /// call for that type of data (read-only, internal, etc). This version can be provided in Get calls + /// to find updated data. + /// + uint32_t dataVersion; + +} PFPlayerDataManagementClientGetUserDataResult; + +/// +/// PFPlayerDataManagementClientUpdateUserDataRequest data model. This function performs an additive +/// update of the arbitrary strings containing the custom data for the user. In updating the custom data +/// object, keys which already exist in the object will have their values overwritten, while keys with +/// null values will be removed. New keys will be added, with the given values. No other key-value pairs +/// will be changed apart from those specified in the call. +/// +typedef struct PFPlayerDataManagementClientUpdateUserDataRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, + /// are limited in size, and may not begin with a '!' character or be null. + /// + _Maybenull_ _Field_size_(dataCount) struct PFStringDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// (Optional) Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values + /// into Data due to language constraints. Use this to delete the keys directly. + /// + _Maybenull_ _Field_size_(keysToRemoveCount) const char* const* keysToRemove; + + /// + /// Count of keysToRemove + /// + uint32_t keysToRemoveCount; + + /// + /// (Optional) Permission to be applied to all user data keys written in this request. Defaults to + /// "private" if not set. This is used for requests by one player for information about another player; + /// those requests will only return Public keys. + /// + _Maybenull_ PFUserDataPermission const* permission; + +} PFPlayerDataManagementClientUpdateUserDataRequest; + +/// +/// PFPlayerDataManagementUpdateUserDataResult data model. +/// +typedef struct PFPlayerDataManagementUpdateUserDataResult +{ + /// + /// Indicates the current version of the data that has been set. This is incremented with every set + /// call for that type of data (read-only, internal, etc). This version can be provided in Get calls + /// to find updated data. + /// + uint32_t dataVersion; + +} PFPlayerDataManagementUpdateUserDataResult; + +/// +/// PFPlayerDataManagementServerGetUserDataResult data model. +/// +typedef struct PFPlayerDataManagementServerGetUserDataResult +{ + /// + /// (Optional) User specific data for this title. + /// + _Maybenull_ _Field_size_(dataCount) struct PFUserDataRecordDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// Indicates the current version of the data that has been set. This is incremented with every set + /// call for that type of data (read-only, internal, etc). This version can be provided in Get calls + /// to find updated data. + /// + uint32_t dataVersion; + + /// + /// (Optional) PlayFab unique identifier of the user whose custom data is being returned. + /// + _Maybenull_ _Null_terminated_ const char* playFabId; + +} PFPlayerDataManagementServerGetUserDataResult; + +/// +/// PFPlayerDataManagementServerUpdateUserDataRequest data model. This function performs an additive +/// update of the arbitrary JSON object containing the custom data for the user. In updating the custom +/// data object, keys which already exist in the object will have their values overwritten, while keys +/// with null values will be removed. No other key-value pairs will be changed apart from those specified +/// in the call. +/// +typedef struct PFPlayerDataManagementServerUpdateUserDataRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, + /// are limited in size, and may not begin with a '!' character or be null. + /// + _Maybenull_ _Field_size_(dataCount) struct PFStringDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// (Optional) Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values + /// into Data due to language constraints. Use this to delete the keys directly. + /// + _Maybenull_ _Field_size_(keysToRemoveCount) const char* const* keysToRemove; + + /// + /// Count of keysToRemove + /// + uint32_t keysToRemoveCount; + + /// + /// (Optional) Permission to be applied to all user data keys written in this request. Defaults to + /// "private" if not set. + /// + _Maybenull_ PFUserDataPermission const* permission; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFPlayerDataManagementServerUpdateUserDataRequest; + +/// +/// PFPlayerDataManagementUpdateUserInternalDataRequest data model. This function performs an additive +/// update of the arbitrary JSON object containing the custom data for the user. In updating the custom +/// data object, keys which already exist in the object will have their values overwritten, keys with +/// null values will be removed. No other key-value pairs will be changed apart from those specified in +/// the call. +/// +typedef struct PFPlayerDataManagementUpdateUserInternalDataRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, + /// are limited in size, and may not begin with a '!' character or be null. + /// + _Maybenull_ _Field_size_(dataCount) struct PFStringDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + + /// + /// (Optional) Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values + /// into Data due to language constraints. Use this to delete the keys directly. + /// + _Maybenull_ _Field_size_(keysToRemoveCount) const char* const* keysToRemove; + + /// + /// Count of keysToRemove + /// + uint32_t keysToRemoveCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFPlayerDataManagementUpdateUserInternalDataRequest; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFProfiles.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFProfiles.h new file mode 100644 index 0000000..f925cd3 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFProfiles.h @@ -0,0 +1,313 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Retrieves the entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an entity type and entity identifier will retrieve the profile from the entity store. If the +/// profile being retrieved is the caller's, then the read operation is consistent, if not it is an inconsistent +/// read. An inconsistent read means that we do not guarantee all committed writes have occurred before +/// reading the profile, allowing for a stale read. If consistency is important the Version Number on +/// the result can be used to compare which version of the profile any reader has. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFProfilesGetProfileAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFProfilesGetEntityProfileRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetProfile call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFProfilesGetProfileGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFProfilesGetProfileAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFProfilesGetProfileGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesGetEntityProfileResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the entity's profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given a set of entity types and entity identifiers will retrieve all readable profiles properties +/// for the caller. Profiles that the caller is not allowed to read will silently not be included in the +/// results. +/// +/// When the asynchronous task is complete, call and +/// to get the result. +/// +PF_API PFProfilesGetProfilesAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFProfilesGetEntityProfilesRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetProfiles call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFProfilesGetProfilesGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFProfilesGetProfilesAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFProfilesGetProfilesGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesGetEntityProfilesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the title player accounts associated with the given master player account. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given a master player account id (PlayFab ID), returns all title player accounts associated with +/// it. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a GetTitlePlayersFromMasterPlayerAccountIds call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Updates the entity's language. The precedence hierarchy for communication to the player is Title +/// Player Account language, Master Player Account language, and then title default language if the first +/// two aren't set or supported. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// Given an entity profile, will update its language to the one passed in if the profile's version is +/// equal to the one passed in. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFProfilesSetProfileLanguageAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFProfilesSetProfileLanguageRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a SetProfileLanguage call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFProfilesSetProfileLanguageGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFProfilesSetProfileLanguageAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFProfilesSetProfileLanguageGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesSetProfileLanguageResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Sets the profiles access policy +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This will set the access policy statements on the given entity profile. This is not additive, any +/// existing statements will be replaced with the statements in this request. See also ProfileGetProfileAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFProfilesSetProfilePolicyAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFProfilesSetEntityProfilePolicyRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a SetProfilePolicy call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFProfilesSetProfilePolicyGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFProfilesSetProfilePolicyAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFProfilesSetProfilePolicyGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesSetEntityProfilePolicyResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFProfilesTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFProfilesTypes.h new file mode 100644 index 0000000..d32cf9d --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFProfilesTypes.h @@ -0,0 +1,535 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// EffectType enum. +/// +enum class PFProfilesEffectType : uint32_t +{ + Allow, + Deny +}; + +/// +/// PFProfilesGetEntityProfileRequest data model. Given an entity type and entity identifier will retrieve +/// the profile from the entity store. If the profile being retrieved is the caller's, then the read operation +/// is consistent, if not it is an inconsistent read. An inconsistent read means that we do not guarantee +/// all committed writes have occurred before reading the profile, allowing for a stale read. If consistency +/// is important the Version Number on the result can be used to compare which version of the profile +/// any reader has. +/// +typedef struct PFProfilesGetEntityProfileRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Determines whether the objects will be returned as an escaped JSON string or as a + /// un-escaped JSON object. Default is JSON string. + /// + _Maybenull_ bool const* dataAsObject; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + +} PFProfilesGetEntityProfileRequest; + +/// +/// PFProfilesEntityProfileFileMetadata data model. An entity file's meta data. To get a download URL +/// call File/GetFiles API. +/// +typedef struct PFProfilesEntityProfileFileMetadata +{ + /// + /// (Optional) Checksum value for the file, can be used to check if the file on the server has changed. + /// + _Maybenull_ _Null_terminated_ const char* checksum; + + /// + /// (Optional) Name of the file. + /// + _Maybenull_ _Null_terminated_ const char* fileName; + + /// + /// Last UTC time the file was modified. + /// + time_t lastModified; + + /// + /// Storage service's reported byte count. + /// + int32_t size; + +} PFProfilesEntityProfileFileMetadata; + +/// +/// PFProfilesEntityDataObject data model. An entity object and its associated meta data. +/// +typedef struct PFProfilesEntityDataObject +{ + /// + /// (Optional) Un-escaped JSON object, if DataAsObject is true. + /// + PFJsonObject dataObject; + + /// + /// (Optional) Escaped string JSON body of the object, if DataAsObject is default or false. + /// + _Maybenull_ _Null_terminated_ const char* escapedDataObject; + + /// + /// (Optional) Name of this object. + /// + _Maybenull_ _Null_terminated_ const char* objectName; + +} PFProfilesEntityDataObject; + +/// +/// PFProfilesEntityPermissionStatement data model. +/// +typedef struct PFProfilesEntityPermissionStatement +{ + /// + /// The action this statement effects. May be 'Read', 'Write' or '*' for both read and write. + /// + _Null_terminated_ const char* action; + + /// + /// (Optional) A comment about the statement. Intended solely for bookkeeping and debugging. + /// + _Maybenull_ _Null_terminated_ const char* comment; + + /// + /// (Optional) Additional conditions to be applied for entity resources. + /// + PFJsonObject condition; + + /// + /// The effect this statement will have. It may be either Allow or Deny. + /// + PFProfilesEffectType effect; + + /// + /// The principal this statement will effect. + /// + PFJsonObject principal; + + /// + /// The resource this statements effects. Similar to 'pfrn:data--title![Title ID]/Profile/*'. + /// + _Null_terminated_ const char* resource; + +} PFProfilesEntityPermissionStatement; + +/// +/// PFProfilesEntityStatisticValue data model. +/// +typedef struct PFProfilesEntityStatisticValue +{ + /// + /// (Optional) Metadata associated with the Statistic. + /// + _Maybenull_ _Null_terminated_ const char* metadata; + + /// + /// (Optional) Statistic name. + /// + _Maybenull_ _Null_terminated_ const char* name; + + /// + /// (Optional) Statistic value. + /// + _Maybenull_ int32_t const* value; + + /// + /// Statistic version. + /// + int32_t version; + +} PFProfilesEntityStatisticValue; + +/// +/// PFProfilesEntityProfileBody data model. +/// +typedef struct PFProfilesEntityProfileBody +{ + /// + /// (Optional) Avatar URL for the entity. + /// + _Maybenull_ _Null_terminated_ const char* avatarUrl; + + /// + /// The creation time of this profile in UTC. + /// + time_t created; + + /// + /// (Optional) The display name of the entity. This field may serve different purposes for different + /// entity types. i.e.: for a title player account it could represent the display name of the player, + /// whereas on a character it could be character's name. + /// + _Maybenull_ _Null_terminated_ const char* displayName; + + /// + /// (Optional) The entity id and type. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The chain of responsibility for this entity. Use Lineage. + /// + _Maybenull_ _Null_terminated_ const char* entityChain; + + /// + /// (Optional) The experiment variants of this profile. + /// + _Maybenull_ _Field_size_(experimentVariantsCount) const char* const* experimentVariants; + + /// + /// Count of experimentVariants + /// + uint32_t experimentVariantsCount; + + /// + /// (Optional) The files on this profile. + /// + _Maybenull_ _Field_size_(filesCount) struct PFProfilesEntityProfileFileMetadataDictionaryEntry const* files; + + /// + /// Count of files + /// + uint32_t filesCount; + + /// + /// (Optional) The language on this profile. + /// + _Maybenull_ _Null_terminated_ const char* language; + + /// + /// (Optional) The lineage of this profile. + /// + _Maybenull_ PFEntityLineage const* lineage; + + /// + /// (Optional) The objects on this profile. + /// + _Maybenull_ _Field_size_(objectsCount) struct PFProfilesEntityDataObjectDictionaryEntry const* objects; + + /// + /// Count of objects + /// + uint32_t objectsCount; + + /// + /// (Optional) The permissions that govern access to this entity profile and its properties. Only + /// includes permissions set on this profile, not global statements from titles and namespaces. + /// + _Maybenull_ _Field_size_(permissionsCount) PFProfilesEntityPermissionStatement const* const* permissions; + + /// + /// Count of permissions + /// + uint32_t permissionsCount; + + /// + /// (Optional) The statistics on this profile. + /// + _Maybenull_ _Field_size_(statisticsCount) struct PFProfilesEntityStatisticValueDictionaryEntry const* statistics; + + /// + /// Count of statistics + /// + uint32_t statisticsCount; + + /// + /// The version number of the profile in persistent storage at the time of the read. Used for optional + /// optimistic concurrency during update. + /// + int32_t versionNumber; + +} PFProfilesEntityProfileBody; + +/// +/// PFProfilesGetEntityProfileResponse data model. +/// +typedef struct PFProfilesGetEntityProfileResponse +{ + /// + /// (Optional) Entity profile. + /// + _Maybenull_ PFProfilesEntityProfileBody const* profile; + +} PFProfilesGetEntityProfileResponse; + +/// +/// PFProfilesGetEntityProfilesRequest data model. Given a set of entity types and entity identifiers +/// will retrieve all readable profiles properties for the caller. Profiles that the caller is not allowed +/// to read will silently not be included in the results. +/// +typedef struct PFProfilesGetEntityProfilesRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Determines whether the objects will be returned as an escaped JSON string or as a + /// un-escaped JSON object. Default is JSON string. + /// + _Maybenull_ bool const* dataAsObject; + + /// + /// Entity keys of the profiles to load. Must be between 1 and 25. + /// + _Field_size_(entitiesCount) PFEntityKey const* const* entities; + + /// + /// Count of entities + /// + uint32_t entitiesCount; + +} PFProfilesGetEntityProfilesRequest; + +/// +/// PFProfilesGetEntityProfilesResponse data model. +/// +typedef struct PFProfilesGetEntityProfilesResponse +{ + /// + /// (Optional) Entity profiles. + /// + _Maybenull_ _Field_size_(profilesCount) PFProfilesEntityProfileBody const* const* profiles; + + /// + /// Count of profiles + /// + uint32_t profilesCount; + +} PFProfilesGetEntityProfilesResponse; + +/// +/// PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest data model. Given a master player account +/// id (PlayFab ID), returns all title player accounts associated with it. +/// +typedef struct PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Master player account ids. + /// + _Field_size_(masterPlayerAccountIdsCount) const char* const* masterPlayerAccountIds; + + /// + /// Count of masterPlayerAccountIds + /// + uint32_t masterPlayerAccountIdsCount; + + /// + /// (Optional) Id of title to get players from. + /// + _Maybenull_ _Null_terminated_ const char* titleId; + +} PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest; + +/// +/// PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse data model. +/// +typedef struct PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse +{ + /// + /// (Optional) Optional id of title to get players from, required if calling using a master_player_account. + /// + _Maybenull_ _Null_terminated_ const char* titleId; + + /// + /// (Optional) Dictionary of master player ids mapped to title player entity keys and id pairs. + /// + _Maybenull_ _Field_size_(titlePlayerAccountsCount) struct PFEntityKeyDictionaryEntry const* titlePlayerAccounts; + + /// + /// Count of titlePlayerAccounts + /// + uint32_t titlePlayerAccountsCount; + +} PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse; + +/// +/// PFProfilesSetProfileLanguageRequest data model. Given an entity profile, will update its language +/// to the one passed in if the profile's version is equal to the one passed in. +/// +typedef struct PFProfilesSetProfileLanguageRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) The optional entity to perform this action on. Defaults to the currently logged in + /// entity. + /// + _Maybenull_ PFEntityKey const* entity; + + /// + /// (Optional) The expected version of a profile to perform this update on. + /// + _Maybenull_ int32_t const* expectedVersion; + + /// + /// (Optional) The language to set on the given entity. Deletes the profile's language if passed + /// in a null string. + /// + _Maybenull_ _Null_terminated_ const char* language; + +} PFProfilesSetProfileLanguageRequest; + +/// +/// PFProfilesSetProfileLanguageResponse data model. +/// +typedef struct PFProfilesSetProfileLanguageResponse +{ + /// + /// (Optional) The type of operation that occured on the profile's language. + /// + _Maybenull_ PFOperationTypes const* operationResult; + + /// + /// (Optional) The updated version of the profile after the language update. + /// + _Maybenull_ int32_t const* versionNumber; + +} PFProfilesSetProfileLanguageResponse; + +/// +/// PFProfilesSetEntityProfilePolicyRequest data model. This will set the access policy statements on +/// the given entity profile. This is not additive, any existing statements will be replaced with the +/// statements in this request. +/// +typedef struct PFProfilesSetEntityProfilePolicyRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// The entity to perform this action on. + /// + PFEntityKey const* entity; + + /// + /// The statements to include in the access policy. + /// + _Field_size_(statementsCount) PFProfilesEntityPermissionStatement const* const* statements; + + /// + /// Count of statements + /// + uint32_t statementsCount; + +} PFProfilesSetEntityProfilePolicyRequest; + +/// +/// PFProfilesSetEntityProfilePolicyResponse data model. +/// +typedef struct PFProfilesSetEntityProfilePolicyResponse +{ + /// + /// (Optional) The permissions that govern access to this entity profile and its properties. Only + /// includes permissions set on this profile, not global statements from titles and namespaces. + /// + _Maybenull_ _Field_size_(permissionsCount) PFProfilesEntityPermissionStatement const* const* permissions; + + /// + /// Count of permissions + /// + uint32_t permissionsCount; + +} PFProfilesSetEntityProfilePolicyResponse; + +/// +/// Dictionary entry for an associative array with PFProfilesEntityProfileFileMetadata values. +/// +typedef struct PFProfilesEntityProfileFileMetadataDictionaryEntry +{ + _Null_terminated_ const char* key; + PFProfilesEntityProfileFileMetadata const* value; +} PFProfilesEntityProfileFileMetadataDictionaryEntry; + +/// +/// Dictionary entry for an associative array with PFProfilesEntityDataObject values. +/// +typedef struct PFProfilesEntityDataObjectDictionaryEntry +{ + _Null_terminated_ const char* key; + PFProfilesEntityDataObject const* value; +} PFProfilesEntityDataObjectDictionaryEntry; + +/// +/// Dictionary entry for an associative array with PFProfilesEntityStatisticValue values. +/// +typedef struct PFProfilesEntityStatisticValueDictionaryEntry +{ + _Null_terminated_ const char* key; + PFProfilesEntityStatisticValue const* value; +} PFProfilesEntityStatisticValueDictionaryEntry; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotifications.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotifications.h new file mode 100644 index 0000000..1f51c4c --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotifications.h @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +#if 0 +/// +/// Sends an iOS/Android Push Notification to a specific user, if that user's device has been configured +/// for Push Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be +/// notified. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_PUSH_NOT_ENABLED_FOR_ACCOUNT, E_PF_PUSH_SERVICE_ERROR or any of the +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFPushNotificationsServerSendPushNotificationAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPushNotificationsSendPushNotificationRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Sends an iOS/Android Push Notification template to a specific user, if that user's device has been +/// configured for Push Notifications in PlayFab. If a user has linked both Android and iOS devices, both +/// will be notified. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_PUSH_NOT_ENABLED_FOR_ACCOUNT, E_PF_PUSH_NOTIFICATION_TEMPLATE_NOT_FOUND, +/// E_PF_PUSH_SERVICE_ERROR or any of the global PlayFab Service errors. See doc page "Handling PlayFab +/// Errors" for more details on error handling. +/// +PF_API PFPushNotificationsServerSendPushNotificationFromTemplateAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFPushNotificationsSendPushNotificationFromTemplateRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotificationsTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotificationsTypes.h new file mode 100644 index 0000000..304d60e --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFPushNotificationsTypes.h @@ -0,0 +1,174 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFPushNotificationsAdvancedPushPlatformMsg data model. +/// +typedef struct PFPushNotificationsAdvancedPushPlatformMsg +{ + /// + /// (Optional) Stops GoogleCloudMessaging notifications from including both notification and data + /// properties and instead only sends the data property. + /// + _Maybenull_ bool const* gCMDataOnly; + + /// + /// The Json the platform should receive. + /// + _Null_terminated_ const char* json; + + /// + /// The platform that should receive the Json. + /// + PFPushNotificationPlatform platform; + +} PFPushNotificationsAdvancedPushPlatformMsg; + +/// +/// PFPushNotificationsPushNotificationPackage data model. +/// +typedef struct PFPushNotificationsPushNotificationPackage +{ + /// + /// Numerical badge to display on App icon (iOS only). + /// + int32_t badge; + + /// + /// (Optional) This must be a JSON formatted object. For use with developer-created custom Push Notification + /// plugins. + /// + _Maybenull_ _Null_terminated_ const char* customData; + + /// + /// (Optional) Icon file to display with the message (Not supported for iOS). + /// + _Maybenull_ _Null_terminated_ const char* icon; + + /// + /// Content of the message (all platforms). + /// + _Null_terminated_ const char* message; + + /// + /// (Optional) Sound file to play with the message (all platforms). + /// + _Maybenull_ _Null_terminated_ const char* sound; + + /// + /// Title/Subject of the message. Not supported for iOS. + /// + _Null_terminated_ const char* title; + +} PFPushNotificationsPushNotificationPackage; + +/// +/// PFPushNotificationsSendPushNotificationRequest data model. +/// +typedef struct PFPushNotificationsSendPushNotificationRequest +{ + /// + /// (Optional) Allows you to provide precisely formatted json to target devices. This is an advanced + /// feature, allowing you to deliver to custom plugin logic, fields, or functionality not natively + /// supported by PlayFab. + /// + _Maybenull_ _Field_size_(advancedPlatformDeliveryCount) PFPushNotificationsAdvancedPushPlatformMsg const* const* advancedPlatformDelivery; + + /// + /// Count of advancedPlatformDelivery + /// + uint32_t advancedPlatformDeliveryCount; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Text of message to send. + /// + _Maybenull_ _Null_terminated_ const char* message; + + /// + /// (Optional) Defines all possible push attributes like message, title, icon, etc. Some parameters + /// are device specific - please see the PushNotificationPackage documentation for details. + /// + _Maybenull_ PFPushNotificationsPushNotificationPackage const* package; + + /// + /// PlayFabId of the recipient of the push notification. + /// + _Null_terminated_ const char* recipient; + + /// + /// (Optional) Subject of message to send (may not be displayed in all platforms). + /// + _Maybenull_ _Null_terminated_ const char* subject; + + /// + /// (Optional) Target Platforms that should receive the Message or Package. If omitted, we will send + /// to all available platforms. + /// + _Maybenull_ _Field_size_(targetPlatformsCount) PFPushNotificationPlatform const* targetPlatforms; + + /// + /// Count of targetPlatforms + /// + uint32_t targetPlatformsCount; + +} PFPushNotificationsSendPushNotificationRequest; + +/// +/// PFPushNotificationsSendPushNotificationFromTemplateRequest data model. Represents the request for +/// sending a push notification template to a recipient. +/// +typedef struct PFPushNotificationsSendPushNotificationFromTemplateRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Id of the push notification template. + /// + _Null_terminated_ const char* pushNotificationTemplateId; + + /// + /// PlayFabId of the push notification recipient. + /// + _Null_terminated_ const char* recipient; + +} PFPushNotificationsSendPushNotificationFromTemplateRequest; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFSegments.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFSegments.h new file mode 100644 index 0000000..b84802c --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFSegments.h @@ -0,0 +1,430 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// List all segments that a player currently belongs to at this moment in time. +/// +/// PFEntityHandle to use for authentication. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFSegmentsClientGetPlayerSegmentsAsync( + _In_ PFEntityHandle entityHandle, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayerSegments call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFSegmentsClientGetPlayerSegmentsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFSegmentsClientGetPlayerSegmentsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFSegmentsClientGetPlayerSegmentsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerSegmentsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Get all tags with a given Namespace (optional) from a player profile. +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace +/// is not provided, the result is a list of all canonical tags. TagName can be used for segmentation +/// and Namespace is limited to 128 characters. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFSegmentsClientGetPlayerTagsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFSegmentsGetPlayerTagsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPlayerTags call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFSegmentsClientGetPlayerTagsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFSegmentsClientGetPlayerTagsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFSegmentsClientGetPlayerTagsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerTagsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if 0 +/// +/// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the +/// source of the tag. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API will trigger a player_tag_added event and add a tag with the given TagName and PlayFabID +/// to the corresponding player profile. TagName can be used for segmentation and it is limited to 256 +/// characters. Also there is a limit on the number of tags a title can have. See also ServerGetPlayerTagsAsync, +/// ServerRemovePlayerTagAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_PLAYER_TAG_COUNT_LIMIT_EXCEEDED or any of the global PlayFab Service +/// errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFSegmentsServerAddPlayerTagAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFSegmentsAddPlayerTagRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Retrieves an array of player segment definitions. Results from this can be used in subsequent API +/// calls such as GetPlayersInSegment which requires a Segment ID. While segment names can change the +/// ID for that segment will not change. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Request has no paramaters. See also ServerGetPlayersInSegmentAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFSegmentsServerGetAllSegmentsAsync( + _In_ PFEntityHandle titleEntityHandle, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetAllSegments call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFSegmentsServerGetAllSegmentsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFSegmentsServerGetAllSegmentsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFSegmentsServerGetAllSegmentsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetAllSegmentsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// List all segments that a player currently belongs to at this moment in time. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// See also ServerGetAllSegmentsAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFSegmentsServerGetPlayerSegmentsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFSegmentsGetPlayersSegmentsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayerSegments call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFSegmentsServerGetPlayerSegmentsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFSegmentsServerGetPlayerSegmentsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFSegmentsServerGetPlayerSegmentsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerSegmentsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Allows for paging through all players in a given segment. This API creates a snapshot of all player +/// profiles that match the segment definition at the time of its creation and lives through the Total +/// Seconds to Live, refreshing its life span on each subsequent use of the Continuation Token. Profiles +/// that change during the course of paging will not be reflected in the results. AB Test segments are +/// currently not supported by this operation. NOTE: This API is limited to being called 30 times in one +/// minute. You will be returned an error if you exceed this threshold. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// Initial request must contain at least a Segment ID. Subsequent requests must contain the Segment +/// ID as well as the Continuation Token. Failure to send the Continuation Token will result in a new +/// player segment list being generated. Each time the Continuation Token is passed in the length of the +/// Total Seconds to Live is refreshed. If too much time passes between requests to the point that a subsequent +/// request is past the Total Seconds to Live an error will be returned and paging will be terminated. +/// This API is resource intensive and should not be used in scenarios which might generate high request +/// volumes. Only one request to this API at a time should be made per title. Concurrent requests to the +/// API may be rejected with the APIConcurrentRequestLimitExceeded error. See also ServerGetAllSegmentsAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFSegmentsServerGetPlayersInSegmentAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFSegmentsGetPlayersInSegmentRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayersInSegment call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EXPIRED_CONTINUATION_TOKEN, +/// E_PF_GET_PLAYERS_IN_SEGMENT_RATE_LIMIT_EXCEEDED, E_PF_INTERNAL_SERVER_ERROR, E_PF_INVALID_CONTINUATION_TOKEN, +/// E_PF_INVALID_SEARCH_TERM, E_PF_INVALID_SEGMENT, E_PF_SEGMENT_NOT_FOUND or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFSegmentsServerGetPlayersInSegmentGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFSegmentsServerGetPlayersInSegmentAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_EXPIRED_CONTINUATION_TOKEN, +/// E_PF_GET_PLAYERS_IN_SEGMENT_RATE_LIMIT_EXCEEDED, E_PF_INTERNAL_SERVER_ERROR, E_PF_INVALID_CONTINUATION_TOKEN, +/// E_PF_INVALID_SEARCH_TERM, E_PF_INVALID_SEGMENT, E_PF_SEGMENT_NOT_FOUND or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFSegmentsServerGetPlayersInSegmentGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayersInSegmentResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Get all tags with a given Namespace (optional) from a player profile. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace +/// is not provided, the result is a list of all canonical tags. TagName can be used for segmentation +/// and Namespace is limited to 128 characters. See also ServerAddPlayerTagAsync, ServerRemovePlayerTagAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFSegmentsServerGetPlayerTagsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFSegmentsGetPlayerTagsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPlayerTags call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFSegmentsServerGetPlayerTagsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFSegmentsServerGetPlayerTagsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFSegmentsServerGetPlayerTagsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerTagsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Remove a given tag from a player profile. The tag's namespace is automatically generated based on +/// the source of the tag. +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API will trigger a player_tag_removed event and remove a tag with the given TagName and PlayFabID +/// from the corresponding player profile. TagName can be used for segmentation and it is limited to 256 +/// characters See also ServerAddPlayerTagAsync, ServerGetPlayerTagsAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be one of global PlayFab Service errors. See doc page "Handling PlayFab Errors" +/// for more details on error handling. +/// +PF_API PFSegmentsServerRemovePlayerTagAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFSegmentsRemovePlayerTagRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFSegmentsTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFSegmentsTypes.h new file mode 100644 index 0000000..0c361c0 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFSegmentsTypes.h @@ -0,0 +1,637 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// ChurnRiskLevel enum. +/// +enum class PFSegmentsChurnRiskLevel : uint32_t +{ + NoData, + LowRisk, + MediumRisk, + HighRisk +}; + +/// +/// PFSegmentsGetSegmentResult data model. +/// +typedef struct PFSegmentsGetSegmentResult +{ + /// + /// (Optional) Identifier of the segments AB Test, if it is attached to one. + /// + _Maybenull_ _Null_terminated_ const char* aBTestParent; + + /// + /// Unique identifier for this segment. + /// + _Null_terminated_ const char* id; + + /// + /// (Optional) Segment name. + /// + _Maybenull_ _Null_terminated_ const char* name; + +} PFSegmentsGetSegmentResult; + +/// +/// PFSegmentsGetPlayerSegmentsResult data model. +/// +typedef struct PFSegmentsGetPlayerSegmentsResult +{ + /// + /// (Optional) Array of segments the requested player currently belongs to. + /// + _Maybenull_ _Field_size_(segmentsCount) PFSegmentsGetSegmentResult const* const* segments; + + /// + /// Count of segments + /// + uint32_t segmentsCount; + +} PFSegmentsGetPlayerSegmentsResult; + +/// +/// PFSegmentsGetPlayerTagsRequest data model. This API will return a list of canonical tags which includes +/// both namespace and tag's name. If namespace is not provided, the result is a list of all canonical +/// tags. TagName can be used for segmentation and Namespace is limited to 128 characters. +/// +typedef struct PFSegmentsGetPlayerTagsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) Optional namespace to filter results by. + /// + _Maybenull_ _Null_terminated_ const char* playfabNamespace; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFSegmentsGetPlayerTagsRequest; + +/// +/// PFSegmentsGetPlayerTagsResult data model. +/// +typedef struct PFSegmentsGetPlayerTagsResult +{ + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Canonical tags (including namespace and tag's name) for the requested user. + /// + _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + +} PFSegmentsGetPlayerTagsResult; + +/// +/// PFSegmentsAddPlayerTagRequest data model. This API will trigger a player_tag_added event and add +/// a tag with the given TagName and PlayFabID to the corresponding player profile. TagName can be used +/// for segmentation and it is limited to 256 characters. Also there is a limit on the number of tags +/// a title can have. +/// +typedef struct PFSegmentsAddPlayerTagRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Unique tag for player profile. + /// + _Null_terminated_ const char* tagName; + +} PFSegmentsAddPlayerTagRequest; + +/// +/// PFSegmentsGetAllSegmentsResult data model. +/// +typedef struct PFSegmentsGetAllSegmentsResult +{ + /// + /// (Optional) Array of segments for this title. + /// + _Maybenull_ _Field_size_(segmentsCount) PFSegmentsGetSegmentResult const* const* segments; + + /// + /// Count of segments + /// + uint32_t segmentsCount; + +} PFSegmentsGetAllSegmentsResult; + +/// +/// PFSegmentsGetPlayersSegmentsRequest data model. +/// +typedef struct PFSegmentsGetPlayersSegmentsRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + +} PFSegmentsGetPlayersSegmentsRequest; + +/// +/// PFSegmentsGetPlayersInSegmentRequest data model. Initial request must contain at least a Segment +/// ID. Subsequent requests must contain the Segment ID as well as the Continuation Token. Failure to +/// send the Continuation Token will result in a new player segment list being generated. Each time the +/// Continuation Token is passed in the length of the Total Seconds to Live is refreshed. If too much +/// time passes between requests to the point that a subsequent request is past the Total Seconds to Live +/// an error will be returned and paging will be terminated. This API is resource intensive and should +/// not be used in scenarios which might generate high request volumes. Only one request to this API at +/// a time should be made per title. Concurrent requests to the API may be rejected with the APIConcurrentRequestLimitExceeded +/// error. +/// +typedef struct PFSegmentsGetPlayersInSegmentRequest +{ + /// + /// (Optional) Continuation token if retrieving subsequent pages of results. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// (Optional) If set to true, the profiles are loaded asynchronously and the response will include + /// a continuation token and approximate profile count until the first batch of profiles is loaded. + /// Use this parameter to help avoid network timeouts. + /// + _Maybenull_ bool const* getProfilesAsync; + + /// + /// (Optional) Maximum is 10,000. The value 0 will prevent loading any profiles and return only the + /// count of profiles matching this segment. + /// + _Maybenull_ uint32_t const* maxBatchSize; + + /// + /// (Optional) Number of seconds to keep the continuation token active. After token expiration it + /// is not possible to continue paging results. Default is 300 (5 minutes). Maximum is 5,400 (90 minutes). + /// + _Maybenull_ uint32_t const* secondsToLive; + + /// + /// Unique identifier for this segment. + /// + _Null_terminated_ const char* segmentId; + +} PFSegmentsGetPlayersInSegmentRequest; + +/// +/// PFSegmentsAdCampaignAttribution data model. +/// +typedef struct PFSegmentsAdCampaignAttribution +{ + /// + /// UTC time stamp of attribution. + /// + time_t attributedAt; + + /// + /// (Optional) Attribution campaign identifier. + /// + _Maybenull_ _Null_terminated_ const char* campaignId; + + /// + /// (Optional) Attribution network name. + /// + _Maybenull_ _Null_terminated_ const char* platform; + +} PFSegmentsAdCampaignAttribution; + +/// +/// PFSegmentsContactEmailInfo data model. +/// +typedef struct PFSegmentsContactEmailInfo +{ + /// + /// (Optional) The email address. + /// + _Maybenull_ _Null_terminated_ const char* emailAddress; + + /// + /// (Optional) The name of the email info data. + /// + _Maybenull_ _Null_terminated_ const char* name; + + /// + /// (Optional) The verification status of the email. + /// + _Maybenull_ PFEmailVerificationStatus const* verificationStatus; + +} PFSegmentsContactEmailInfo; + +/// +/// PFSegmentsPlayerLinkedAccount data model. +/// +typedef struct PFSegmentsPlayerLinkedAccount +{ + /// + /// (Optional) Linked account's email. + /// + _Maybenull_ _Null_terminated_ const char* email; + + /// + /// (Optional) Authentication platform. + /// + _Maybenull_ PFLoginIdentityProvider const* platform; + + /// + /// (Optional) Platform user identifier. + /// + _Maybenull_ _Null_terminated_ const char* platformUserId; + + /// + /// (Optional) Linked account's username. + /// + _Maybenull_ _Null_terminated_ const char* username; + +} PFSegmentsPlayerLinkedAccount; + +/// +/// PFSegmentsPlayerLocation data model. +/// +typedef struct PFSegmentsPlayerLocation +{ + /// + /// (Optional) City of the player's geographic location. + /// + _Maybenull_ _Null_terminated_ const char* city; + + /// + /// The two-character continent code for this location. + /// + PFContinentCode continentCode; + + /// + /// The two-character ISO 3166-1 country code for the country associated with the location. + /// + PFCountryCode countryCode; + + /// + /// (Optional) Latitude coordinate of the player's geographic location. + /// + _Maybenull_ double const* latitude; + + /// + /// (Optional) Longitude coordinate of the player's geographic location. + /// + _Maybenull_ double const* longitude; + +} PFSegmentsPlayerLocation; + +/// +/// PFSegmentsPlayerStatistic data model. +/// +typedef struct PFSegmentsPlayerStatistic +{ + /// + /// (Optional) Statistic ID. + /// + _Maybenull_ _Null_terminated_ const char* id; + + /// + /// (Optional) Statistic name. + /// + _Maybenull_ _Null_terminated_ const char* name; + + /// + /// Current statistic value. + /// + int32_t statisticValue; + + /// + /// Statistic version (0 if not a versioned statistic). + /// + int32_t statisticVersion; + +} PFSegmentsPlayerStatistic; + +/// +/// PFSegmentsPushNotificationRegistration data model. +/// +typedef struct PFSegmentsPushNotificationRegistration +{ + /// + /// (Optional) Notification configured endpoint. + /// + _Maybenull_ _Null_terminated_ const char* notificationEndpointARN; + + /// + /// (Optional) Push notification platform. + /// + _Maybenull_ PFPushNotificationPlatform const* platform; + +} PFSegmentsPushNotificationRegistration; + +/// +/// PFSegmentsPlayerProfile data model. +/// +typedef struct PFSegmentsPlayerProfile +{ + /// + /// (Optional) Array of ad campaigns player has been attributed to. + /// + _Maybenull_ _Field_size_(adCampaignAttributionsCount) PFSegmentsAdCampaignAttribution const* const* adCampaignAttributions; + + /// + /// Count of adCampaignAttributions + /// + uint32_t adCampaignAttributionsCount; + + /// + /// (Optional) Image URL of the player's avatar. + /// + _Maybenull_ _Null_terminated_ const char* avatarUrl; + + /// + /// (Optional) Banned until UTC Date. If permanent ban this is set for 20 years after the original + /// ban date. + /// + _Maybenull_ time_t const* bannedUntil; + + /// + /// (Optional) The prediction of the player to churn within the next seven days. + /// + _Maybenull_ PFSegmentsChurnRiskLevel const* churnPrediction; + + /// + /// (Optional) Array of contact email addresses associated with the player. + /// + _Maybenull_ _Field_size_(contactEmailAddressesCount) PFSegmentsContactEmailInfo const* const* contactEmailAddresses; + + /// + /// Count of contactEmailAddresses + /// + uint32_t contactEmailAddressesCount; + + /// + /// (Optional) Player record created. + /// + _Maybenull_ time_t const* created; + + /// + /// (Optional) Player Display Name. + /// + _Maybenull_ _Null_terminated_ const char* displayName; + + /// + /// (Optional) Last login. + /// + _Maybenull_ time_t const* lastLogin; + + /// + /// (Optional) Array of third party accounts linked to this player. + /// + _Maybenull_ _Field_size_(linkedAccountsCount) PFSegmentsPlayerLinkedAccount const* const* linkedAccounts; + + /// + /// Count of linkedAccounts + /// + uint32_t linkedAccountsCount; + + /// + /// (Optional) Dictionary of player's locations by type. + /// + _Maybenull_ _Field_size_(locationsCount) struct PFSegmentsPlayerLocationDictionaryEntry const* locations; + + /// + /// Count of locations + /// + uint32_t locationsCount; + + /// + /// (Optional) Player account origination. + /// + _Maybenull_ PFLoginIdentityProvider const* origination; + + /// + /// (Optional) List of player variants for experimentation. + /// + _Maybenull_ _Field_size_(playerExperimentVariantsCount) const char* const* playerExperimentVariants; + + /// + /// Count of playerExperimentVariants + /// + uint32_t playerExperimentVariantsCount; + + /// + /// (Optional) PlayFab Player ID. + /// + _Maybenull_ _Null_terminated_ const char* playerId; + + /// + /// (Optional) Array of player statistics. + /// + _Maybenull_ _Field_size_(playerStatisticsCount) PFSegmentsPlayerStatistic const* const* playerStatistics; + + /// + /// Count of playerStatistics + /// + uint32_t playerStatisticsCount; + + /// + /// (Optional) Publisher this player belongs to. + /// + _Maybenull_ _Null_terminated_ const char* publisherId; + + /// + /// (Optional) Array of configured push notification end points. + /// + _Maybenull_ _Field_size_(pushNotificationRegistrationsCount) PFSegmentsPushNotificationRegistration const* const* pushNotificationRegistrations; + + /// + /// Count of pushNotificationRegistrations + /// + uint32_t pushNotificationRegistrationsCount; + + /// + /// (Optional) Dictionary of player's statistics using only the latest version's value. + /// + _Maybenull_ _Field_size_(statisticsCount) struct PFInt32DictionaryEntry const* statistics; + + /// + /// Count of statistics + /// + uint32_t statisticsCount; + + /// + /// (Optional) List of player's tags for segmentation. + /// + _Maybenull_ _Field_size_(tagsCount) const char* const* tags; + + /// + /// Count of tags + /// + uint32_t tagsCount; + + /// + /// (Optional) Title ID this profile applies to. + /// + _Maybenull_ _Null_terminated_ const char* titleId; + + /// + /// (Optional) A sum of player's total purchases in USD across all currencies. + /// + _Maybenull_ uint32_t const* totalValueToDateInUSD; + + /// + /// (Optional) Dictionary of player's total purchases by currency. + /// + _Maybenull_ _Field_size_(valuesToDateCount) struct PFUint32DictionaryEntry const* valuesToDate; + + /// + /// Count of valuesToDate + /// + uint32_t valuesToDateCount; + + /// + /// (Optional) Dictionary of player's virtual currency balances. + /// + _Maybenull_ _Field_size_(virtualCurrencyBalancesCount) struct PFInt32DictionaryEntry const* virtualCurrencyBalances; + + /// + /// Count of virtualCurrencyBalances + /// + uint32_t virtualCurrencyBalancesCount; + +} PFSegmentsPlayerProfile; + +/// +/// PFSegmentsGetPlayersInSegmentResult data model. +/// +typedef struct PFSegmentsGetPlayersInSegmentResult +{ + /// + /// (Optional) Continuation token to use to retrieve subsequent pages of results. If token returns + /// null there are no more results. + /// + _Maybenull_ _Null_terminated_ const char* continuationToken; + + /// + /// (Optional) Array of player profiles in this segment. + /// + _Maybenull_ _Field_size_(playerProfilesCount) PFSegmentsPlayerProfile const* const* playerProfiles; + + /// + /// Count of playerProfiles + /// + uint32_t playerProfilesCount; + + /// + /// Count of profiles matching this segment. + /// + int32_t profilesInSegment; + +} PFSegmentsGetPlayersInSegmentResult; + +/// +/// PFSegmentsRemovePlayerTagRequest data model. This API will trigger a player_tag_removed event and +/// remove a tag with the given TagName and PlayFabID from the corresponding player profile. TagName can +/// be used for segmentation and it is limited to 256 characters. +/// +typedef struct PFSegmentsRemovePlayerTagRequest +{ + /// + /// (Optional) The optional custom tags associated with the request (e.g. build number, external + /// trace identifiers, etc.). + /// + _Maybenull_ _Field_size_(customTagsCount) struct PFStringDictionaryEntry const* customTags; + + /// + /// Count of customTags + /// + uint32_t customTagsCount; + + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + _Null_terminated_ const char* playFabId; + + /// + /// Unique tag for player profile. + /// + _Null_terminated_ const char* tagName; + +} PFSegmentsRemovePlayerTagRequest; + +/// +/// Dictionary entry for an associative array with PFSegmentsPlayerLocation values. +/// +typedef struct PFSegmentsPlayerLocationDictionaryEntry +{ + _Null_terminated_ const char* key; + PFSegmentsPlayerLocation const* value; +} PFSegmentsPlayerLocationDictionaryEntry; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFServices.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFServices.h new file mode 100644 index 0000000..4cc23bf --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFServices.h @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" +{ + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +/// +/// Initializes PlayFab Services global state +/// +/// Reserved for future use. +/// +/// This will internally call PFInitialize(nullptr) if it hasn't been called already by the +/// title. If control of PFCore background work is needed, the title should explicitly call +/// PFInitialize and PFUninitialize. +/// +/// Result code for this API operation. +PF_API PFServicesInitialize( + _In_opt_ XTaskQueueHandle reserved +) noexcept; +#endif + +/// +/// Cleanup PlayFab Services global state. +/// +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This will internally call PFUninitializeAsync() if PFServicesInitialize() needed +/// to call PFInitialize() interally. +/// Asynchronous result returned via XAsyncGetStatus. +PF_API PFServicesUninitializeAsync( + _In_ XAsyncBlock* async +) noexcept; + +} + diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagement.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagement.h new file mode 100644 index 0000000..12ad9a9 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagement.h @@ -0,0 +1,592 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +extern "C" +{ + +/// +/// Retrieves the key-value store of custom publisher settings +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This API is designed to return publisher-specific values which can be read, but not written to, by +/// the client. This data is shared across all titles assigned to a particular publisher, and can be used +/// for cross-game coordination. Only titles assigned to a publisher can use this API. For more information +/// email helloplayfab@microsoft.com. Note that there may up to a minute delay in between updating title +/// data and this API call returning the newest value. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFTitleDataManagementClientGetPublisherDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFTitleDataManagementGetPublisherDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetPublisherData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFTitleDataManagementClientGetPublisherDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementClientGetPublisherDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFTitleDataManagementClientGetPublisherDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetPublisherDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the current server time +/// +/// PFEntityHandle to use for authentication. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This query retrieves the current time from one of the servers in PlayFab. Please note that due to +/// clock drift between servers, there is a potential variance of up to 5 seconds. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFTitleDataManagementClientGetTimeAsync( + _In_ PFEntityHandle entityHandle, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementClientGetTimeAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFTitleDataManagementGetTimeResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFTitleDataManagementClientGetTimeGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFTitleDataManagementGetTimeResult* result +) noexcept; + +/// +/// Retrieves the key-value store of custom title settings +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// This API is designed to return title specific values which can be read, but not written to, by the +/// client. For example, a developer could choose to store values which modify the user experience, such +/// as enemy spawn rates, weapon strengths, movement speeds, etc. This allows a developer to update the +/// title without the need to create, test, and ship a new build. If the player belongs to an experiment +/// variant that uses title data overrides, the overrides are applied automatically and returned with +/// the title data. Note that there may up to a minute delay in between updating title data and this API +/// call returning the newest value. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFTitleDataManagementClientGetTitleDataAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFTitleDataManagementGetTitleDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetTitleData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementClientGetTitleDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementClientGetTitleDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFTitleDataManagementClientGetTitleDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +/// +/// Retrieves the title news feed, as configured in the developer portal +/// +/// PFEntityHandle to use for authentication. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is available on all platforms. +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFTitleDataManagementClientGetTitleNewsAsync( + _In_ PFEntityHandle entityHandle, + _In_ const PFTitleDataManagementGetTitleNewsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ClientGetTitleNews call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementClientGetTitleNewsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementClientGetTitleNewsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFTitleDataManagementClientGetTitleNewsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleNewsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; + +#if 0 +/// +/// Retrieves the key-value store of custom publisher settings +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is designed to return publisher-specific values which can be read, but not written to, by +/// the client. This data is shared across all titles assigned to a particular publisher, and can be used +/// for cross-game coordination. Only titles assigned to a publisher can use this API. For more information +/// email helloplayfab@microsoft.com. Note that there may up to a minute delay in between updating title +/// data and this API call returning the newest value. See also ServerSetPublisherDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFTitleDataManagementServerGetPublisherDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFTitleDataManagementGetPublisherDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetPublisherData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFTitleDataManagementServerGetPublisherDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementServerGetPublisherDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFTitleDataManagementServerGetPublisherDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetPublisherDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the current server time +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This query retrieves the current time from one of the servers in PlayFab. Please note that due to +/// clock drift between servers, there is a potential variance of up to 5 seconds. +/// +/// When the asynchronous task is complete, call +/// to get the result. +/// +PF_API PFTitleDataManagementServerGetTimeAsync( + _In_ PFEntityHandle titleEntityHandle, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementServerGetTimeAsync call. +/// +/// XAsyncBlock for the async operation. +/// PFTitleDataManagementGetTimeResult object that will be populated with the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be E_PF_PUBLISHER_NOT_SET +/// or any of the global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details +/// on error handling. +/// +PF_API PFTitleDataManagementServerGetTimeGetResult( + _Inout_ XAsyncBlock* async, + _Out_ PFTitleDataManagementGetTimeResult* result +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the key-value store of custom title settings +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is designed to return title specific values which can be read, but not written to, by the +/// client. For example, a developer could choose to store values which modify the user experience, such +/// as enemy spawn rates, weapon strengths, movement speeds, etc. This allows a developer to update the +/// title without the need to create, test, and ship a new build. If an override label is specified in +/// the request, the overrides are applied automatically and returned with the title data. Note that there +/// may up to a minute delay in between updating title data and this API call returning the newest value. +/// See also ServerSetTitleDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFTitleDataManagementServerGetTitleDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFTitleDataManagementGetTitleDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetTitleData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementServerGetTitleDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementServerGetTitleDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFTitleDataManagementServerGetTitleDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the key-value store of custom internal title settings +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is designed to return title specific values which are accessible only to the server. This +/// can be used to tweak settings on game servers and Cloud Scripts without needed to update and re-deploy +/// them. Note that there may up to a minute delay in between updating title data and this API call returning +/// the newest value. See also ServerSetTitleInternalDataAsync. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFTitleDataManagementServerGetTitleInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFTitleDataManagementGetTitleDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetTitleInternalData call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementServerGetTitleInternalDataGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementServerGetTitleInternalDataAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFTitleDataManagementServerGetTitleInternalDataGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Retrieves the title news feed, as configured in the developer portal +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// When the asynchronous task is complete, call +/// and to get the result. +/// +PF_API PFTitleDataManagementServerGetTitleNewsAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFTitleDataManagementGetTitleNewsRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; + +/// +/// Get the size in bytes needed to store the result of a ServerGetTitleNews call. +/// +/// XAsyncBlock for the async operation. +/// The buffer size in bytes required for the result. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementServerGetTitleNewsGetResultSize( + _Inout_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept; + +/// +/// Gets the result of a successful PFTitleDataManagementServerGetTitleNewsAsync call. +/// +/// XAsyncBlock for the async operation. +/// The size of the buffer for the result object. +/// Byte buffer used for the result value and its fields. +/// Pointer to the result object. +/// The number of bytes in the provided buffer that were used. +/// +/// Result code for this API operation. If the service call is unsuccessful, the result will be one of +/// global PlayFab Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +/// +/// result is a pointer within buffer and does not need to be freed separately. +/// +PF_API PFTitleDataManagementServerGetTitleNewsGetResult( + _Inout_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleNewsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept; +#endif + +#if 0 +/// +/// Updates the key-value store of custom publisher settings +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is designed to store publisher-specific values which can be read, but not written to, by +/// the client. This data is shared across all titles assigned to a particular publisher, and can be used +/// for cross-game coordination. Only titles assigned to a publisher can use this API. This operation +/// is additive. If a Key does not exist in the current dataset, it will be added with the specified Value. +/// If it already exists, the Value for that key will be overwritten with the new Value. For more information +/// email helloplayfab@microsoft.com See also ServerGetPublisherDataAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_PUBLISHER_NOT_SET or any of the global PlayFab Service errors. See doc +/// page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementServerSetPublisherDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFTitleDataManagementSetPublisherDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Updates the key-value store of custom title settings +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is designed to store title specific values which can be read, but not written to, by the +/// client. For example, a developer could choose to store values which modify the user experience, such +/// as enemy spawn rates, weapon strengths, movement speeds, etc. This allows a developer to update the +/// title without the need to create, test, and ship a new build. This operation is additive. If a Key +/// does not exist in the current dataset, it will be added with the specified Value. If it already exists, +/// the Value for that key will be overwritten with the new Value. See also ServerGetTitleDataAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATA_LENGTH_EXCEEDED, E_PF_TOO_MANY_KEYS or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementServerSetTitleDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFTitleDataManagementSetTitleDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + +#if 0 +/// +/// Updates the key-value store of custom title settings +/// +/// PFEntityHandle for a title Entity obtained using PFAuthenticationGetEntityWithSecretKeyAsync. +/// Populated request object. +/// XAsyncBlock for the async operation. +/// Result code for this API operation. +/// +/// This API is designed to store title specific values which are accessible only to the server. This +/// can be used to tweak settings on game servers and Cloud Scripts without needed to update and re-deploy +/// them. This operation is additive. If a Key does not exist in the current dataset, it will be added +/// with the specified Value. If it already exists, the Value for that key will be overwritten with the +/// new Value. See also ServerGetTitleInternalDataAsync. +/// +/// Call to get the status of the operation. If the service call is unsuccessful, +/// the async result will be E_PF_DATA_LENGTH_EXCEEDED, E_PF_TOO_MANY_KEYS or any of the global PlayFab +/// Service errors. See doc page "Handling PlayFab Errors" for more details on error handling. +/// +PF_API PFTitleDataManagementServerSetTitleInternalDataAsync( + _In_ PFEntityHandle titleEntityHandle, + _In_ const PFTitleDataManagementSetTitleDataRequest* request, + _Inout_ XAsyncBlock* async +) noexcept; +#endif + + +} \ No newline at end of file diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagementTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagementTypes.h new file mode 100644 index 0000000..e216d94 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFTitleDataManagementTypes.h @@ -0,0 +1,223 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#include + +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +/// +/// PFTitleDataManagementGetPublisherDataRequest data model. This API is designed to return publisher-specific +/// values which can be read, but not written to, by the client. This data is shared across all titles +/// assigned to a particular publisher, and can be used for cross-game coordination. Only titles assigned +/// to a publisher can use this API. For more information email helloplayfab@microsoft.com. Note that +/// there may up to a minute delay in between updating title data and this API call returning the newest +/// value. +/// +typedef struct PFTitleDataManagementGetPublisherDataRequest +{ + /// + /// array of keys to get back data from the Publisher data blob, set by the admin tools. + /// + _Field_size_(keysCount) const char* const* keys; + + /// + /// Count of keys + /// + uint32_t keysCount; + +} PFTitleDataManagementGetPublisherDataRequest; + +/// +/// PFTitleDataManagementGetPublisherDataResult data model. +/// +typedef struct PFTitleDataManagementGetPublisherDataResult +{ + /// + /// (Optional) A dictionary object of key / value pairs. + /// + _Maybenull_ _Field_size_(dataCount) struct PFStringDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFTitleDataManagementGetPublisherDataResult; + +/// +/// PFTitleDataManagementGetTimeResult data model. Time is always returned as Coordinated Universal Time +/// (UTC). +/// +typedef struct PFTitleDataManagementGetTimeResult +{ + /// + /// Current server time when the request was received, in UTC. + /// + time_t time; + +} PFTitleDataManagementGetTimeResult; + +/// +/// PFTitleDataManagementGetTitleDataRequest data model. This API is designed to return title specific +/// values which can be read, but not written to, by the client. For example, a developer could choose +/// to store values which modify the user experience, such as enemy spawn rates, weapon strengths, movement +/// speeds, etc. This allows a developer to update the title without the need to create, test, and ship +/// a new build. If the player belongs to an experiment variant that uses title data overrides, the overrides +/// are applied automatically and returned with the title data. Note that there may up to a minute delay +/// in between updating title data and this API call returning the newest value. +/// +typedef struct PFTitleDataManagementGetTitleDataRequest +{ + /// + /// (Optional) Specific keys to search for in the title data (leave null to get all keys). + /// + _Maybenull_ _Field_size_(keysCount) const char* const* keys; + + /// + /// Count of keys + /// + uint32_t keysCount; + + /// + /// (Optional) Optional field that specifies the name of an override. This value is ignored when + /// used by the game client; otherwise, the overrides are applied automatically to the title data. + /// + _Maybenull_ _Null_terminated_ const char* overrideLabel; + +} PFTitleDataManagementGetTitleDataRequest; + +/// +/// PFTitleDataManagementGetTitleDataResult data model. +/// +typedef struct PFTitleDataManagementGetTitleDataResult +{ + /// + /// (Optional) A dictionary object of key / value pairs. + /// + _Maybenull_ _Field_size_(dataCount) struct PFStringDictionaryEntry const* data; + + /// + /// Count of data + /// + uint32_t dataCount; + +} PFTitleDataManagementGetTitleDataResult; + +/// +/// PFTitleDataManagementGetTitleNewsRequest data model. +/// +typedef struct PFTitleDataManagementGetTitleNewsRequest +{ + /// + /// (Optional) Limits the results to the last n entries. Defaults to 10 if not set. + /// + _Maybenull_ int32_t const* count; + +} PFTitleDataManagementGetTitleNewsRequest; + +/// +/// PFTitleDataManagementTitleNewsItem data model. +/// +typedef struct PFTitleDataManagementTitleNewsItem +{ + /// + /// (Optional) News item text. + /// + _Maybenull_ _Null_terminated_ const char* body; + + /// + /// (Optional) Unique identifier of news item. + /// + _Maybenull_ _Null_terminated_ const char* newsId; + + /// + /// Date and time when the news item was posted. + /// + time_t timestamp; + + /// + /// (Optional) Title of the news item. + /// + _Maybenull_ _Null_terminated_ const char* title; + +} PFTitleDataManagementTitleNewsItem; + +/// +/// PFTitleDataManagementGetTitleNewsResult data model. +/// +typedef struct PFTitleDataManagementGetTitleNewsResult +{ + /// + /// (Optional) Array of news items. + /// + _Maybenull_ _Field_size_(newsCount) PFTitleDataManagementTitleNewsItem const* const* news; + + /// + /// Count of news + /// + uint32_t newsCount; + +} PFTitleDataManagementGetTitleNewsResult; + +/// +/// PFTitleDataManagementSetPublisherDataRequest data model. This API is designed to store publisher-specific +/// values which can be read, but not written to, by the client. This data is shared across all titles +/// assigned to a particular publisher, and can be used for cross-game coordination. Only titles assigned +/// to a publisher can use this API. This operation is additive. If a Key does not exist in the current +/// dataset, it will be added with the specified Value. If it already exists, the Value for that key will +/// be overwritten with the new Value. For more information email helloplayfab@microsoft.com. +/// +typedef struct PFTitleDataManagementSetPublisherDataRequest +{ + /// + /// Key we want to set a value on (note, this is additive - will only replace an existing key's value + /// if they are the same name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + _Null_terminated_ const char* key; + + /// + /// (Optional) New value to set. Set to null to remove a value. + /// + _Maybenull_ _Null_terminated_ const char* value; + +} PFTitleDataManagementSetPublisherDataRequest; + +/// +/// PFTitleDataManagementSetTitleDataRequest data model. This API is designed to store title specific +/// values which can be read, but not written to, by the client. For example, a developer could choose +/// to store values which modify the user experience, such as enemy spawn rates, weapon strengths, movement +/// speeds, etc. This allows a developer to update the title without the need to create, test, and ship +/// a new build. This operation is additive. If a Key does not exist in the current dataset, it will be +/// added with the specified Value. If it already exists, the Value for that key will be overwritten with +/// the new Value. +/// +typedef struct PFTitleDataManagementSetTitleDataRequest +{ + /// + /// Key we want to set a value on (note, this is additive - will only replace an existing key's value + /// if they are the same name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + _Null_terminated_ const char* key; + + /// + /// (Optional) New value to set. Set to null to remove a value. + /// + _Maybenull_ _Null_terminated_ const char* value; + +} PFTitleDataManagementSetTitleDataRequest; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/PFTypes.h b/Source/PlayFabServices/Include/Generated/playfab/services/PFTypes.h new file mode 100644 index 0000000..7a4e75e --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/PFTypes.h @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +extern "C" +{ + +#pragma push_macro("IN") +#undef IN + +// PlayFab HRESULT error codes (FACILITY_XBOX + 0x5400 + offset) + +// Service errors +#define E_PF_SERVICES_NOT_INITIALIZED MAKE_E_HC(0x54A0L) // 0x892354A0 +#define E_PF_SERVICES_ALREADY_INITIALIZED MAKE_E_HC(0x54A1L) // 0x892354A1 + +/// +/// OperationTypes enum. +/// +enum class PFOperationTypes : uint32_t +{ + Created, + Updated, + Deleted, + None +}; + +#pragma pop_macro("IN") + +} diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/AccountManagementTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/AccountManagementTypeWrappers.h new file mode 100644 index 0000000..6d69511 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/AccountManagementTypeWrappers.h @@ -0,0 +1,8914 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#if HC_PLATFORM == HC_PLATFORM_GDK +#include +#endif + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFAccountManagementAddOrUpdateContactEmailRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementAddOrUpdateContactEmailRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementAddOrUpdateContactEmailRequestWrapper() = default; + + PFAccountManagementAddOrUpdateContactEmailRequestWrapper(const PFAccountManagementAddOrUpdateContactEmailRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_emailAddress{ SafeString(model.emailAddress) } + { + SetModelPointers(); + } + + PFAccountManagementAddOrUpdateContactEmailRequestWrapper(const PFAccountManagementAddOrUpdateContactEmailRequestWrapper& src) : + PFAccountManagementAddOrUpdateContactEmailRequestWrapper{ src.Model() } + { + } + + PFAccountManagementAddOrUpdateContactEmailRequestWrapper(PFAccountManagementAddOrUpdateContactEmailRequestWrapper&& src) : + PFAccountManagementAddOrUpdateContactEmailRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementAddOrUpdateContactEmailRequestWrapper& operator=(PFAccountManagementAddOrUpdateContactEmailRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementAddOrUpdateContactEmailRequestWrapper() = default; + + friend void swap(PFAccountManagementAddOrUpdateContactEmailRequestWrapper& lhs, PFAccountManagementAddOrUpdateContactEmailRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_emailAddress, rhs.m_emailAddress); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEmailAddress(String value) + { + m_emailAddress = std::move(value); + this->m_model.emailAddress = m_emailAddress.empty() ? nullptr : m_emailAddress.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.emailAddress = m_emailAddress.empty() ? nullptr : m_emailAddress.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_emailAddress; +}; + +template class Alloc = std::allocator> +class PFAccountManagementAddUsernamePasswordRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementAddUsernamePasswordRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementAddUsernamePasswordRequestWrapper() = default; + + PFAccountManagementAddUsernamePasswordRequestWrapper(const PFAccountManagementAddUsernamePasswordRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_email{ SafeString(model.email) }, + m_password{ SafeString(model.password) }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFAccountManagementAddUsernamePasswordRequestWrapper(const PFAccountManagementAddUsernamePasswordRequestWrapper& src) : + PFAccountManagementAddUsernamePasswordRequestWrapper{ src.Model() } + { + } + + PFAccountManagementAddUsernamePasswordRequestWrapper(PFAccountManagementAddUsernamePasswordRequestWrapper&& src) : + PFAccountManagementAddUsernamePasswordRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementAddUsernamePasswordRequestWrapper& operator=(PFAccountManagementAddUsernamePasswordRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementAddUsernamePasswordRequestWrapper() = default; + + friend void swap(PFAccountManagementAddUsernamePasswordRequestWrapper& lhs, PFAccountManagementAddUsernamePasswordRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_password, rhs.m_password); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetPassword(String value) + { + m_password = std::move(value); + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.password = m_password.empty() ? nullptr : m_password.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_email; + String m_password; + String m_username; +}; + +template class Alloc = std::allocator> +class PFAccountManagementAddUsernamePasswordResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementAddUsernamePasswordResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementAddUsernamePasswordResultWrapper() = default; + + PFAccountManagementAddUsernamePasswordResultWrapper(const PFAccountManagementAddUsernamePasswordResult& model) : + ModelWrapper{ model }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFAccountManagementAddUsernamePasswordResultWrapper(const PFAccountManagementAddUsernamePasswordResultWrapper& src) : + PFAccountManagementAddUsernamePasswordResultWrapper{ src.Model() } + { + } + + PFAccountManagementAddUsernamePasswordResultWrapper(PFAccountManagementAddUsernamePasswordResultWrapper&& src) : + PFAccountManagementAddUsernamePasswordResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementAddUsernamePasswordResultWrapper& operator=(PFAccountManagementAddUsernamePasswordResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementAddUsernamePasswordResultWrapper() = default; + + friend void swap(PFAccountManagementAddUsernamePasswordResultWrapper& lhs, PFAccountManagementAddUsernamePasswordResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + String m_username; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetAccountInfoRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetAccountInfoRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetAccountInfoRequestWrapper() = default; + + PFAccountManagementGetAccountInfoRequestWrapper(const PFAccountManagementGetAccountInfoRequest& model) : + ModelWrapper{ model }, + m_email{ SafeString(model.email) }, + m_playFabId{ SafeString(model.playFabId) }, + m_titleDisplayName{ SafeString(model.titleDisplayName) }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFAccountManagementGetAccountInfoRequestWrapper(const PFAccountManagementGetAccountInfoRequestWrapper& src) : + PFAccountManagementGetAccountInfoRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetAccountInfoRequestWrapper(PFAccountManagementGetAccountInfoRequestWrapper&& src) : + PFAccountManagementGetAccountInfoRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetAccountInfoRequestWrapper& operator=(PFAccountManagementGetAccountInfoRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetAccountInfoRequestWrapper() = default; + + friend void swap(PFAccountManagementGetAccountInfoRequestWrapper& lhs, PFAccountManagementGetAccountInfoRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_titleDisplayName, rhs.m_titleDisplayName); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetTitleDisplayName(String value) + { + m_titleDisplayName = std::move(value); + this->m_model.titleDisplayName = m_titleDisplayName.empty() ? nullptr : m_titleDisplayName.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.titleDisplayName = m_titleDisplayName.empty() ? nullptr : m_titleDisplayName.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + String m_email; + String m_playFabId; + String m_titleDisplayName; + String m_username; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetAccountInfoResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetAccountInfoResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetAccountInfoResultWrapper() = default; + + PFAccountManagementGetAccountInfoResultWrapper(const PFAccountManagementGetAccountInfoResult& model) : + ModelWrapper{ model }, + m_accountInfo{ model.accountInfo ? std::optional>{ *model.accountInfo } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementGetAccountInfoResultWrapper(const PFAccountManagementGetAccountInfoResultWrapper& src) : + PFAccountManagementGetAccountInfoResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetAccountInfoResultWrapper(PFAccountManagementGetAccountInfoResultWrapper&& src) : + PFAccountManagementGetAccountInfoResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetAccountInfoResultWrapper& operator=(PFAccountManagementGetAccountInfoResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetAccountInfoResultWrapper() = default; + + friend void swap(PFAccountManagementGetAccountInfoResultWrapper& lhs, PFAccountManagementGetAccountInfoResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_accountInfo, rhs.m_accountInfo); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAccountInfo(std::optional> value) + { + m_accountInfo = std::move(value); + this->m_model.accountInfo = m_accountInfo ? &m_accountInfo->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.accountInfo = m_accountInfo ? &m_accountInfo->Model() : nullptr; + } + + std::optional> m_accountInfo; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayerCombinedInfoRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayerCombinedInfoRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayerCombinedInfoRequestWrapper() = default; + + PFAccountManagementGetPlayerCombinedInfoRequestWrapper(const PFAccountManagementGetPlayerCombinedInfoRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_infoRequestParameters{ model.infoRequestParameters ? *model.infoRequestParameters : decltype(*model.infoRequestParameters){} }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayerCombinedInfoRequestWrapper(const PFAccountManagementGetPlayerCombinedInfoRequestWrapper& src) : + PFAccountManagementGetPlayerCombinedInfoRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayerCombinedInfoRequestWrapper(PFAccountManagementGetPlayerCombinedInfoRequestWrapper&& src) : + PFAccountManagementGetPlayerCombinedInfoRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayerCombinedInfoRequestWrapper& operator=(PFAccountManagementGetPlayerCombinedInfoRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayerCombinedInfoRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayerCombinedInfoRequestWrapper& lhs, PFAccountManagementGetPlayerCombinedInfoRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_infoRequestParameters, rhs.m_infoRequestParameters); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInfoRequestParameters(PFGetPlayerCombinedInfoRequestParamsWrapper value) + { + m_infoRequestParameters = std::move(value); + this->m_model.infoRequestParameters = &m_infoRequestParameters.Model(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.infoRequestParameters = &m_infoRequestParameters.Model(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + PFGetPlayerCombinedInfoRequestParamsWrapper m_infoRequestParameters; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayerCombinedInfoResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayerCombinedInfoResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayerCombinedInfoResultWrapper() = default; + + PFAccountManagementGetPlayerCombinedInfoResultWrapper(const PFAccountManagementGetPlayerCombinedInfoResult& model) : + ModelWrapper{ model }, + m_infoResultPayload{ model.infoResultPayload ? std::optional>{ *model.infoResultPayload } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayerCombinedInfoResultWrapper(const PFAccountManagementGetPlayerCombinedInfoResultWrapper& src) : + PFAccountManagementGetPlayerCombinedInfoResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayerCombinedInfoResultWrapper(PFAccountManagementGetPlayerCombinedInfoResultWrapper&& src) : + PFAccountManagementGetPlayerCombinedInfoResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayerCombinedInfoResultWrapper& operator=(PFAccountManagementGetPlayerCombinedInfoResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayerCombinedInfoResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayerCombinedInfoResultWrapper& lhs, PFAccountManagementGetPlayerCombinedInfoResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_infoResultPayload, rhs.m_infoResultPayload); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetInfoResultPayload(std::optional> value) + { + m_infoResultPayload = std::move(value); + this->m_model.infoResultPayload = m_infoResultPayload ? &m_infoResultPayload->Model() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.infoResultPayload = m_infoResultPayload ? &m_infoResultPayload->Model() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + std::optional> m_infoResultPayload; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayerProfileRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayerProfileRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayerProfileRequestWrapper() = default; + + PFAccountManagementGetPlayerProfileRequestWrapper(const PFAccountManagementGetPlayerProfileRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) }, + m_profileConstraints{ model.profileConstraints ? std::optional>{ *model.profileConstraints } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayerProfileRequestWrapper(const PFAccountManagementGetPlayerProfileRequestWrapper& src) : + PFAccountManagementGetPlayerProfileRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayerProfileRequestWrapper(PFAccountManagementGetPlayerProfileRequestWrapper&& src) : + PFAccountManagementGetPlayerProfileRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayerProfileRequestWrapper& operator=(PFAccountManagementGetPlayerProfileRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayerProfileRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayerProfileRequestWrapper& lhs, PFAccountManagementGetPlayerProfileRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_profileConstraints, rhs.m_profileConstraints); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetProfileConstraints(std::optional> value) + { + m_profileConstraints = std::move(value); + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; + std::optional> m_profileConstraints; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayerProfileResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayerProfileResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayerProfileResultWrapper() = default; + + PFAccountManagementGetPlayerProfileResultWrapper(const PFAccountManagementGetPlayerProfileResult& model) : + ModelWrapper{ model }, + m_playerProfile{ model.playerProfile ? std::optional>{ *model.playerProfile } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayerProfileResultWrapper(const PFAccountManagementGetPlayerProfileResultWrapper& src) : + PFAccountManagementGetPlayerProfileResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayerProfileResultWrapper(PFAccountManagementGetPlayerProfileResultWrapper&& src) : + PFAccountManagementGetPlayerProfileResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayerProfileResultWrapper& operator=(PFAccountManagementGetPlayerProfileResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayerProfileResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayerProfileResultWrapper& lhs, PFAccountManagementGetPlayerProfileResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playerProfile, rhs.m_playerProfile); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayerProfile(std::optional> value) + { + m_playerProfile = std::move(value); + this->m_model.playerProfile = m_playerProfile ? &m_playerProfile->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.playerProfile = m_playerProfile ? &m_playerProfile->Model() : nullptr; + } + + std::optional> m_playerProfile; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest& model) : + ModelWrapper{ model }, + m_facebookIDs{ model.facebookIDs, model.facebookIDs + model.facebookIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_facebookIDs, rhs.m_facebookIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFacebookIDs(CStringVector value) + { + m_facebookIDs = std::move(value); + this->m_model.facebookIDs = m_facebookIDs.empty() ? nullptr : m_facebookIDs.data(); + this->m_model.facebookIDsCount = static_cast(m_facebookIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.facebookIDs = m_facebookIDs.empty() ? nullptr : m_facebookIDs.data(); + } + + CStringVector m_facebookIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementFacebookPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementFacebookPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementFacebookPlayFabIdPairWrapper() = default; + + PFAccountManagementFacebookPlayFabIdPairWrapper(const PFAccountManagementFacebookPlayFabIdPair& model) : + ModelWrapper{ model }, + m_facebookId{ SafeString(model.facebookId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementFacebookPlayFabIdPairWrapper(const PFAccountManagementFacebookPlayFabIdPairWrapper& src) : + PFAccountManagementFacebookPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementFacebookPlayFabIdPairWrapper(PFAccountManagementFacebookPlayFabIdPairWrapper&& src) : + PFAccountManagementFacebookPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementFacebookPlayFabIdPairWrapper& operator=(PFAccountManagementFacebookPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementFacebookPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementFacebookPlayFabIdPairWrapper& lhs, PFAccountManagementFacebookPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_facebookId, rhs.m_facebookId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFacebookId(String value) + { + m_facebookId = std::move(value); + this->m_model.facebookId = m_facebookId.empty() ? nullptr : m_facebookId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.facebookId = m_facebookId.empty() ? nullptr : m_facebookId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_facebookId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromFacebookIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest& model) : + ModelWrapper{ model }, + m_facebookInstantGamesIds{ model.facebookInstantGamesIds, model.facebookInstantGamesIds + model.facebookInstantGamesIdsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper(PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_facebookInstantGamesIds, rhs.m_facebookInstantGamesIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFacebookInstantGamesIds(CStringVector value) + { + m_facebookInstantGamesIds = std::move(value); + this->m_model.facebookInstantGamesIds = m_facebookInstantGamesIds.empty() ? nullptr : m_facebookInstantGamesIds.data(); + this->m_model.facebookInstantGamesIdsCount = static_cast(m_facebookInstantGamesIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.facebookInstantGamesIds = m_facebookInstantGamesIds.empty() ? nullptr : m_facebookInstantGamesIds.data(); + } + + CStringVector m_facebookInstantGamesIds; +}; + +template class Alloc = std::allocator> +class PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementFacebookInstantGamesPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper() = default; + + PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper(const PFAccountManagementFacebookInstantGamesPlayFabIdPair& model) : + ModelWrapper{ model }, + m_facebookInstantGamesId{ SafeString(model.facebookInstantGamesId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper(const PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper& src) : + PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper(PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper&& src) : + PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper& operator=(PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper& lhs, PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_facebookInstantGamesId, rhs.m_facebookInstantGamesId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFacebookInstantGamesId(String value) + { + m_facebookInstantGamesId = std::move(value); + this->m_model.facebookInstantGamesId = m_facebookInstantGamesId.empty() ? nullptr : m_facebookInstantGamesId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.facebookInstantGamesId = m_facebookInstantGamesId.empty() ? nullptr : m_facebookInstantGamesId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_facebookInstantGamesId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper(PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest& model) : + ModelWrapper{ model }, + m_gameCenterIDs{ model.gameCenterIDs, model.gameCenterIDs + model.gameCenterIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_gameCenterIDs, rhs.m_gameCenterIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGameCenterIDs(CStringVector value) + { + m_gameCenterIDs = std::move(value); + this->m_model.gameCenterIDs = m_gameCenterIDs.empty() ? nullptr : m_gameCenterIDs.data(); + this->m_model.gameCenterIDsCount = static_cast(m_gameCenterIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.gameCenterIDs = m_gameCenterIDs.empty() ? nullptr : m_gameCenterIDs.data(); + } + + CStringVector m_gameCenterIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGameCenterPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGameCenterPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGameCenterPlayFabIdPairWrapper() = default; + + PFAccountManagementGameCenterPlayFabIdPairWrapper(const PFAccountManagementGameCenterPlayFabIdPair& model) : + ModelWrapper{ model }, + m_gameCenterId{ SafeString(model.gameCenterId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementGameCenterPlayFabIdPairWrapper(const PFAccountManagementGameCenterPlayFabIdPairWrapper& src) : + PFAccountManagementGameCenterPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementGameCenterPlayFabIdPairWrapper(PFAccountManagementGameCenterPlayFabIdPairWrapper&& src) : + PFAccountManagementGameCenterPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGameCenterPlayFabIdPairWrapper& operator=(PFAccountManagementGameCenterPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGameCenterPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementGameCenterPlayFabIdPairWrapper& lhs, PFAccountManagementGameCenterPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_gameCenterId, rhs.m_gameCenterId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGameCenterId(String value) + { + m_gameCenterId = std::move(value); + this->m_model.gameCenterId = m_gameCenterId.empty() ? nullptr : m_gameCenterId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.gameCenterId = m_gameCenterId.empty() ? nullptr : m_gameCenterId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_gameCenterId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest& model) : + ModelWrapper{ model }, + m_googleIDs{ model.googleIDs, model.googleIDs + model.googleIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_googleIDs, rhs.m_googleIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGoogleIDs(CStringVector value) + { + m_googleIDs = std::move(value); + this->m_model.googleIDs = m_googleIDs.empty() ? nullptr : m_googleIDs.data(); + this->m_model.googleIDsCount = static_cast(m_googleIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.googleIDs = m_googleIDs.empty() ? nullptr : m_googleIDs.data(); + } + + CStringVector m_googleIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGooglePlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGooglePlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGooglePlayFabIdPairWrapper() = default; + + PFAccountManagementGooglePlayFabIdPairWrapper(const PFAccountManagementGooglePlayFabIdPair& model) : + ModelWrapper{ model }, + m_googleId{ SafeString(model.googleId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementGooglePlayFabIdPairWrapper(const PFAccountManagementGooglePlayFabIdPairWrapper& src) : + PFAccountManagementGooglePlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementGooglePlayFabIdPairWrapper(PFAccountManagementGooglePlayFabIdPairWrapper&& src) : + PFAccountManagementGooglePlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGooglePlayFabIdPairWrapper& operator=(PFAccountManagementGooglePlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGooglePlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementGooglePlayFabIdPairWrapper& lhs, PFAccountManagementGooglePlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_googleId, rhs.m_googleId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGoogleId(String value) + { + m_googleId = std::move(value); + this->m_model.googleId = m_googleId.empty() ? nullptr : m_googleId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.googleId = m_googleId.empty() ? nullptr : m_googleId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_googleId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromGoogleIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromGoogleIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest& model) : + ModelWrapper{ model }, + m_googlePlayGamesPlayerIDs{ model.googlePlayGamesPlayerIDs, model.googlePlayGamesPlayerIDs + model.googlePlayGamesPlayerIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_googlePlayGamesPlayerIDs, rhs.m_googlePlayGamesPlayerIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGooglePlayGamesPlayerIDs(CStringVector value) + { + m_googlePlayGamesPlayerIDs = std::move(value); + this->m_model.googlePlayGamesPlayerIDs = m_googlePlayGamesPlayerIDs.empty() ? nullptr : m_googlePlayGamesPlayerIDs.data(); + this->m_model.googlePlayGamesPlayerIDsCount = static_cast(m_googlePlayGamesPlayerIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.googlePlayGamesPlayerIDs = m_googlePlayGamesPlayerIDs.empty() ? nullptr : m_googlePlayGamesPlayerIDs.data(); + } + + CStringVector m_googlePlayGamesPlayerIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGooglePlayGamesPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper() = default; + + PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper(const PFAccountManagementGooglePlayGamesPlayFabIdPair& model) : + ModelWrapper{ model }, + m_googlePlayGamesPlayerId{ SafeString(model.googlePlayGamesPlayerId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper(const PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper& src) : + PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper(PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper&& src) : + PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper& operator=(PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper& lhs, PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_googlePlayGamesPlayerId, rhs.m_googlePlayGamesPlayerId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGooglePlayGamesPlayerId(String value) + { + m_googlePlayGamesPlayerId = std::move(value); + this->m_model.googlePlayGamesPlayerId = m_googlePlayGamesPlayerId.empty() ? nullptr : m_googlePlayGamesPlayerId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.googlePlayGamesPlayerId = m_googlePlayGamesPlayerId.empty() ? nullptr : m_googlePlayGamesPlayerId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_googlePlayGamesPlayerId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest& model) : + ModelWrapper{ model }, + m_kongregateIDs{ model.kongregateIDs, model.kongregateIDs + model.kongregateIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_kongregateIDs, rhs.m_kongregateIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKongregateIDs(CStringVector value) + { + m_kongregateIDs = std::move(value); + this->m_model.kongregateIDs = m_kongregateIDs.empty() ? nullptr : m_kongregateIDs.data(); + this->m_model.kongregateIDsCount = static_cast(m_kongregateIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.kongregateIDs = m_kongregateIDs.empty() ? nullptr : m_kongregateIDs.data(); + } + + CStringVector m_kongregateIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementKongregatePlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementKongregatePlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementKongregatePlayFabIdPairWrapper() = default; + + PFAccountManagementKongregatePlayFabIdPairWrapper(const PFAccountManagementKongregatePlayFabIdPair& model) : + ModelWrapper{ model }, + m_kongregateId{ SafeString(model.kongregateId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementKongregatePlayFabIdPairWrapper(const PFAccountManagementKongregatePlayFabIdPairWrapper& src) : + PFAccountManagementKongregatePlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementKongregatePlayFabIdPairWrapper(PFAccountManagementKongregatePlayFabIdPairWrapper&& src) : + PFAccountManagementKongregatePlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementKongregatePlayFabIdPairWrapper& operator=(PFAccountManagementKongregatePlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementKongregatePlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementKongregatePlayFabIdPairWrapper& lhs, PFAccountManagementKongregatePlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_kongregateId, rhs.m_kongregateId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKongregateId(String value) + { + m_kongregateId = std::move(value); + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_kongregateId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromKongregateIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromKongregateIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest& model) : + ModelWrapper{ model }, + m_nintendoAccountIds{ model.nintendoAccountIds, model.nintendoAccountIds + model.nintendoAccountIdsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper(PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_nintendoAccountIds, rhs.m_nintendoAccountIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNintendoAccountIds(CStringVector value) + { + m_nintendoAccountIds = std::move(value); + this->m_model.nintendoAccountIds = m_nintendoAccountIds.empty() ? nullptr : m_nintendoAccountIds.data(); + this->m_model.nintendoAccountIdsCount = static_cast(m_nintendoAccountIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.nintendoAccountIds = m_nintendoAccountIds.empty() ? nullptr : m_nintendoAccountIds.data(); + } + + CStringVector m_nintendoAccountIds; +}; + +template class Alloc = std::allocator> +class PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementNintendoServiceAccountPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper() = default; + + PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper(const PFAccountManagementNintendoServiceAccountPlayFabIdPair& model) : + ModelWrapper{ model }, + m_nintendoServiceAccountId{ SafeString(model.nintendoServiceAccountId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper(const PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper& src) : + PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper(PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper&& src) : + PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper& operator=(PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper& lhs, PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_nintendoServiceAccountId, rhs.m_nintendoServiceAccountId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNintendoServiceAccountId(String value) + { + m_nintendoServiceAccountId = std::move(value); + this->m_model.nintendoServiceAccountId = m_nintendoServiceAccountId.empty() ? nullptr : m_nintendoServiceAccountId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.nintendoServiceAccountId = m_nintendoServiceAccountId.empty() ? nullptr : m_nintendoServiceAccountId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_nintendoServiceAccountId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper(PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest& model) : + ModelWrapper{ model }, + m_nintendoSwitchDeviceIds{ model.nintendoSwitchDeviceIds, model.nintendoSwitchDeviceIds + model.nintendoSwitchDeviceIdsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper(PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_nintendoSwitchDeviceIds, rhs.m_nintendoSwitchDeviceIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNintendoSwitchDeviceIds(CStringVector value) + { + m_nintendoSwitchDeviceIds = std::move(value); + this->m_model.nintendoSwitchDeviceIds = m_nintendoSwitchDeviceIds.empty() ? nullptr : m_nintendoSwitchDeviceIds.data(); + this->m_model.nintendoSwitchDeviceIdsCount = static_cast(m_nintendoSwitchDeviceIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.nintendoSwitchDeviceIds = m_nintendoSwitchDeviceIds.empty() ? nullptr : m_nintendoSwitchDeviceIds.data(); + } + + CStringVector m_nintendoSwitchDeviceIds; +}; + +template class Alloc = std::allocator> +class PFAccountManagementNintendoSwitchPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementNintendoSwitchPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementNintendoSwitchPlayFabIdPairWrapper() = default; + + PFAccountManagementNintendoSwitchPlayFabIdPairWrapper(const PFAccountManagementNintendoSwitchPlayFabIdPair& model) : + ModelWrapper{ model }, + m_nintendoSwitchDeviceId{ SafeString(model.nintendoSwitchDeviceId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementNintendoSwitchPlayFabIdPairWrapper(const PFAccountManagementNintendoSwitchPlayFabIdPairWrapper& src) : + PFAccountManagementNintendoSwitchPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementNintendoSwitchPlayFabIdPairWrapper(PFAccountManagementNintendoSwitchPlayFabIdPairWrapper&& src) : + PFAccountManagementNintendoSwitchPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementNintendoSwitchPlayFabIdPairWrapper& operator=(PFAccountManagementNintendoSwitchPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementNintendoSwitchPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementNintendoSwitchPlayFabIdPairWrapper& lhs, PFAccountManagementNintendoSwitchPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_nintendoSwitchDeviceId, rhs.m_nintendoSwitchDeviceId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNintendoSwitchDeviceId(String value) + { + m_nintendoSwitchDeviceId = std::move(value); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_nintendoSwitchDeviceId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper(PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest& model) : + ModelWrapper{ model }, + m_issuerId{ model.issuerId ? std::optional{ *model.issuerId } : std::nullopt }, + m_PSNAccountIDs{ model.PSNAccountIDs, model.PSNAccountIDs + model.PSNAccountIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_issuerId, rhs.m_issuerId); + swap(lhs.m_PSNAccountIDs, rhs.m_PSNAccountIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetIssuerId(std::optional value) + { + m_issuerId = std::move(value); + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + } + + void SetPSNAccountIDs(CStringVector value) + { + m_PSNAccountIDs = std::move(value); + this->m_model.PSNAccountIDs = m_PSNAccountIDs.empty() ? nullptr : m_PSNAccountIDs.data(); + this->m_model.PSNAccountIDsCount = static_cast(m_PSNAccountIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + this->m_model.PSNAccountIDs = m_PSNAccountIDs.empty() ? nullptr : m_PSNAccountIDs.data(); + } + + std::optional m_issuerId; + CStringVector m_PSNAccountIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementPSNAccountPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementPSNAccountPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementPSNAccountPlayFabIdPairWrapper() = default; + + PFAccountManagementPSNAccountPlayFabIdPairWrapper(const PFAccountManagementPSNAccountPlayFabIdPair& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) }, + m_PSNAccountId{ SafeString(model.PSNAccountId) } + { + SetModelPointers(); + } + + PFAccountManagementPSNAccountPlayFabIdPairWrapper(const PFAccountManagementPSNAccountPlayFabIdPairWrapper& src) : + PFAccountManagementPSNAccountPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementPSNAccountPlayFabIdPairWrapper(PFAccountManagementPSNAccountPlayFabIdPairWrapper&& src) : + PFAccountManagementPSNAccountPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementPSNAccountPlayFabIdPairWrapper& operator=(PFAccountManagementPSNAccountPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementPSNAccountPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementPSNAccountPlayFabIdPairWrapper& lhs, PFAccountManagementPSNAccountPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_PSNAccountId, rhs.m_PSNAccountId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetPSNAccountId(String value) + { + m_PSNAccountId = std::move(value); + this->m_model.PSNAccountId = m_PSNAccountId.empty() ? nullptr : m_PSNAccountId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.PSNAccountId = m_PSNAccountId.empty() ? nullptr : m_PSNAccountId.data(); + } + + String m_playFabId; + String m_PSNAccountId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromSteamIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromSteamIDsRequest& model) : + ModelWrapper{ model }, + m_steamStringIDs{ model.steamStringIDs, model.steamStringIDs + model.steamStringIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_steamStringIDs, rhs.m_steamStringIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetSteamStringIDs(CStringVector value) + { + m_steamStringIDs = std::move(value); + this->m_model.steamStringIDs = m_steamStringIDs.empty() ? nullptr : m_steamStringIDs.data(); + this->m_model.steamStringIDsCount = static_cast(m_steamStringIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.steamStringIDs = m_steamStringIDs.empty() ? nullptr : m_steamStringIDs.data(); + } + + CStringVector m_steamStringIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementSteamPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementSteamPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementSteamPlayFabIdPairWrapper() = default; + + PFAccountManagementSteamPlayFabIdPairWrapper(const PFAccountManagementSteamPlayFabIdPair& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) }, + m_steamStringId{ SafeString(model.steamStringId) } + { + SetModelPointers(); + } + + PFAccountManagementSteamPlayFabIdPairWrapper(const PFAccountManagementSteamPlayFabIdPairWrapper& src) : + PFAccountManagementSteamPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementSteamPlayFabIdPairWrapper(PFAccountManagementSteamPlayFabIdPairWrapper&& src) : + PFAccountManagementSteamPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementSteamPlayFabIdPairWrapper& operator=(PFAccountManagementSteamPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementSteamPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementSteamPlayFabIdPairWrapper& lhs, PFAccountManagementSteamPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_steamStringId, rhs.m_steamStringId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetSteamStringId(String value) + { + m_steamStringId = std::move(value); + this->m_model.steamStringId = m_steamStringId.empty() ? nullptr : m_steamStringId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.steamStringId = m_steamStringId.empty() ? nullptr : m_steamStringId.data(); + } + + String m_playFabId; + String m_steamStringId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromSteamIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromSteamIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest& model) : + ModelWrapper{ model }, + m_twitchIds{ model.twitchIds, model.twitchIds + model.twitchIdsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_twitchIds, rhs.m_twitchIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTwitchIds(CStringVector value) + { + m_twitchIds = std::move(value); + this->m_model.twitchIds = m_twitchIds.empty() ? nullptr : m_twitchIds.data(); + this->m_model.twitchIdsCount = static_cast(m_twitchIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.twitchIds = m_twitchIds.empty() ? nullptr : m_twitchIds.data(); + } + + CStringVector m_twitchIds; +}; + +template class Alloc = std::allocator> +class PFAccountManagementTwitchPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementTwitchPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementTwitchPlayFabIdPairWrapper() = default; + + PFAccountManagementTwitchPlayFabIdPairWrapper(const PFAccountManagementTwitchPlayFabIdPair& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) }, + m_twitchId{ SafeString(model.twitchId) } + { + SetModelPointers(); + } + + PFAccountManagementTwitchPlayFabIdPairWrapper(const PFAccountManagementTwitchPlayFabIdPairWrapper& src) : + PFAccountManagementTwitchPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementTwitchPlayFabIdPairWrapper(PFAccountManagementTwitchPlayFabIdPairWrapper&& src) : + PFAccountManagementTwitchPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementTwitchPlayFabIdPairWrapper& operator=(PFAccountManagementTwitchPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementTwitchPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementTwitchPlayFabIdPairWrapper& lhs, PFAccountManagementTwitchPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_twitchId, rhs.m_twitchId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetTwitchId(String value) + { + m_twitchId = std::move(value); + this->m_model.twitchId = m_twitchId.empty() ? nullptr : m_twitchId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.twitchId = m_twitchId.empty() ? nullptr : m_twitchId.data(); + } + + String m_playFabId; + String m_twitchId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromTwitchIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromTwitchIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest& model) : + ModelWrapper{ model }, + m_sandbox{ SafeString(model.sandbox) }, + m_xboxLiveAccountIDs{ model.xboxLiveAccountIDs, model.xboxLiveAccountIDs + model.xboxLiveAccountIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper& src) : + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper(PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper& operator=(PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper& lhs, PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_sandbox, rhs.m_sandbox); + swap(lhs.m_xboxLiveAccountIDs, rhs.m_xboxLiveAccountIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetSandbox(String value) + { + m_sandbox = std::move(value); + this->m_model.sandbox = m_sandbox.empty() ? nullptr : m_sandbox.data(); + } + + void SetXboxLiveAccountIDs(CStringVector value) + { + m_xboxLiveAccountIDs = std::move(value); + this->m_model.xboxLiveAccountIDs = m_xboxLiveAccountIDs.empty() ? nullptr : m_xboxLiveAccountIDs.data(); + this->m_model.xboxLiveAccountIDsCount = static_cast(m_xboxLiveAccountIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.sandbox = m_sandbox.empty() ? nullptr : m_sandbox.data(); + this->m_model.xboxLiveAccountIDs = m_xboxLiveAccountIDs.empty() ? nullptr : m_xboxLiveAccountIDs.data(); + } + + String m_sandbox; + CStringVector m_xboxLiveAccountIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementXboxLiveAccountPlayFabIdPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper() = default; + + PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper(const PFAccountManagementXboxLiveAccountPlayFabIdPair& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) }, + m_xboxLiveAccountId{ SafeString(model.xboxLiveAccountId) } + { + SetModelPointers(); + } + + PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper(const PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper& src) : + PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper{ src.Model() } + { + } + + PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper(PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper&& src) : + PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper& operator=(PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper() = default; + + friend void swap(PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper& lhs, PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_xboxLiveAccountId, rhs.m_xboxLiveAccountId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetXboxLiveAccountId(String value) + { + m_xboxLiveAccountId = std::move(value); + this->m_model.xboxLiveAccountId = m_xboxLiveAccountId.empty() ? nullptr : m_xboxLiveAccountId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.xboxLiveAccountId = m_xboxLiveAccountId.empty() ? nullptr : m_xboxLiveAccountId.data(); + } + + String m_playFabId; + String m_xboxLiveAccountId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper() = default; + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper& src) : + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper(PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper&& src) : + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper& operator=(PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper& lhs, PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkAndroidDeviceIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkAndroidDeviceIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkAndroidDeviceIDRequestWrapper() = default; + + PFAccountManagementLinkAndroidDeviceIDRequestWrapper(const PFAccountManagementLinkAndroidDeviceIDRequest& model) : + ModelWrapper{ model }, + m_androidDevice{ SafeString(model.androidDevice) }, + m_androidDeviceId{ SafeString(model.androidDeviceId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_OS{ SafeString(model.OS) } + { + SetModelPointers(); + } + + PFAccountManagementLinkAndroidDeviceIDRequestWrapper(const PFAccountManagementLinkAndroidDeviceIDRequestWrapper& src) : + PFAccountManagementLinkAndroidDeviceIDRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkAndroidDeviceIDRequestWrapper(PFAccountManagementLinkAndroidDeviceIDRequestWrapper&& src) : + PFAccountManagementLinkAndroidDeviceIDRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkAndroidDeviceIDRequestWrapper& operator=(PFAccountManagementLinkAndroidDeviceIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkAndroidDeviceIDRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkAndroidDeviceIDRequestWrapper& lhs, PFAccountManagementLinkAndroidDeviceIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_androidDevice, rhs.m_androidDevice); + swap(lhs.m_androidDeviceId, rhs.m_androidDeviceId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_OS, rhs.m_OS); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAndroidDevice(String value) + { + m_androidDevice = std::move(value); + this->m_model.androidDevice = m_androidDevice.empty() ? nullptr : m_androidDevice.data(); + } + + void SetAndroidDeviceId(String value) + { + m_androidDeviceId = std::move(value); + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetOS(String value) + { + m_OS = std::move(value); + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + } + +private: + void SetModelPointers() + { + this->m_model.androidDevice = m_androidDevice.empty() ? nullptr : m_androidDevice.data(); + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + } + + String m_androidDevice; + String m_androidDeviceId; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_OS; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkAppleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkAppleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkAppleRequestWrapper() = default; + + PFAccountManagementLinkAppleRequestWrapper(const PFAccountManagementLinkAppleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_identityToken{ SafeString(model.identityToken) } + { + SetModelPointers(); + } + + PFAccountManagementLinkAppleRequestWrapper(const PFAccountManagementLinkAppleRequestWrapper& src) : + PFAccountManagementLinkAppleRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkAppleRequestWrapper(PFAccountManagementLinkAppleRequestWrapper&& src) : + PFAccountManagementLinkAppleRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkAppleRequestWrapper& operator=(PFAccountManagementLinkAppleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkAppleRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkAppleRequestWrapper& lhs, PFAccountManagementLinkAppleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_identityToken, rhs.m_identityToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetIdentityToken(String value) + { + m_identityToken = std::move(value); + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_identityToken; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkCustomIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkCustomIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkCustomIDRequestWrapper() = default; + + PFAccountManagementLinkCustomIDRequestWrapper(const PFAccountManagementLinkCustomIDRequest& model) : + ModelWrapper{ model }, + m_customId{ SafeString(model.customId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementLinkCustomIDRequestWrapper(const PFAccountManagementLinkCustomIDRequestWrapper& src) : + PFAccountManagementLinkCustomIDRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkCustomIDRequestWrapper(PFAccountManagementLinkCustomIDRequestWrapper&& src) : + PFAccountManagementLinkCustomIDRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkCustomIDRequestWrapper& operator=(PFAccountManagementLinkCustomIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkCustomIDRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkCustomIDRequestWrapper& lhs, PFAccountManagementLinkCustomIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customId, rhs.m_customId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomId(String value) + { + m_customId = std::move(value); + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + String m_customId; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkFacebookAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkFacebookAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkFacebookAccountRequestWrapper() = default; + + PFAccountManagementLinkFacebookAccountRequestWrapper(const PFAccountManagementLinkFacebookAccountRequest& model) : + ModelWrapper{ model }, + m_accessToken{ SafeString(model.accessToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementLinkFacebookAccountRequestWrapper(const PFAccountManagementLinkFacebookAccountRequestWrapper& src) : + PFAccountManagementLinkFacebookAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkFacebookAccountRequestWrapper(PFAccountManagementLinkFacebookAccountRequestWrapper&& src) : + PFAccountManagementLinkFacebookAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkFacebookAccountRequestWrapper& operator=(PFAccountManagementLinkFacebookAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkFacebookAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkFacebookAccountRequestWrapper& lhs, PFAccountManagementLinkFacebookAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_accessToken, rhs.m_accessToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAccessToken(String value) + { + m_accessToken = std::move(value); + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + String m_accessToken; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkFacebookInstantGamesIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper() = default; + + PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper(const PFAccountManagementLinkFacebookInstantGamesIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_facebookInstantGamesSignature{ SafeString(model.facebookInstantGamesSignature) }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper(const PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper& src) : + PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper(PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper&& src) : + PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper& operator=(PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper& lhs, PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_facebookInstantGamesSignature, rhs.m_facebookInstantGamesSignature); + swap(lhs.m_forceLink, rhs.m_forceLink); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetFacebookInstantGamesSignature(String value) + { + m_facebookInstantGamesSignature = std::move(value); + this->m_model.facebookInstantGamesSignature = m_facebookInstantGamesSignature.empty() ? nullptr : m_facebookInstantGamesSignature.data(); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.facebookInstantGamesSignature = m_facebookInstantGamesSignature.empty() ? nullptr : m_facebookInstantGamesSignature.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + String m_facebookInstantGamesSignature; + std::optional m_forceLink; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkGameCenterAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkGameCenterAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkGameCenterAccountRequestWrapper() = default; + + PFAccountManagementLinkGameCenterAccountRequestWrapper(const PFAccountManagementLinkGameCenterAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_gameCenterId{ SafeString(model.gameCenterId) }, + m_publicKeyUrl{ SafeString(model.publicKeyUrl) }, + m_salt{ SafeString(model.salt) }, + m_signature{ SafeString(model.signature) }, + m_timestamp{ SafeString(model.timestamp) } + { + SetModelPointers(); + } + + PFAccountManagementLinkGameCenterAccountRequestWrapper(const PFAccountManagementLinkGameCenterAccountRequestWrapper& src) : + PFAccountManagementLinkGameCenterAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkGameCenterAccountRequestWrapper(PFAccountManagementLinkGameCenterAccountRequestWrapper&& src) : + PFAccountManagementLinkGameCenterAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkGameCenterAccountRequestWrapper& operator=(PFAccountManagementLinkGameCenterAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkGameCenterAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkGameCenterAccountRequestWrapper& lhs, PFAccountManagementLinkGameCenterAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_gameCenterId, rhs.m_gameCenterId); + swap(lhs.m_publicKeyUrl, rhs.m_publicKeyUrl); + swap(lhs.m_salt, rhs.m_salt); + swap(lhs.m_signature, rhs.m_signature); + swap(lhs.m_timestamp, rhs.m_timestamp); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetGameCenterId(String value) + { + m_gameCenterId = std::move(value); + this->m_model.gameCenterId = m_gameCenterId.empty() ? nullptr : m_gameCenterId.data(); + } + + void SetPublicKeyUrl(String value) + { + m_publicKeyUrl = std::move(value); + this->m_model.publicKeyUrl = m_publicKeyUrl.empty() ? nullptr : m_publicKeyUrl.data(); + } + + void SetSalt(String value) + { + m_salt = std::move(value); + this->m_model.salt = m_salt.empty() ? nullptr : m_salt.data(); + } + + void SetSignature(String value) + { + m_signature = std::move(value); + this->m_model.signature = m_signature.empty() ? nullptr : m_signature.data(); + } + + void SetTimestamp(String value) + { + m_timestamp = std::move(value); + this->m_model.timestamp = m_timestamp.empty() ? nullptr : m_timestamp.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.gameCenterId = m_gameCenterId.empty() ? nullptr : m_gameCenterId.data(); + this->m_model.publicKeyUrl = m_publicKeyUrl.empty() ? nullptr : m_publicKeyUrl.data(); + this->m_model.salt = m_salt.empty() ? nullptr : m_salt.data(); + this->m_model.signature = m_signature.empty() ? nullptr : m_signature.data(); + this->m_model.timestamp = m_timestamp.empty() ? nullptr : m_timestamp.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_gameCenterId; + String m_publicKeyUrl; + String m_salt; + String m_signature; + String m_timestamp; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkGoogleAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkGoogleAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkGoogleAccountRequestWrapper() = default; + + PFAccountManagementLinkGoogleAccountRequestWrapper(const PFAccountManagementLinkGoogleAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_serverAuthCode{ SafeString(model.serverAuthCode) } + { + SetModelPointers(); + } + + PFAccountManagementLinkGoogleAccountRequestWrapper(const PFAccountManagementLinkGoogleAccountRequestWrapper& src) : + PFAccountManagementLinkGoogleAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkGoogleAccountRequestWrapper(PFAccountManagementLinkGoogleAccountRequestWrapper&& src) : + PFAccountManagementLinkGoogleAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkGoogleAccountRequestWrapper& operator=(PFAccountManagementLinkGoogleAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkGoogleAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkGoogleAccountRequestWrapper& lhs, PFAccountManagementLinkGoogleAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_serverAuthCode, rhs.m_serverAuthCode); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetServerAuthCode(String value) + { + m_serverAuthCode = std::move(value); + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_serverAuthCode; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkGooglePlayGamesServicesAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper() = default; + + PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper(const PFAccountManagementLinkGooglePlayGamesServicesAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_serverAuthCode{ SafeString(model.serverAuthCode) } + { + SetModelPointers(); + } + + PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper(const PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper& src) : + PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper(PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper&& src) : + PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper& operator=(PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper& lhs, PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_serverAuthCode, rhs.m_serverAuthCode); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetServerAuthCode(String value) + { + m_serverAuthCode = std::move(value); + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.serverAuthCode = m_serverAuthCode.empty() ? nullptr : m_serverAuthCode.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_serverAuthCode; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkIOSDeviceIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkIOSDeviceIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkIOSDeviceIDRequestWrapper() = default; + + PFAccountManagementLinkIOSDeviceIDRequestWrapper(const PFAccountManagementLinkIOSDeviceIDRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_deviceId{ SafeString(model.deviceId) }, + m_deviceModel{ SafeString(model.deviceModel) }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_OS{ SafeString(model.OS) } + { + SetModelPointers(); + } + + PFAccountManagementLinkIOSDeviceIDRequestWrapper(const PFAccountManagementLinkIOSDeviceIDRequestWrapper& src) : + PFAccountManagementLinkIOSDeviceIDRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkIOSDeviceIDRequestWrapper(PFAccountManagementLinkIOSDeviceIDRequestWrapper&& src) : + PFAccountManagementLinkIOSDeviceIDRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkIOSDeviceIDRequestWrapper& operator=(PFAccountManagementLinkIOSDeviceIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkIOSDeviceIDRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkIOSDeviceIDRequestWrapper& lhs, PFAccountManagementLinkIOSDeviceIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_deviceId, rhs.m_deviceId); + swap(lhs.m_deviceModel, rhs.m_deviceModel); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_OS, rhs.m_OS); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDeviceId(String value) + { + m_deviceId = std::move(value); + this->m_model.deviceId = m_deviceId.empty() ? nullptr : m_deviceId.data(); + } + + void SetDeviceModel(String value) + { + m_deviceModel = std::move(value); + this->m_model.deviceModel = m_deviceModel.empty() ? nullptr : m_deviceModel.data(); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetOS(String value) + { + m_OS = std::move(value); + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.deviceId = m_deviceId.empty() ? nullptr : m_deviceId.data(); + this->m_model.deviceModel = m_deviceModel.empty() ? nullptr : m_deviceModel.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.OS = m_OS.empty() ? nullptr : m_OS.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_deviceId; + String m_deviceModel; + std::optional m_forceLink; + String m_OS; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkKongregateAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkKongregateAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkKongregateAccountRequestWrapper() = default; + + PFAccountManagementLinkKongregateAccountRequestWrapper(const PFAccountManagementLinkKongregateAccountRequest& model) : + ModelWrapper{ model }, + m_authTicket{ SafeString(model.authTicket) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_kongregateId{ SafeString(model.kongregateId) } + { + SetModelPointers(); + } + + PFAccountManagementLinkKongregateAccountRequestWrapper(const PFAccountManagementLinkKongregateAccountRequestWrapper& src) : + PFAccountManagementLinkKongregateAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkKongregateAccountRequestWrapper(PFAccountManagementLinkKongregateAccountRequestWrapper&& src) : + PFAccountManagementLinkKongregateAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkKongregateAccountRequestWrapper& operator=(PFAccountManagementLinkKongregateAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkKongregateAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkKongregateAccountRequestWrapper& lhs, PFAccountManagementLinkKongregateAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_authTicket, rhs.m_authTicket); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_kongregateId, rhs.m_kongregateId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAuthTicket(String value) + { + m_authTicket = std::move(value); + this->m_model.authTicket = m_authTicket.empty() ? nullptr : m_authTicket.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetKongregateId(String value) + { + m_kongregateId = std::move(value); + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.authTicket = m_authTicket.empty() ? nullptr : m_authTicket.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.kongregateId = m_kongregateId.empty() ? nullptr : m_kongregateId.data(); + } + + String m_authTicket; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_kongregateId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientLinkNintendoServiceAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper() = default; + + PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper(const PFAccountManagementClientLinkNintendoServiceAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_identityToken{ SafeString(model.identityToken) } + { + SetModelPointers(); + } + + PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper(const PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper& src) : + PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper(PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper&& src) : + PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper& operator=(PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper& lhs, PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_identityToken, rhs.m_identityToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetIdentityToken(String value) + { + m_identityToken = std::move(value); + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_identityToken; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper() = default; + + PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_nintendoSwitchDeviceId{ SafeString(model.nintendoSwitchDeviceId) } + { + SetModelPointers(); + } + + PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper& src) : + PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper(PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper&& src) : + PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper& operator=(PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper() = default; + + friend void swap(PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper& lhs, PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_nintendoSwitchDeviceId, rhs.m_nintendoSwitchDeviceId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetNintendoSwitchDeviceId(String value) + { + m_nintendoSwitchDeviceId = std::move(value); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_nintendoSwitchDeviceId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkOpenIdConnectRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkOpenIdConnectRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkOpenIdConnectRequestWrapper() = default; + + PFAccountManagementLinkOpenIdConnectRequestWrapper(const PFAccountManagementLinkOpenIdConnectRequest& model) : + ModelWrapper{ model }, + m_connectionId{ SafeString(model.connectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_idToken{ SafeString(model.idToken) } + { + SetModelPointers(); + } + + PFAccountManagementLinkOpenIdConnectRequestWrapper(const PFAccountManagementLinkOpenIdConnectRequestWrapper& src) : + PFAccountManagementLinkOpenIdConnectRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkOpenIdConnectRequestWrapper(PFAccountManagementLinkOpenIdConnectRequestWrapper&& src) : + PFAccountManagementLinkOpenIdConnectRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkOpenIdConnectRequestWrapper& operator=(PFAccountManagementLinkOpenIdConnectRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkOpenIdConnectRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkOpenIdConnectRequestWrapper& lhs, PFAccountManagementLinkOpenIdConnectRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_connectionId, rhs.m_connectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_idToken, rhs.m_idToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConnectionId(String value) + { + m_connectionId = std::move(value); + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetIdToken(String value) + { + m_idToken = std::move(value); + this->m_model.idToken = m_idToken.empty() ? nullptr : m_idToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.idToken = m_idToken.empty() ? nullptr : m_idToken.data(); + } + + String m_connectionId; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_idToken; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientLinkPSNAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientLinkPSNAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientLinkPSNAccountRequestWrapper() = default; + + PFAccountManagementClientLinkPSNAccountRequestWrapper(const PFAccountManagementClientLinkPSNAccountRequest& model) : + ModelWrapper{ model }, + m_authCode{ SafeString(model.authCode) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_issuerId{ model.issuerId ? std::optional{ *model.issuerId } : std::nullopt }, + m_redirectUri{ SafeString(model.redirectUri) } + { + SetModelPointers(); + } + + PFAccountManagementClientLinkPSNAccountRequestWrapper(const PFAccountManagementClientLinkPSNAccountRequestWrapper& src) : + PFAccountManagementClientLinkPSNAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientLinkPSNAccountRequestWrapper(PFAccountManagementClientLinkPSNAccountRequestWrapper&& src) : + PFAccountManagementClientLinkPSNAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientLinkPSNAccountRequestWrapper& operator=(PFAccountManagementClientLinkPSNAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientLinkPSNAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementClientLinkPSNAccountRequestWrapper& lhs, PFAccountManagementClientLinkPSNAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_authCode, rhs.m_authCode); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_issuerId, rhs.m_issuerId); + swap(lhs.m_redirectUri, rhs.m_redirectUri); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAuthCode(String value) + { + m_authCode = std::move(value); + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetIssuerId(std::optional value) + { + m_issuerId = std::move(value); + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + } + + void SetRedirectUri(String value) + { + m_redirectUri = std::move(value); + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + +private: + void SetModelPointers() + { + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + + String m_authCode; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + std::optional m_issuerId; + String m_redirectUri; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkSteamAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkSteamAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkSteamAccountRequestWrapper() = default; + + PFAccountManagementLinkSteamAccountRequestWrapper(const PFAccountManagementLinkSteamAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_steamTicket{ SafeString(model.steamTicket) }, + m_ticketIsServiceSpecific{ model.ticketIsServiceSpecific ? std::optional{ *model.ticketIsServiceSpecific } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementLinkSteamAccountRequestWrapper(const PFAccountManagementLinkSteamAccountRequestWrapper& src) : + PFAccountManagementLinkSteamAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkSteamAccountRequestWrapper(PFAccountManagementLinkSteamAccountRequestWrapper&& src) : + PFAccountManagementLinkSteamAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkSteamAccountRequestWrapper& operator=(PFAccountManagementLinkSteamAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkSteamAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkSteamAccountRequestWrapper& lhs, PFAccountManagementLinkSteamAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_steamTicket, rhs.m_steamTicket); + swap(lhs.m_ticketIsServiceSpecific, rhs.m_ticketIsServiceSpecific); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetSteamTicket(String value) + { + m_steamTicket = std::move(value); + this->m_model.steamTicket = m_steamTicket.empty() ? nullptr : m_steamTicket.data(); + } + + void SetTicketIsServiceSpecific(std::optional value) + { + m_ticketIsServiceSpecific = std::move(value); + this->m_model.ticketIsServiceSpecific = m_ticketIsServiceSpecific ? m_ticketIsServiceSpecific.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.steamTicket = m_steamTicket.empty() ? nullptr : m_steamTicket.data(); + this->m_model.ticketIsServiceSpecific = m_ticketIsServiceSpecific ? m_ticketIsServiceSpecific.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_steamTicket; + std::optional m_ticketIsServiceSpecific; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkTwitchAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkTwitchAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkTwitchAccountRequestWrapper() = default; + + PFAccountManagementLinkTwitchAccountRequestWrapper(const PFAccountManagementLinkTwitchAccountRequest& model) : + ModelWrapper{ model }, + m_accessToken{ SafeString(model.accessToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementLinkTwitchAccountRequestWrapper(const PFAccountManagementLinkTwitchAccountRequestWrapper& src) : + PFAccountManagementLinkTwitchAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkTwitchAccountRequestWrapper(PFAccountManagementLinkTwitchAccountRequestWrapper&& src) : + PFAccountManagementLinkTwitchAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkTwitchAccountRequestWrapper& operator=(PFAccountManagementLinkTwitchAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkTwitchAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkTwitchAccountRequestWrapper& lhs, PFAccountManagementLinkTwitchAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_accessToken, rhs.m_accessToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAccessToken(String value) + { + m_accessToken = std::move(value); + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + String m_accessToken; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientLinkXboxAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientLinkXboxAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + +#if HC_PLATFORM == HC_PLATFORM_GDK + PFAccountManagementClientLinkXboxAccountRequestWrapper(XUser user) + : m_user{ std::move(user) } + { + SetModelPointers(); + } +#else + PFAccountManagementClientLinkXboxAccountRequestWrapper() = default; +#endif + + PFAccountManagementClientLinkXboxAccountRequestWrapper(const PFAccountManagementClientLinkXboxAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, +#if HC_PLATFORM == HC_PLATFORM_GDK + m_user{ XUser::Duplicate(model.user) } +#else + m_xboxToken{ SafeString(model.xboxToken) } +#endif + { + SetModelPointers(); + } + + PFAccountManagementClientLinkXboxAccountRequestWrapper(const PFAccountManagementClientLinkXboxAccountRequestWrapper& src) : + PFAccountManagementClientLinkXboxAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientLinkXboxAccountRequestWrapper(PFAccountManagementClientLinkXboxAccountRequestWrapper&& src) : +#if HC_PLATFORM == HC_PLATFORM_GDK + PFAccountManagementClientLinkXboxAccountRequestWrapper{ XUser::Wrap(nullptr) } +#else + PFAccountManagementClientLinkXboxAccountRequestWrapper{} +#endif + { + swap(*this, src); + } + + PFAccountManagementClientLinkXboxAccountRequestWrapper& operator=(PFAccountManagementClientLinkXboxAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientLinkXboxAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementClientLinkXboxAccountRequestWrapper& lhs, PFAccountManagementClientLinkXboxAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); +#if HC_PLATFORM == HC_PLATFORM_GDK + swap(lhs.m_user, rhs.m_user); +#endif + swap(lhs.m_xboxToken, rhs.m_xboxToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + +#if HC_PLATFORM == HC_PLATFORM_GDK + void SetUser(XUser value) + { + m_user = std::move(value); + this->m_model.user = m_user.Handle(); + } +#else + void SetXboxToken(String value) + { + m_xboxToken = std::move(value); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } +#endif + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; +#if HC_PLATFORM == HC_PLATFORM_GDK + this->m_model.user = m_user.Handle(); +#else + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); +#endif + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; +#if HC_PLATFORM == HC_PLATFORM_GDK + XUser m_user; +#endif + String m_xboxToken; +}; + +template class Alloc = std::allocator> +class PFAccountManagementRemoveContactEmailRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementRemoveContactEmailRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementRemoveContactEmailRequestWrapper() = default; + + PFAccountManagementRemoveContactEmailRequestWrapper(const PFAccountManagementRemoveContactEmailRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementRemoveContactEmailRequestWrapper(const PFAccountManagementRemoveContactEmailRequestWrapper& src) : + PFAccountManagementRemoveContactEmailRequestWrapper{ src.Model() } + { + } + + PFAccountManagementRemoveContactEmailRequestWrapper(PFAccountManagementRemoveContactEmailRequestWrapper&& src) : + PFAccountManagementRemoveContactEmailRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementRemoveContactEmailRequestWrapper& operator=(PFAccountManagementRemoveContactEmailRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementRemoveContactEmailRequestWrapper() = default; + + friend void swap(PFAccountManagementRemoveContactEmailRequestWrapper& lhs, PFAccountManagementRemoveContactEmailRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementReportPlayerClientRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementReportPlayerClientRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementReportPlayerClientRequestWrapper() = default; + + PFAccountManagementReportPlayerClientRequestWrapper(const PFAccountManagementReportPlayerClientRequest& model) : + ModelWrapper{ model }, + m_comment{ SafeString(model.comment) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_reporteeId{ SafeString(model.reporteeId) } + { + SetModelPointers(); + } + + PFAccountManagementReportPlayerClientRequestWrapper(const PFAccountManagementReportPlayerClientRequestWrapper& src) : + PFAccountManagementReportPlayerClientRequestWrapper{ src.Model() } + { + } + + PFAccountManagementReportPlayerClientRequestWrapper(PFAccountManagementReportPlayerClientRequestWrapper&& src) : + PFAccountManagementReportPlayerClientRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementReportPlayerClientRequestWrapper& operator=(PFAccountManagementReportPlayerClientRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementReportPlayerClientRequestWrapper() = default; + + friend void swap(PFAccountManagementReportPlayerClientRequestWrapper& lhs, PFAccountManagementReportPlayerClientRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_comment, rhs.m_comment); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_reporteeId, rhs.m_reporteeId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetComment(String value) + { + m_comment = std::move(value); + this->m_model.comment = m_comment.empty() ? nullptr : m_comment.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetReporteeId(String value) + { + m_reporteeId = std::move(value); + this->m_model.reporteeId = m_reporteeId.empty() ? nullptr : m_reporteeId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.comment = m_comment.empty() ? nullptr : m_comment.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.reporteeId = m_reporteeId.empty() ? nullptr : m_reporteeId.data(); + } + + String m_comment; + StringDictionaryEntryVector m_customTags; + String m_reporteeId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementReportPlayerClientResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementReportPlayerClientResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetSubmissionsRemaining(int32_t value) + { + this->m_model.submissionsRemaining = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFAccountManagementSendAccountRecoveryEmailRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementSendAccountRecoveryEmailRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementSendAccountRecoveryEmailRequestWrapper() = default; + + PFAccountManagementSendAccountRecoveryEmailRequestWrapper(const PFAccountManagementSendAccountRecoveryEmailRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_email{ SafeString(model.email) }, + m_emailTemplateId{ SafeString(model.emailTemplateId) }, + m_titleId{ SafeString(model.titleId) } + { + SetModelPointers(); + } + + PFAccountManagementSendAccountRecoveryEmailRequestWrapper(const PFAccountManagementSendAccountRecoveryEmailRequestWrapper& src) : + PFAccountManagementSendAccountRecoveryEmailRequestWrapper{ src.Model() } + { + } + + PFAccountManagementSendAccountRecoveryEmailRequestWrapper(PFAccountManagementSendAccountRecoveryEmailRequestWrapper&& src) : + PFAccountManagementSendAccountRecoveryEmailRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementSendAccountRecoveryEmailRequestWrapper& operator=(PFAccountManagementSendAccountRecoveryEmailRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementSendAccountRecoveryEmailRequestWrapper() = default; + + friend void swap(PFAccountManagementSendAccountRecoveryEmailRequestWrapper& lhs, PFAccountManagementSendAccountRecoveryEmailRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_emailTemplateId, rhs.m_emailTemplateId); + swap(lhs.m_titleId, rhs.m_titleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetEmailTemplateId(String value) + { + m_emailTemplateId = std::move(value); + this->m_model.emailTemplateId = m_emailTemplateId.empty() ? nullptr : m_emailTemplateId.data(); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.emailTemplateId = m_emailTemplateId.empty() ? nullptr : m_emailTemplateId.data(); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_email; + String m_emailTemplateId; + String m_titleId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkAndroidDeviceIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper() = default; + + PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper(const PFAccountManagementUnlinkAndroidDeviceIDRequest& model) : + ModelWrapper{ model }, + m_androidDeviceId{ SafeString(model.androidDeviceId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper(const PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper& src) : + PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper(PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper&& src) : + PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper& operator=(PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper& lhs, PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_androidDeviceId, rhs.m_androidDeviceId); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAndroidDeviceId(String value) + { + m_androidDeviceId = std::move(value); + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.androidDeviceId = m_androidDeviceId.empty() ? nullptr : m_androidDeviceId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + String m_androidDeviceId; + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkAppleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkAppleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkAppleRequestWrapper() = default; + + PFAccountManagementUnlinkAppleRequestWrapper(const PFAccountManagementUnlinkAppleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkAppleRequestWrapper(const PFAccountManagementUnlinkAppleRequestWrapper& src) : + PFAccountManagementUnlinkAppleRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkAppleRequestWrapper(PFAccountManagementUnlinkAppleRequestWrapper&& src) : + PFAccountManagementUnlinkAppleRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkAppleRequestWrapper& operator=(PFAccountManagementUnlinkAppleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkAppleRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkAppleRequestWrapper& lhs, PFAccountManagementUnlinkAppleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkCustomIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkCustomIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkCustomIDRequestWrapper() = default; + + PFAccountManagementUnlinkCustomIDRequestWrapper(const PFAccountManagementUnlinkCustomIDRequest& model) : + ModelWrapper{ model }, + m_customId{ SafeString(model.customId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkCustomIDRequestWrapper(const PFAccountManagementUnlinkCustomIDRequestWrapper& src) : + PFAccountManagementUnlinkCustomIDRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkCustomIDRequestWrapper(PFAccountManagementUnlinkCustomIDRequestWrapper&& src) : + PFAccountManagementUnlinkCustomIDRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkCustomIDRequestWrapper& operator=(PFAccountManagementUnlinkCustomIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkCustomIDRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkCustomIDRequestWrapper& lhs, PFAccountManagementUnlinkCustomIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customId, rhs.m_customId); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomId(String value) + { + m_customId = std::move(value); + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customId = m_customId.empty() ? nullptr : m_customId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + String m_customId; + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkFacebookAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkFacebookAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkFacebookAccountRequestWrapper() = default; + + PFAccountManagementUnlinkFacebookAccountRequestWrapper(const PFAccountManagementUnlinkFacebookAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkFacebookAccountRequestWrapper(const PFAccountManagementUnlinkFacebookAccountRequestWrapper& src) : + PFAccountManagementUnlinkFacebookAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkFacebookAccountRequestWrapper(PFAccountManagementUnlinkFacebookAccountRequestWrapper&& src) : + PFAccountManagementUnlinkFacebookAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkFacebookAccountRequestWrapper& operator=(PFAccountManagementUnlinkFacebookAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkFacebookAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkFacebookAccountRequestWrapper& lhs, PFAccountManagementUnlinkFacebookAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkFacebookInstantGamesIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper() = default; + + PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper(const PFAccountManagementUnlinkFacebookInstantGamesIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_facebookInstantGamesId{ SafeString(model.facebookInstantGamesId) } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper(const PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper& src) : + PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper(PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper&& src) : + PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper& operator=(PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper& lhs, PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_facebookInstantGamesId, rhs.m_facebookInstantGamesId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetFacebookInstantGamesId(String value) + { + m_facebookInstantGamesId = std::move(value); + this->m_model.facebookInstantGamesId = m_facebookInstantGamesId.empty() ? nullptr : m_facebookInstantGamesId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.facebookInstantGamesId = m_facebookInstantGamesId.empty() ? nullptr : m_facebookInstantGamesId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_facebookInstantGamesId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkGameCenterAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkGameCenterAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkGameCenterAccountRequestWrapper() = default; + + PFAccountManagementUnlinkGameCenterAccountRequestWrapper(const PFAccountManagementUnlinkGameCenterAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkGameCenterAccountRequestWrapper(const PFAccountManagementUnlinkGameCenterAccountRequestWrapper& src) : + PFAccountManagementUnlinkGameCenterAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkGameCenterAccountRequestWrapper(PFAccountManagementUnlinkGameCenterAccountRequestWrapper&& src) : + PFAccountManagementUnlinkGameCenterAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkGameCenterAccountRequestWrapper& operator=(PFAccountManagementUnlinkGameCenterAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkGameCenterAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkGameCenterAccountRequestWrapper& lhs, PFAccountManagementUnlinkGameCenterAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkGoogleAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkGoogleAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkGoogleAccountRequestWrapper() = default; + + PFAccountManagementUnlinkGoogleAccountRequestWrapper(const PFAccountManagementUnlinkGoogleAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkGoogleAccountRequestWrapper(const PFAccountManagementUnlinkGoogleAccountRequestWrapper& src) : + PFAccountManagementUnlinkGoogleAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkGoogleAccountRequestWrapper(PFAccountManagementUnlinkGoogleAccountRequestWrapper&& src) : + PFAccountManagementUnlinkGoogleAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkGoogleAccountRequestWrapper& operator=(PFAccountManagementUnlinkGoogleAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkGoogleAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkGoogleAccountRequestWrapper& lhs, PFAccountManagementUnlinkGoogleAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper() = default; + + PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper(const PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper(const PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper& src) : + PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper(PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper&& src) : + PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper& operator=(PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper& lhs, PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkIOSDeviceIDRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkIOSDeviceIDRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkIOSDeviceIDRequestWrapper() = default; + + PFAccountManagementUnlinkIOSDeviceIDRequestWrapper(const PFAccountManagementUnlinkIOSDeviceIDRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_deviceId{ SafeString(model.deviceId) } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkIOSDeviceIDRequestWrapper(const PFAccountManagementUnlinkIOSDeviceIDRequestWrapper& src) : + PFAccountManagementUnlinkIOSDeviceIDRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkIOSDeviceIDRequestWrapper(PFAccountManagementUnlinkIOSDeviceIDRequestWrapper&& src) : + PFAccountManagementUnlinkIOSDeviceIDRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkIOSDeviceIDRequestWrapper& operator=(PFAccountManagementUnlinkIOSDeviceIDRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkIOSDeviceIDRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkIOSDeviceIDRequestWrapper& lhs, PFAccountManagementUnlinkIOSDeviceIDRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_deviceId, rhs.m_deviceId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDeviceId(String value) + { + m_deviceId = std::move(value); + this->m_model.deviceId = m_deviceId.empty() ? nullptr : m_deviceId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.deviceId = m_deviceId.empty() ? nullptr : m_deviceId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_deviceId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkKongregateAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkKongregateAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkKongregateAccountRequestWrapper() = default; + + PFAccountManagementUnlinkKongregateAccountRequestWrapper(const PFAccountManagementUnlinkKongregateAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkKongregateAccountRequestWrapper(const PFAccountManagementUnlinkKongregateAccountRequestWrapper& src) : + PFAccountManagementUnlinkKongregateAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkKongregateAccountRequestWrapper(PFAccountManagementUnlinkKongregateAccountRequestWrapper&& src) : + PFAccountManagementUnlinkKongregateAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkKongregateAccountRequestWrapper& operator=(PFAccountManagementUnlinkKongregateAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkKongregateAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkKongregateAccountRequestWrapper& lhs, PFAccountManagementUnlinkKongregateAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientUnlinkNintendoServiceAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper() = default; + + PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper(const PFAccountManagementClientUnlinkNintendoServiceAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper(const PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper& src) : + PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper(PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper&& src) : + PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper& operator=(PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper& lhs, PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper() = default; + + PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_nintendoSwitchDeviceId{ SafeString(model.nintendoSwitchDeviceId) } + { + SetModelPointers(); + } + + PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper& src) : + PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper(PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper&& src) : + PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper& operator=(PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper() = default; + + friend void swap(PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper& lhs, PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_nintendoSwitchDeviceId, rhs.m_nintendoSwitchDeviceId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetNintendoSwitchDeviceId(String value) + { + m_nintendoSwitchDeviceId = std::move(value); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_nintendoSwitchDeviceId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkOpenIdConnectRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkOpenIdConnectRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkOpenIdConnectRequestWrapper() = default; + + PFAccountManagementUnlinkOpenIdConnectRequestWrapper(const PFAccountManagementUnlinkOpenIdConnectRequest& model) : + ModelWrapper{ model }, + m_connectionId{ SafeString(model.connectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkOpenIdConnectRequestWrapper(const PFAccountManagementUnlinkOpenIdConnectRequestWrapper& src) : + PFAccountManagementUnlinkOpenIdConnectRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkOpenIdConnectRequestWrapper(PFAccountManagementUnlinkOpenIdConnectRequestWrapper&& src) : + PFAccountManagementUnlinkOpenIdConnectRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkOpenIdConnectRequestWrapper& operator=(PFAccountManagementUnlinkOpenIdConnectRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkOpenIdConnectRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkOpenIdConnectRequestWrapper& lhs, PFAccountManagementUnlinkOpenIdConnectRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_connectionId, rhs.m_connectionId); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConnectionId(String value) + { + m_connectionId = std::move(value); + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.connectionId = m_connectionId.empty() ? nullptr : m_connectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + String m_connectionId; + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientUnlinkPSNAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientUnlinkPSNAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientUnlinkPSNAccountRequestWrapper() = default; + + PFAccountManagementClientUnlinkPSNAccountRequestWrapper(const PFAccountManagementClientUnlinkPSNAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementClientUnlinkPSNAccountRequestWrapper(const PFAccountManagementClientUnlinkPSNAccountRequestWrapper& src) : + PFAccountManagementClientUnlinkPSNAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientUnlinkPSNAccountRequestWrapper(PFAccountManagementClientUnlinkPSNAccountRequestWrapper&& src) : + PFAccountManagementClientUnlinkPSNAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientUnlinkPSNAccountRequestWrapper& operator=(PFAccountManagementClientUnlinkPSNAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientUnlinkPSNAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementClientUnlinkPSNAccountRequestWrapper& lhs, PFAccountManagementClientUnlinkPSNAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkSteamAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkSteamAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkSteamAccountRequestWrapper() = default; + + PFAccountManagementUnlinkSteamAccountRequestWrapper(const PFAccountManagementUnlinkSteamAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkSteamAccountRequestWrapper(const PFAccountManagementUnlinkSteamAccountRequestWrapper& src) : + PFAccountManagementUnlinkSteamAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkSteamAccountRequestWrapper(PFAccountManagementUnlinkSteamAccountRequestWrapper&& src) : + PFAccountManagementUnlinkSteamAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkSteamAccountRequestWrapper& operator=(PFAccountManagementUnlinkSteamAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkSteamAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkSteamAccountRequestWrapper& lhs, PFAccountManagementUnlinkSteamAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkTwitchAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkTwitchAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkTwitchAccountRequestWrapper() = default; + + PFAccountManagementUnlinkTwitchAccountRequestWrapper(const PFAccountManagementUnlinkTwitchAccountRequest& model) : + ModelWrapper{ model }, + m_accessToken{ SafeString(model.accessToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkTwitchAccountRequestWrapper(const PFAccountManagementUnlinkTwitchAccountRequestWrapper& src) : + PFAccountManagementUnlinkTwitchAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkTwitchAccountRequestWrapper(PFAccountManagementUnlinkTwitchAccountRequestWrapper&& src) : + PFAccountManagementUnlinkTwitchAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkTwitchAccountRequestWrapper& operator=(PFAccountManagementUnlinkTwitchAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkTwitchAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkTwitchAccountRequestWrapper& lhs, PFAccountManagementUnlinkTwitchAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_accessToken, rhs.m_accessToken); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAccessToken(String value) + { + m_accessToken = std::move(value); + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.accessToken = m_accessToken.empty() ? nullptr : m_accessToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + String m_accessToken; + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientUnlinkXboxAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientUnlinkXboxAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientUnlinkXboxAccountRequestWrapper() = default; + + PFAccountManagementClientUnlinkXboxAccountRequestWrapper(const PFAccountManagementClientUnlinkXboxAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementClientUnlinkXboxAccountRequestWrapper(const PFAccountManagementClientUnlinkXboxAccountRequestWrapper& src) : + PFAccountManagementClientUnlinkXboxAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientUnlinkXboxAccountRequestWrapper(PFAccountManagementClientUnlinkXboxAccountRequestWrapper&& src) : + PFAccountManagementClientUnlinkXboxAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientUnlinkXboxAccountRequestWrapper& operator=(PFAccountManagementClientUnlinkXboxAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientUnlinkXboxAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementClientUnlinkXboxAccountRequestWrapper& lhs, PFAccountManagementClientUnlinkXboxAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementClientUpdateAvatarUrlRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementClientUpdateAvatarUrlRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementClientUpdateAvatarUrlRequestWrapper() = default; + + PFAccountManagementClientUpdateAvatarUrlRequestWrapper(const PFAccountManagementClientUpdateAvatarUrlRequest& model) : + ModelWrapper{ model }, + m_imageUrl{ SafeString(model.imageUrl) } + { + SetModelPointers(); + } + + PFAccountManagementClientUpdateAvatarUrlRequestWrapper(const PFAccountManagementClientUpdateAvatarUrlRequestWrapper& src) : + PFAccountManagementClientUpdateAvatarUrlRequestWrapper{ src.Model() } + { + } + + PFAccountManagementClientUpdateAvatarUrlRequestWrapper(PFAccountManagementClientUpdateAvatarUrlRequestWrapper&& src) : + PFAccountManagementClientUpdateAvatarUrlRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementClientUpdateAvatarUrlRequestWrapper& operator=(PFAccountManagementClientUpdateAvatarUrlRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementClientUpdateAvatarUrlRequestWrapper() = default; + + friend void swap(PFAccountManagementClientUpdateAvatarUrlRequestWrapper& lhs, PFAccountManagementClientUpdateAvatarUrlRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_imageUrl, rhs.m_imageUrl); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetImageUrl(String value) + { + m_imageUrl = std::move(value); + this->m_model.imageUrl = m_imageUrl.empty() ? nullptr : m_imageUrl.data(); + } + +private: + void SetModelPointers() + { + this->m_model.imageUrl = m_imageUrl.empty() ? nullptr : m_imageUrl.data(); + } + + String m_imageUrl; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUpdateUserTitleDisplayNameRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper() = default; + + PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper(const PFAccountManagementUpdateUserTitleDisplayNameRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_displayName{ SafeString(model.displayName) } + { + SetModelPointers(); + } + + PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper(const PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper& src) : + PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper(PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper&& src) : + PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper& operator=(PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper() = default; + + friend void swap(PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper& lhs, PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_displayName, rhs.m_displayName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_displayName; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUpdateUserTitleDisplayNameResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUpdateUserTitleDisplayNameResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUpdateUserTitleDisplayNameResultWrapper() = default; + + PFAccountManagementUpdateUserTitleDisplayNameResultWrapper(const PFAccountManagementUpdateUserTitleDisplayNameResult& model) : + ModelWrapper{ model }, + m_displayName{ SafeString(model.displayName) } + { + SetModelPointers(); + } + + PFAccountManagementUpdateUserTitleDisplayNameResultWrapper(const PFAccountManagementUpdateUserTitleDisplayNameResultWrapper& src) : + PFAccountManagementUpdateUserTitleDisplayNameResultWrapper{ src.Model() } + { + } + + PFAccountManagementUpdateUserTitleDisplayNameResultWrapper(PFAccountManagementUpdateUserTitleDisplayNameResultWrapper&& src) : + PFAccountManagementUpdateUserTitleDisplayNameResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUpdateUserTitleDisplayNameResultWrapper& operator=(PFAccountManagementUpdateUserTitleDisplayNameResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUpdateUserTitleDisplayNameResultWrapper() = default; + + friend void swap(PFAccountManagementUpdateUserTitleDisplayNameResultWrapper& lhs, PFAccountManagementUpdateUserTitleDisplayNameResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_displayName, rhs.m_displayName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + String m_displayName; +}; + +template class Alloc = std::allocator> +class PFAccountManagementBanRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementBanRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementBanRequestWrapper() = default; + + PFAccountManagementBanRequestWrapper(const PFAccountManagementBanRequest& model) : + ModelWrapper{ model }, + m_durationInHours{ model.durationInHours ? std::optional{ *model.durationInHours } : std::nullopt }, + m_IPAddress{ SafeString(model.IPAddress) }, + m_playFabId{ SafeString(model.playFabId) }, + m_reason{ SafeString(model.reason) } + { + SetModelPointers(); + } + + PFAccountManagementBanRequestWrapper(const PFAccountManagementBanRequestWrapper& src) : + PFAccountManagementBanRequestWrapper{ src.Model() } + { + } + + PFAccountManagementBanRequestWrapper(PFAccountManagementBanRequestWrapper&& src) : + PFAccountManagementBanRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementBanRequestWrapper& operator=(PFAccountManagementBanRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementBanRequestWrapper() = default; + + friend void swap(PFAccountManagementBanRequestWrapper& lhs, PFAccountManagementBanRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_durationInHours, rhs.m_durationInHours); + swap(lhs.m_IPAddress, rhs.m_IPAddress); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_reason, rhs.m_reason); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDurationInHours(std::optional value) + { + m_durationInHours = std::move(value); + this->m_model.durationInHours = m_durationInHours ? m_durationInHours.operator->() : nullptr; + } + + void SetIPAddress(String value) + { + m_IPAddress = std::move(value); + this->m_model.IPAddress = m_IPAddress.empty() ? nullptr : m_IPAddress.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetReason(String value) + { + m_reason = std::move(value); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + +private: + void SetModelPointers() + { + this->m_model.durationInHours = m_durationInHours ? m_durationInHours.operator->() : nullptr; + this->m_model.IPAddress = m_IPAddress.empty() ? nullptr : m_IPAddress.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + + std::optional m_durationInHours; + String m_IPAddress; + String m_playFabId; + String m_reason; +}; + +template class Alloc = std::allocator> +class PFAccountManagementBanUsersRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementBanUsersRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementBanUsersRequestWrapper() = default; + + PFAccountManagementBanUsersRequestWrapper(const PFAccountManagementBanUsersRequest& model) : + ModelWrapper{ model }, + m_bans{ model.bans, model.bans + model.bansCount }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFAccountManagementBanUsersRequestWrapper(const PFAccountManagementBanUsersRequestWrapper& src) : + PFAccountManagementBanUsersRequestWrapper{ src.Model() } + { + } + + PFAccountManagementBanUsersRequestWrapper(PFAccountManagementBanUsersRequestWrapper&& src) : + PFAccountManagementBanUsersRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementBanUsersRequestWrapper& operator=(PFAccountManagementBanUsersRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementBanUsersRequestWrapper() = default; + + friend void swap(PFAccountManagementBanUsersRequestWrapper& lhs, PFAccountManagementBanUsersRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_bans, rhs.m_bans); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBans(ModelVector, Alloc> value) + { + m_bans = std::move(value); + this->m_model.bans = m_bans.empty() ? nullptr : m_bans.data(); + this->m_model.bansCount = static_cast(m_bans.size()); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.bans = m_bans.empty() ? nullptr : m_bans.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + ModelVector, Alloc> m_bans; + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFAccountManagementBanInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementBanInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementBanInfoWrapper() = default; + + PFAccountManagementBanInfoWrapper(const PFAccountManagementBanInfo& model) : + ModelWrapper{ model }, + m_banId{ SafeString(model.banId) }, + m_created{ model.created ? std::optional{ *model.created } : std::nullopt }, + m_expires{ model.expires ? std::optional{ *model.expires } : std::nullopt }, + m_IPAddress{ SafeString(model.IPAddress) }, + m_playFabId{ SafeString(model.playFabId) }, + m_reason{ SafeString(model.reason) } + { + SetModelPointers(); + } + + PFAccountManagementBanInfoWrapper(const PFAccountManagementBanInfoWrapper& src) : + PFAccountManagementBanInfoWrapper{ src.Model() } + { + } + + PFAccountManagementBanInfoWrapper(PFAccountManagementBanInfoWrapper&& src) : + PFAccountManagementBanInfoWrapper{} + { + swap(*this, src); + } + + PFAccountManagementBanInfoWrapper& operator=(PFAccountManagementBanInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementBanInfoWrapper() = default; + + friend void swap(PFAccountManagementBanInfoWrapper& lhs, PFAccountManagementBanInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_banId, rhs.m_banId); + swap(lhs.m_created, rhs.m_created); + swap(lhs.m_expires, rhs.m_expires); + swap(lhs.m_IPAddress, rhs.m_IPAddress); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_reason, rhs.m_reason); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetActive(bool value) + { + this->m_model.active = value; + } + + void SetBanId(String value) + { + m_banId = std::move(value); + this->m_model.banId = m_banId.empty() ? nullptr : m_banId.data(); + } + + void SetCreated(std::optional value) + { + m_created = std::move(value); + this->m_model.created = m_created ? m_created.operator->() : nullptr; + } + + void SetExpires(std::optional value) + { + m_expires = std::move(value); + this->m_model.expires = m_expires ? m_expires.operator->() : nullptr; + } + + void SetIPAddress(String value) + { + m_IPAddress = std::move(value); + this->m_model.IPAddress = m_IPAddress.empty() ? nullptr : m_IPAddress.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetReason(String value) + { + m_reason = std::move(value); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + +private: + void SetModelPointers() + { + this->m_model.banId = m_banId.empty() ? nullptr : m_banId.data(); + this->m_model.created = m_created ? m_created.operator->() : nullptr; + this->m_model.expires = m_expires ? m_expires.operator->() : nullptr; + this->m_model.IPAddress = m_IPAddress.empty() ? nullptr : m_IPAddress.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + + String m_banId; + std::optional m_created; + std::optional m_expires; + String m_IPAddress; + String m_playFabId; + String m_reason; +}; + +template class Alloc = std::allocator> +class PFAccountManagementBanUsersResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementBanUsersResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementBanUsersResultWrapper() = default; + + PFAccountManagementBanUsersResultWrapper(const PFAccountManagementBanUsersResult& model) : + ModelWrapper{ model }, + m_banData{ model.banData, model.banData + model.banDataCount } + { + SetModelPointers(); + } + + PFAccountManagementBanUsersResultWrapper(const PFAccountManagementBanUsersResultWrapper& src) : + PFAccountManagementBanUsersResultWrapper{ src.Model() } + { + } + + PFAccountManagementBanUsersResultWrapper(PFAccountManagementBanUsersResultWrapper&& src) : + PFAccountManagementBanUsersResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementBanUsersResultWrapper& operator=(PFAccountManagementBanUsersResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementBanUsersResultWrapper() = default; + + friend void swap(PFAccountManagementBanUsersResultWrapper& lhs, PFAccountManagementBanUsersResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_banData, rhs.m_banData); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBanData(ModelVector, Alloc> value) + { + m_banData = std::move(value); + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + this->m_model.banDataCount = static_cast(m_banData.size()); + } + +private: + void SetModelPointers() + { + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + } + + ModelVector, Alloc> m_banData; +}; + +template class Alloc = std::allocator> +class PFAccountManagementDeletePlayerRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementDeletePlayerRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementDeletePlayerRequestWrapper() = default; + + PFAccountManagementDeletePlayerRequestWrapper(const PFAccountManagementDeletePlayerRequest& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementDeletePlayerRequestWrapper(const PFAccountManagementDeletePlayerRequestWrapper& src) : + PFAccountManagementDeletePlayerRequestWrapper{ src.Model() } + { + } + + PFAccountManagementDeletePlayerRequestWrapper(PFAccountManagementDeletePlayerRequestWrapper&& src) : + PFAccountManagementDeletePlayerRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementDeletePlayerRequestWrapper& operator=(PFAccountManagementDeletePlayerRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementDeletePlayerRequestWrapper() = default; + + friend void swap(PFAccountManagementDeletePlayerRequestWrapper& lhs, PFAccountManagementDeletePlayerRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper() = default; + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest& model) : + ModelWrapper{ model }, + m_playFabIDs{ model.playFabIDs, model.playFabIDs + model.playFabIDsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper& src) : + PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper(PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper&& src) : + PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper& operator=(PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper& lhs, PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabIDs, rhs.m_playFabIDs); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabIDs(CStringVector value) + { + m_playFabIDs = std::move(value); + this->m_model.playFabIDs = m_playFabIDs.empty() ? nullptr : m_playFabIDs.data(); + this->m_model.playFabIDsCount = static_cast(m_playFabIDs.size()); + } + +private: + void SetModelPointers() + { + this->m_model.playFabIDs = m_playFabIDs.empty() ? nullptr : m_playFabIDs.data(); + } + + CStringVector m_playFabIDs; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerCustomIDPlayFabIDPairWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerCustomIDPlayFabIDPair; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerCustomIDPlayFabIDPairWrapper() = default; + + PFAccountManagementServerCustomIDPlayFabIDPairWrapper(const PFAccountManagementServerCustomIDPlayFabIDPair& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) }, + m_serverCustomId{ SafeString(model.serverCustomId) } + { + SetModelPointers(); + } + + PFAccountManagementServerCustomIDPlayFabIDPairWrapper(const PFAccountManagementServerCustomIDPlayFabIDPairWrapper& src) : + PFAccountManagementServerCustomIDPlayFabIDPairWrapper{ src.Model() } + { + } + + PFAccountManagementServerCustomIDPlayFabIDPairWrapper(PFAccountManagementServerCustomIDPlayFabIDPairWrapper&& src) : + PFAccountManagementServerCustomIDPlayFabIDPairWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerCustomIDPlayFabIDPairWrapper& operator=(PFAccountManagementServerCustomIDPlayFabIDPairWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerCustomIDPlayFabIDPairWrapper() = default; + + friend void swap(PFAccountManagementServerCustomIDPlayFabIDPairWrapper& lhs, PFAccountManagementServerCustomIDPlayFabIDPairWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_serverCustomId, rhs.m_serverCustomId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetServerCustomId(String value) + { + m_serverCustomId = std::move(value); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + + String m_playFabId; + String m_serverCustomId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper() = default; + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper& src) : + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper(PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper&& src) : + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper& operator=(PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper() = default; + + friend void swap(PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper& lhs, PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetUserAccountInfoRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetUserAccountInfoRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetUserAccountInfoRequestWrapper() = default; + + PFAccountManagementGetUserAccountInfoRequestWrapper(const PFAccountManagementGetUserAccountInfoRequest& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementGetUserAccountInfoRequestWrapper(const PFAccountManagementGetUserAccountInfoRequestWrapper& src) : + PFAccountManagementGetUserAccountInfoRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetUserAccountInfoRequestWrapper(PFAccountManagementGetUserAccountInfoRequestWrapper&& src) : + PFAccountManagementGetUserAccountInfoRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetUserAccountInfoRequestWrapper& operator=(PFAccountManagementGetUserAccountInfoRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetUserAccountInfoRequestWrapper() = default; + + friend void swap(PFAccountManagementGetUserAccountInfoRequestWrapper& lhs, PFAccountManagementGetUserAccountInfoRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetUserAccountInfoResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetUserAccountInfoResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetUserAccountInfoResultWrapper() = default; + + PFAccountManagementGetUserAccountInfoResultWrapper(const PFAccountManagementGetUserAccountInfoResult& model) : + ModelWrapper{ model }, + m_userInfo{ model.userInfo ? std::optional>{ *model.userInfo } : std::nullopt } + { + SetModelPointers(); + } + + PFAccountManagementGetUserAccountInfoResultWrapper(const PFAccountManagementGetUserAccountInfoResultWrapper& src) : + PFAccountManagementGetUserAccountInfoResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetUserAccountInfoResultWrapper(PFAccountManagementGetUserAccountInfoResultWrapper&& src) : + PFAccountManagementGetUserAccountInfoResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetUserAccountInfoResultWrapper& operator=(PFAccountManagementGetUserAccountInfoResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetUserAccountInfoResultWrapper() = default; + + friend void swap(PFAccountManagementGetUserAccountInfoResultWrapper& lhs, PFAccountManagementGetUserAccountInfoResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_userInfo, rhs.m_userInfo); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetUserInfo(std::optional> value) + { + m_userInfo = std::move(value); + this->m_model.userInfo = m_userInfo ? &m_userInfo->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.userInfo = m_userInfo ? &m_userInfo->Model() : nullptr; + } + + std::optional> m_userInfo; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetUserBansRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetUserBansRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetUserBansRequestWrapper() = default; + + PFAccountManagementGetUserBansRequestWrapper(const PFAccountManagementGetUserBansRequest& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementGetUserBansRequestWrapper(const PFAccountManagementGetUserBansRequestWrapper& src) : + PFAccountManagementGetUserBansRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetUserBansRequestWrapper(PFAccountManagementGetUserBansRequestWrapper&& src) : + PFAccountManagementGetUserBansRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetUserBansRequestWrapper& operator=(PFAccountManagementGetUserBansRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetUserBansRequestWrapper() = default; + + friend void swap(PFAccountManagementGetUserBansRequestWrapper& lhs, PFAccountManagementGetUserBansRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetUserBansResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetUserBansResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetUserBansResultWrapper() = default; + + PFAccountManagementGetUserBansResultWrapper(const PFAccountManagementGetUserBansResult& model) : + ModelWrapper{ model }, + m_banData{ model.banData, model.banData + model.banDataCount } + { + SetModelPointers(); + } + + PFAccountManagementGetUserBansResultWrapper(const PFAccountManagementGetUserBansResultWrapper& src) : + PFAccountManagementGetUserBansResultWrapper{ src.Model() } + { + } + + PFAccountManagementGetUserBansResultWrapper(PFAccountManagementGetUserBansResultWrapper&& src) : + PFAccountManagementGetUserBansResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetUserBansResultWrapper& operator=(PFAccountManagementGetUserBansResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetUserBansResultWrapper() = default; + + friend void swap(PFAccountManagementGetUserBansResultWrapper& lhs, PFAccountManagementGetUserBansResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_banData, rhs.m_banData); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBanData(ModelVector, Alloc> value) + { + m_banData = std::move(value); + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + this->m_model.banDataCount = static_cast(m_banData.size()); + } + +private: + void SetModelPointers() + { + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + } + + ModelVector, Alloc> m_banData; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerLinkNintendoServiceAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper() = default; + + PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper(const PFAccountManagementServerLinkNintendoServiceAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_identityToken{ SafeString(model.identityToken) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper(const PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper& src) : + PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper(PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper&& src) : + PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper& operator=(PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper& lhs, PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_identityToken, rhs.m_identityToken); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetIdentityToken(String value) + { + m_identityToken = std::move(value); + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.identityToken = m_identityToken.empty() ? nullptr : m_identityToken.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_identityToken; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper() = default; + + PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_nintendoSwitchDeviceId{ SafeString(model.nintendoSwitchDeviceId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper& src) : + PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper(PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper&& src) : + PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper& operator=(PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper() = default; + + friend void swap(PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper& lhs, PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_nintendoSwitchDeviceId, rhs.m_nintendoSwitchDeviceId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetNintendoSwitchDeviceId(String value) + { + m_nintendoSwitchDeviceId = std::move(value); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_nintendoSwitchDeviceId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerLinkPSNAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerLinkPSNAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerLinkPSNAccountRequestWrapper() = default; + + PFAccountManagementServerLinkPSNAccountRequestWrapper(const PFAccountManagementServerLinkPSNAccountRequest& model) : + ModelWrapper{ model }, + m_authCode{ SafeString(model.authCode) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_issuerId{ model.issuerId ? std::optional{ *model.issuerId } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) }, + m_redirectUri{ SafeString(model.redirectUri) } + { + SetModelPointers(); + } + + PFAccountManagementServerLinkPSNAccountRequestWrapper(const PFAccountManagementServerLinkPSNAccountRequestWrapper& src) : + PFAccountManagementServerLinkPSNAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerLinkPSNAccountRequestWrapper(PFAccountManagementServerLinkPSNAccountRequestWrapper&& src) : + PFAccountManagementServerLinkPSNAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerLinkPSNAccountRequestWrapper& operator=(PFAccountManagementServerLinkPSNAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerLinkPSNAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementServerLinkPSNAccountRequestWrapper& lhs, PFAccountManagementServerLinkPSNAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_authCode, rhs.m_authCode); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_issuerId, rhs.m_issuerId); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_redirectUri, rhs.m_redirectUri); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAuthCode(String value) + { + m_authCode = std::move(value); + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetIssuerId(std::optional value) + { + m_issuerId = std::move(value); + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetRedirectUri(String value) + { + m_redirectUri = std::move(value); + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + +private: + void SetModelPointers() + { + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + + String m_authCode; + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + std::optional m_issuerId; + String m_playFabId; + String m_redirectUri; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkPSNIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkPSNIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkPSNIdRequestWrapper() = default; + + PFAccountManagementLinkPSNIdRequestWrapper(const PFAccountManagementLinkPSNIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_issuerId{ model.issuerId ? std::optional{ *model.issuerId } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) }, + m_PSNUserId{ SafeString(model.PSNUserId) } + { + SetModelPointers(); + } + + PFAccountManagementLinkPSNIdRequestWrapper(const PFAccountManagementLinkPSNIdRequestWrapper& src) : + PFAccountManagementLinkPSNIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkPSNIdRequestWrapper(PFAccountManagementLinkPSNIdRequestWrapper&& src) : + PFAccountManagementLinkPSNIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkPSNIdRequestWrapper& operator=(PFAccountManagementLinkPSNIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkPSNIdRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkPSNIdRequestWrapper& lhs, PFAccountManagementLinkPSNIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_issuerId, rhs.m_issuerId); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_PSNUserId, rhs.m_PSNUserId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetIssuerId(std::optional value) + { + m_issuerId = std::move(value); + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetPSNUserId(String value) + { + m_PSNUserId = std::move(value); + this->m_model.PSNUserId = m_PSNUserId.empty() ? nullptr : m_PSNUserId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.PSNUserId = m_PSNUserId.empty() ? nullptr : m_PSNUserId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + std::optional m_issuerId; + String m_playFabId; + String m_PSNUserId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkServerCustomIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkServerCustomIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkServerCustomIdRequestWrapper() = default; + + PFAccountManagementLinkServerCustomIdRequestWrapper(const PFAccountManagementLinkServerCustomIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) }, + m_serverCustomId{ SafeString(model.serverCustomId) } + { + SetModelPointers(); + } + + PFAccountManagementLinkServerCustomIdRequestWrapper(const PFAccountManagementLinkServerCustomIdRequestWrapper& src) : + PFAccountManagementLinkServerCustomIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkServerCustomIdRequestWrapper(PFAccountManagementLinkServerCustomIdRequestWrapper&& src) : + PFAccountManagementLinkServerCustomIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkServerCustomIdRequestWrapper& operator=(PFAccountManagementLinkServerCustomIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkServerCustomIdRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkServerCustomIdRequestWrapper& lhs, PFAccountManagementLinkServerCustomIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_serverCustomId, rhs.m_serverCustomId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetServerCustomId(String value) + { + m_serverCustomId = std::move(value); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_playFabId; + String m_serverCustomId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementLinkSteamIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementLinkSteamIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementLinkSteamIdRequestWrapper() = default; + + PFAccountManagementLinkSteamIdRequestWrapper(const PFAccountManagementLinkSteamIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) }, + m_steamId{ SafeString(model.steamId) } + { + SetModelPointers(); + } + + PFAccountManagementLinkSteamIdRequestWrapper(const PFAccountManagementLinkSteamIdRequestWrapper& src) : + PFAccountManagementLinkSteamIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementLinkSteamIdRequestWrapper(PFAccountManagementLinkSteamIdRequestWrapper&& src) : + PFAccountManagementLinkSteamIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementLinkSteamIdRequestWrapper& operator=(PFAccountManagementLinkSteamIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementLinkSteamIdRequestWrapper() = default; + + friend void swap(PFAccountManagementLinkSteamIdRequestWrapper& lhs, PFAccountManagementLinkSteamIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_steamId, rhs.m_steamId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetSteamId(String value) + { + m_steamId = std::move(value); + this->m_model.steamId = m_steamId.empty() ? nullptr : m_steamId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.steamId = m_steamId.empty() ? nullptr : m_steamId.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_playFabId; + String m_steamId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerLinkXboxAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerLinkXboxAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerLinkXboxAccountRequestWrapper() = default; + + PFAccountManagementServerLinkXboxAccountRequestWrapper(const PFAccountManagementServerLinkXboxAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_forceLink{ model.forceLink ? std::optional{ *model.forceLink } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) }, + m_xboxToken{ SafeString(model.xboxToken) } + { + SetModelPointers(); + } + + PFAccountManagementServerLinkXboxAccountRequestWrapper(const PFAccountManagementServerLinkXboxAccountRequestWrapper& src) : + PFAccountManagementServerLinkXboxAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerLinkXboxAccountRequestWrapper(PFAccountManagementServerLinkXboxAccountRequestWrapper&& src) : + PFAccountManagementServerLinkXboxAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerLinkXboxAccountRequestWrapper& operator=(PFAccountManagementServerLinkXboxAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerLinkXboxAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementServerLinkXboxAccountRequestWrapper& lhs, PFAccountManagementServerLinkXboxAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_forceLink, rhs.m_forceLink); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_xboxToken, rhs.m_xboxToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetForceLink(std::optional value) + { + m_forceLink = std::move(value); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetXboxToken(String value) + { + m_xboxToken = std::move(value); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.forceLink = m_forceLink ? m_forceLink.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_forceLink; + String m_playFabId; + String m_xboxToken; +}; + +template class Alloc = std::allocator> +class PFAccountManagementRevokeAllBansForUserRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementRevokeAllBansForUserRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementRevokeAllBansForUserRequestWrapper() = default; + + PFAccountManagementRevokeAllBansForUserRequestWrapper(const PFAccountManagementRevokeAllBansForUserRequest& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementRevokeAllBansForUserRequestWrapper(const PFAccountManagementRevokeAllBansForUserRequestWrapper& src) : + PFAccountManagementRevokeAllBansForUserRequestWrapper{ src.Model() } + { + } + + PFAccountManagementRevokeAllBansForUserRequestWrapper(PFAccountManagementRevokeAllBansForUserRequestWrapper&& src) : + PFAccountManagementRevokeAllBansForUserRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementRevokeAllBansForUserRequestWrapper& operator=(PFAccountManagementRevokeAllBansForUserRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementRevokeAllBansForUserRequestWrapper() = default; + + friend void swap(PFAccountManagementRevokeAllBansForUserRequestWrapper& lhs, PFAccountManagementRevokeAllBansForUserRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementRevokeAllBansForUserResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementRevokeAllBansForUserResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementRevokeAllBansForUserResultWrapper() = default; + + PFAccountManagementRevokeAllBansForUserResultWrapper(const PFAccountManagementRevokeAllBansForUserResult& model) : + ModelWrapper{ model }, + m_banData{ model.banData, model.banData + model.banDataCount } + { + SetModelPointers(); + } + + PFAccountManagementRevokeAllBansForUserResultWrapper(const PFAccountManagementRevokeAllBansForUserResultWrapper& src) : + PFAccountManagementRevokeAllBansForUserResultWrapper{ src.Model() } + { + } + + PFAccountManagementRevokeAllBansForUserResultWrapper(PFAccountManagementRevokeAllBansForUserResultWrapper&& src) : + PFAccountManagementRevokeAllBansForUserResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementRevokeAllBansForUserResultWrapper& operator=(PFAccountManagementRevokeAllBansForUserResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementRevokeAllBansForUserResultWrapper() = default; + + friend void swap(PFAccountManagementRevokeAllBansForUserResultWrapper& lhs, PFAccountManagementRevokeAllBansForUserResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_banData, rhs.m_banData); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBanData(ModelVector, Alloc> value) + { + m_banData = std::move(value); + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + this->m_model.banDataCount = static_cast(m_banData.size()); + } + +private: + void SetModelPointers() + { + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + } + + ModelVector, Alloc> m_banData; +}; + +template class Alloc = std::allocator> +class PFAccountManagementRevokeBansRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementRevokeBansRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementRevokeBansRequestWrapper() = default; + + PFAccountManagementRevokeBansRequestWrapper(const PFAccountManagementRevokeBansRequest& model) : + ModelWrapper{ model }, + m_banIds{ model.banIds, model.banIds + model.banIdsCount } + { + SetModelPointers(); + } + + PFAccountManagementRevokeBansRequestWrapper(const PFAccountManagementRevokeBansRequestWrapper& src) : + PFAccountManagementRevokeBansRequestWrapper{ src.Model() } + { + } + + PFAccountManagementRevokeBansRequestWrapper(PFAccountManagementRevokeBansRequestWrapper&& src) : + PFAccountManagementRevokeBansRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementRevokeBansRequestWrapper& operator=(PFAccountManagementRevokeBansRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementRevokeBansRequestWrapper() = default; + + friend void swap(PFAccountManagementRevokeBansRequestWrapper& lhs, PFAccountManagementRevokeBansRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_banIds, rhs.m_banIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBanIds(CStringVector value) + { + m_banIds = std::move(value); + this->m_model.banIds = m_banIds.empty() ? nullptr : m_banIds.data(); + this->m_model.banIdsCount = static_cast(m_banIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.banIds = m_banIds.empty() ? nullptr : m_banIds.data(); + } + + CStringVector m_banIds; +}; + +template class Alloc = std::allocator> +class PFAccountManagementRevokeBansResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementRevokeBansResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementRevokeBansResultWrapper() = default; + + PFAccountManagementRevokeBansResultWrapper(const PFAccountManagementRevokeBansResult& model) : + ModelWrapper{ model }, + m_banData{ model.banData, model.banData + model.banDataCount } + { + SetModelPointers(); + } + + PFAccountManagementRevokeBansResultWrapper(const PFAccountManagementRevokeBansResultWrapper& src) : + PFAccountManagementRevokeBansResultWrapper{ src.Model() } + { + } + + PFAccountManagementRevokeBansResultWrapper(PFAccountManagementRevokeBansResultWrapper&& src) : + PFAccountManagementRevokeBansResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementRevokeBansResultWrapper& operator=(PFAccountManagementRevokeBansResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementRevokeBansResultWrapper() = default; + + friend void swap(PFAccountManagementRevokeBansResultWrapper& lhs, PFAccountManagementRevokeBansResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_banData, rhs.m_banData); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBanData(ModelVector, Alloc> value) + { + m_banData = std::move(value); + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + this->m_model.banDataCount = static_cast(m_banData.size()); + } + +private: + void SetModelPointers() + { + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + } + + ModelVector, Alloc> m_banData; +}; + +template class Alloc = std::allocator> +class PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementSendCustomAccountRecoveryEmailRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper() = default; + + PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper(const PFAccountManagementSendCustomAccountRecoveryEmailRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_email{ SafeString(model.email) }, + m_emailTemplateId{ SafeString(model.emailTemplateId) }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper(const PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper& src) : + PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper{ src.Model() } + { + } + + PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper(PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper&& src) : + PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper& operator=(PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper() = default; + + friend void swap(PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper& lhs, PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_emailTemplateId, rhs.m_emailTemplateId); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetEmailTemplateId(String value) + { + m_emailTemplateId = std::move(value); + this->m_model.emailTemplateId = m_emailTemplateId.empty() ? nullptr : m_emailTemplateId.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.emailTemplateId = m_emailTemplateId.empty() ? nullptr : m_emailTemplateId.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_email; + String m_emailTemplateId; + String m_username; +}; + +template class Alloc = std::allocator> +class PFAccountManagementSendEmailFromTemplateRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementSendEmailFromTemplateRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementSendEmailFromTemplateRequestWrapper() = default; + + PFAccountManagementSendEmailFromTemplateRequestWrapper(const PFAccountManagementSendEmailFromTemplateRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_emailTemplateId{ SafeString(model.emailTemplateId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementSendEmailFromTemplateRequestWrapper(const PFAccountManagementSendEmailFromTemplateRequestWrapper& src) : + PFAccountManagementSendEmailFromTemplateRequestWrapper{ src.Model() } + { + } + + PFAccountManagementSendEmailFromTemplateRequestWrapper(PFAccountManagementSendEmailFromTemplateRequestWrapper&& src) : + PFAccountManagementSendEmailFromTemplateRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementSendEmailFromTemplateRequestWrapper& operator=(PFAccountManagementSendEmailFromTemplateRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementSendEmailFromTemplateRequestWrapper() = default; + + friend void swap(PFAccountManagementSendEmailFromTemplateRequestWrapper& lhs, PFAccountManagementSendEmailFromTemplateRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_emailTemplateId, rhs.m_emailTemplateId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEmailTemplateId(String value) + { + m_emailTemplateId = std::move(value); + this->m_model.emailTemplateId = m_emailTemplateId.empty() ? nullptr : m_emailTemplateId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.emailTemplateId = m_emailTemplateId.empty() ? nullptr : m_emailTemplateId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_emailTemplateId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerUnlinkNintendoServiceAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper() = default; + + PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper(const PFAccountManagementServerUnlinkNintendoServiceAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper(const PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper& src) : + PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper(PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper&& src) : + PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper& operator=(PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper& lhs, PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper() = default; + + PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_nintendoSwitchDeviceId{ SafeString(model.nintendoSwitchDeviceId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper(const PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper& src) : + PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper(PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper&& src) : + PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper& operator=(PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper() = default; + + friend void swap(PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper& lhs, PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_nintendoSwitchDeviceId, rhs.m_nintendoSwitchDeviceId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetNintendoSwitchDeviceId(String value) + { + m_nintendoSwitchDeviceId = std::move(value); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.nintendoSwitchDeviceId = m_nintendoSwitchDeviceId.empty() ? nullptr : m_nintendoSwitchDeviceId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_nintendoSwitchDeviceId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerUnlinkPSNAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerUnlinkPSNAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerUnlinkPSNAccountRequestWrapper() = default; + + PFAccountManagementServerUnlinkPSNAccountRequestWrapper(const PFAccountManagementServerUnlinkPSNAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementServerUnlinkPSNAccountRequestWrapper(const PFAccountManagementServerUnlinkPSNAccountRequestWrapper& src) : + PFAccountManagementServerUnlinkPSNAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerUnlinkPSNAccountRequestWrapper(PFAccountManagementServerUnlinkPSNAccountRequestWrapper&& src) : + PFAccountManagementServerUnlinkPSNAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerUnlinkPSNAccountRequestWrapper& operator=(PFAccountManagementServerUnlinkPSNAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerUnlinkPSNAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementServerUnlinkPSNAccountRequestWrapper& lhs, PFAccountManagementServerUnlinkPSNAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkServerCustomIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkServerCustomIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkServerCustomIdRequestWrapper() = default; + + PFAccountManagementUnlinkServerCustomIdRequestWrapper(const PFAccountManagementUnlinkServerCustomIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) }, + m_serverCustomId{ SafeString(model.serverCustomId) } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkServerCustomIdRequestWrapper(const PFAccountManagementUnlinkServerCustomIdRequestWrapper& src) : + PFAccountManagementUnlinkServerCustomIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkServerCustomIdRequestWrapper(PFAccountManagementUnlinkServerCustomIdRequestWrapper&& src) : + PFAccountManagementUnlinkServerCustomIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkServerCustomIdRequestWrapper& operator=(PFAccountManagementUnlinkServerCustomIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkServerCustomIdRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkServerCustomIdRequestWrapper& lhs, PFAccountManagementUnlinkServerCustomIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_serverCustomId, rhs.m_serverCustomId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetServerCustomId(String value) + { + m_serverCustomId = std::move(value); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.serverCustomId = m_serverCustomId.empty() ? nullptr : m_serverCustomId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; + String m_serverCustomId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUnlinkSteamIdRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUnlinkSteamIdRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUnlinkSteamIdRequestWrapper() = default; + + PFAccountManagementUnlinkSteamIdRequestWrapper(const PFAccountManagementUnlinkSteamIdRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementUnlinkSteamIdRequestWrapper(const PFAccountManagementUnlinkSteamIdRequestWrapper& src) : + PFAccountManagementUnlinkSteamIdRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUnlinkSteamIdRequestWrapper(PFAccountManagementUnlinkSteamIdRequestWrapper&& src) : + PFAccountManagementUnlinkSteamIdRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUnlinkSteamIdRequestWrapper& operator=(PFAccountManagementUnlinkSteamIdRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUnlinkSteamIdRequestWrapper() = default; + + friend void swap(PFAccountManagementUnlinkSteamIdRequestWrapper& lhs, PFAccountManagementUnlinkSteamIdRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerUnlinkXboxAccountRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerUnlinkXboxAccountRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerUnlinkXboxAccountRequestWrapper() = default; + + PFAccountManagementServerUnlinkXboxAccountRequestWrapper(const PFAccountManagementServerUnlinkXboxAccountRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementServerUnlinkXboxAccountRequestWrapper(const PFAccountManagementServerUnlinkXboxAccountRequestWrapper& src) : + PFAccountManagementServerUnlinkXboxAccountRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerUnlinkXboxAccountRequestWrapper(PFAccountManagementServerUnlinkXboxAccountRequestWrapper&& src) : + PFAccountManagementServerUnlinkXboxAccountRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerUnlinkXboxAccountRequestWrapper& operator=(PFAccountManagementServerUnlinkXboxAccountRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerUnlinkXboxAccountRequestWrapper() = default; + + friend void swap(PFAccountManagementServerUnlinkXboxAccountRequestWrapper& lhs, PFAccountManagementServerUnlinkXboxAccountRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementServerUpdateAvatarUrlRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementServerUpdateAvatarUrlRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementServerUpdateAvatarUrlRequestWrapper() = default; + + PFAccountManagementServerUpdateAvatarUrlRequestWrapper(const PFAccountManagementServerUpdateAvatarUrlRequest& model) : + ModelWrapper{ model }, + m_imageUrl{ SafeString(model.imageUrl) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFAccountManagementServerUpdateAvatarUrlRequestWrapper(const PFAccountManagementServerUpdateAvatarUrlRequestWrapper& src) : + PFAccountManagementServerUpdateAvatarUrlRequestWrapper{ src.Model() } + { + } + + PFAccountManagementServerUpdateAvatarUrlRequestWrapper(PFAccountManagementServerUpdateAvatarUrlRequestWrapper&& src) : + PFAccountManagementServerUpdateAvatarUrlRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementServerUpdateAvatarUrlRequestWrapper& operator=(PFAccountManagementServerUpdateAvatarUrlRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementServerUpdateAvatarUrlRequestWrapper() = default; + + friend void swap(PFAccountManagementServerUpdateAvatarUrlRequestWrapper& lhs, PFAccountManagementServerUpdateAvatarUrlRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_imageUrl, rhs.m_imageUrl); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetImageUrl(String value) + { + m_imageUrl = std::move(value); + this->m_model.imageUrl = m_imageUrl.empty() ? nullptr : m_imageUrl.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.imageUrl = m_imageUrl.empty() ? nullptr : m_imageUrl.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_imageUrl; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUpdateBanRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUpdateBanRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUpdateBanRequestWrapper() = default; + + PFAccountManagementUpdateBanRequestWrapper(const PFAccountManagementUpdateBanRequest& model) : + ModelWrapper{ model }, + m_active{ model.active ? std::optional{ *model.active } : std::nullopt }, + m_banId{ SafeString(model.banId) }, + m_expires{ model.expires ? std::optional{ *model.expires } : std::nullopt }, + m_IPAddress{ SafeString(model.IPAddress) }, + m_permanent{ model.permanent ? std::optional{ *model.permanent } : std::nullopt }, + m_reason{ SafeString(model.reason) } + { + SetModelPointers(); + } + + PFAccountManagementUpdateBanRequestWrapper(const PFAccountManagementUpdateBanRequestWrapper& src) : + PFAccountManagementUpdateBanRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUpdateBanRequestWrapper(PFAccountManagementUpdateBanRequestWrapper&& src) : + PFAccountManagementUpdateBanRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUpdateBanRequestWrapper& operator=(PFAccountManagementUpdateBanRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUpdateBanRequestWrapper() = default; + + friend void swap(PFAccountManagementUpdateBanRequestWrapper& lhs, PFAccountManagementUpdateBanRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_active, rhs.m_active); + swap(lhs.m_banId, rhs.m_banId); + swap(lhs.m_expires, rhs.m_expires); + swap(lhs.m_IPAddress, rhs.m_IPAddress); + swap(lhs.m_permanent, rhs.m_permanent); + swap(lhs.m_reason, rhs.m_reason); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetActive(std::optional value) + { + m_active = std::move(value); + this->m_model.active = m_active ? m_active.operator->() : nullptr; + } + + void SetBanId(String value) + { + m_banId = std::move(value); + this->m_model.banId = m_banId.empty() ? nullptr : m_banId.data(); + } + + void SetExpires(std::optional value) + { + m_expires = std::move(value); + this->m_model.expires = m_expires ? m_expires.operator->() : nullptr; + } + + void SetIPAddress(String value) + { + m_IPAddress = std::move(value); + this->m_model.IPAddress = m_IPAddress.empty() ? nullptr : m_IPAddress.data(); + } + + void SetPermanent(std::optional value) + { + m_permanent = std::move(value); + this->m_model.permanent = m_permanent ? m_permanent.operator->() : nullptr; + } + + void SetReason(String value) + { + m_reason = std::move(value); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + +private: + void SetModelPointers() + { + this->m_model.active = m_active ? m_active.operator->() : nullptr; + this->m_model.banId = m_banId.empty() ? nullptr : m_banId.data(); + this->m_model.expires = m_expires ? m_expires.operator->() : nullptr; + this->m_model.IPAddress = m_IPAddress.empty() ? nullptr : m_IPAddress.data(); + this->m_model.permanent = m_permanent ? m_permanent.operator->() : nullptr; + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + + std::optional m_active; + String m_banId; + std::optional m_expires; + String m_IPAddress; + std::optional m_permanent; + String m_reason; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUpdateBansRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUpdateBansRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUpdateBansRequestWrapper() = default; + + PFAccountManagementUpdateBansRequestWrapper(const PFAccountManagementUpdateBansRequest& model) : + ModelWrapper{ model }, + m_bans{ model.bans, model.bans + model.bansCount } + { + SetModelPointers(); + } + + PFAccountManagementUpdateBansRequestWrapper(const PFAccountManagementUpdateBansRequestWrapper& src) : + PFAccountManagementUpdateBansRequestWrapper{ src.Model() } + { + } + + PFAccountManagementUpdateBansRequestWrapper(PFAccountManagementUpdateBansRequestWrapper&& src) : + PFAccountManagementUpdateBansRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUpdateBansRequestWrapper& operator=(PFAccountManagementUpdateBansRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUpdateBansRequestWrapper() = default; + + friend void swap(PFAccountManagementUpdateBansRequestWrapper& lhs, PFAccountManagementUpdateBansRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_bans, rhs.m_bans); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBans(ModelVector, Alloc> value) + { + m_bans = std::move(value); + this->m_model.bans = m_bans.empty() ? nullptr : m_bans.data(); + this->m_model.bansCount = static_cast(m_bans.size()); + } + +private: + void SetModelPointers() + { + this->m_model.bans = m_bans.empty() ? nullptr : m_bans.data(); + } + + ModelVector, Alloc> m_bans; +}; + +template class Alloc = std::allocator> +class PFAccountManagementUpdateBansResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementUpdateBansResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementUpdateBansResultWrapper() = default; + + PFAccountManagementUpdateBansResultWrapper(const PFAccountManagementUpdateBansResult& model) : + ModelWrapper{ model }, + m_banData{ model.banData, model.banData + model.banDataCount } + { + SetModelPointers(); + } + + PFAccountManagementUpdateBansResultWrapper(const PFAccountManagementUpdateBansResultWrapper& src) : + PFAccountManagementUpdateBansResultWrapper{ src.Model() } + { + } + + PFAccountManagementUpdateBansResultWrapper(PFAccountManagementUpdateBansResultWrapper&& src) : + PFAccountManagementUpdateBansResultWrapper{} + { + swap(*this, src); + } + + PFAccountManagementUpdateBansResultWrapper& operator=(PFAccountManagementUpdateBansResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementUpdateBansResultWrapper() = default; + + friend void swap(PFAccountManagementUpdateBansResultWrapper& lhs, PFAccountManagementUpdateBansResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_banData, rhs.m_banData); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBanData(ModelVector, Alloc> value) + { + m_banData = std::move(value); + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + this->m_model.banDataCount = static_cast(m_banData.size()); + } + +private: + void SetModelPointers() + { + this->m_model.banData = m_banData.empty() ? nullptr : m_banData.data(); + } + + ModelVector, Alloc> m_banData; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper() = default; + + PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper(const PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_sandbox{ SafeString(model.sandbox) }, + m_titleId{ SafeString(model.titleId) }, + m_xboxLiveIds{ model.xboxLiveIds, model.xboxLiveIds + model.xboxLiveIdsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper(const PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper& src) : + PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper{ src.Model() } + { + } + + PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper(PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper&& src) : + PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper& operator=(PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper() = default; + + friend void swap(PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper& lhs, PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_sandbox, rhs.m_sandbox); + swap(lhs.m_titleId, rhs.m_titleId); + swap(lhs.m_xboxLiveIds, rhs.m_xboxLiveIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetSandbox(String value) + { + m_sandbox = std::move(value); + this->m_model.sandbox = m_sandbox.empty() ? nullptr : m_sandbox.data(); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + void SetXboxLiveIds(CStringVector value) + { + m_xboxLiveIds = std::move(value); + this->m_model.xboxLiveIds = m_xboxLiveIds.empty() ? nullptr : m_xboxLiveIds.data(); + this->m_model.xboxLiveIdsCount = static_cast(m_xboxLiveIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.sandbox = m_sandbox.empty() ? nullptr : m_sandbox.data(); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + this->m_model.xboxLiveIds = m_xboxLiveIds.empty() ? nullptr : m_xboxLiveIds.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_sandbox; + String m_titleId; + CStringVector m_xboxLiveIds; +}; + +template class Alloc = std::allocator> +class PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFAccountManagementGetTitlePlayersFromProviderIDsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper() = default; + + PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper(const PFAccountManagementGetTitlePlayersFromProviderIDsResponse& model) : + ModelWrapper{ model }, + m_titlePlayerAccounts{ model.titlePlayerAccounts, model.titlePlayerAccounts + model.titlePlayerAccountsCount } + { + SetModelPointers(); + } + + PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper(const PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper& src) : + PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper{ src.Model() } + { + } + + PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper(PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper&& src) : + PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper{} + { + swap(*this, src); + } + + PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper& operator=(PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper() = default; + + friend void swap(PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper& lhs, PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_titlePlayerAccounts, rhs.m_titlePlayerAccounts); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTitlePlayerAccounts(ModelDictionaryEntryVector, Alloc> value) + { + m_titlePlayerAccounts = std::move(value); + this->m_model.titlePlayerAccounts = m_titlePlayerAccounts.empty() ? nullptr : m_titlePlayerAccounts.data(); + this->m_model.titlePlayerAccountsCount = static_cast(m_titlePlayerAccounts.size()); + } + +private: + void SetModelPointers() + { + this->m_model.titlePlayerAccounts = m_titlePlayerAccounts.empty() ? nullptr : m_titlePlayerAccounts.data(); + } + + ModelDictionaryEntryVector, Alloc> m_titlePlayerAccounts; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CatalogTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CatalogTypeWrappers.h new file mode 100644 index 0000000..05bebc7 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CatalogTypeWrappers.h @@ -0,0 +1,6047 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFCatalogCatalogAlternateIdWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogAlternateId; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogAlternateIdWrapper() = default; + + PFCatalogCatalogAlternateIdWrapper(const PFCatalogCatalogAlternateId& model) : + ModelWrapper{ model }, + m_type{ SafeString(model.type) }, + m_value{ SafeString(model.value) } + { + SetModelPointers(); + } + + PFCatalogCatalogAlternateIdWrapper(const PFCatalogCatalogAlternateIdWrapper& src) : + PFCatalogCatalogAlternateIdWrapper{ src.Model() } + { + } + + PFCatalogCatalogAlternateIdWrapper(PFCatalogCatalogAlternateIdWrapper&& src) : + PFCatalogCatalogAlternateIdWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogAlternateIdWrapper& operator=(PFCatalogCatalogAlternateIdWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogAlternateIdWrapper() = default; + + friend void swap(PFCatalogCatalogAlternateIdWrapper& lhs, PFCatalogCatalogAlternateIdWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_type, rhs.m_type); + swap(lhs.m_value, rhs.m_value); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + void SetValue(String value) + { + m_value = std::move(value); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + +private: + void SetModelPointers() + { + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + + String m_type; + String m_value; +}; + +template class Alloc = std::allocator> +class PFCatalogContentWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogContent; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogContentWrapper() = default; + + PFCatalogContentWrapper(const PFCatalogContent& model) : + ModelWrapper{ model }, + m_id{ SafeString(model.id) }, + m_maxClientVersion{ SafeString(model.maxClientVersion) }, + m_minClientVersion{ SafeString(model.minClientVersion) }, + m_tags{ model.tags, model.tags + model.tagsCount }, + m_type{ SafeString(model.type) }, + m_url{ SafeString(model.url) } + { + SetModelPointers(); + } + + PFCatalogContentWrapper(const PFCatalogContentWrapper& src) : + PFCatalogContentWrapper{ src.Model() } + { + } + + PFCatalogContentWrapper(PFCatalogContentWrapper&& src) : + PFCatalogContentWrapper{} + { + swap(*this, src); + } + + PFCatalogContentWrapper& operator=(PFCatalogContentWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogContentWrapper() = default; + + friend void swap(PFCatalogContentWrapper& lhs, PFCatalogContentWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_maxClientVersion, rhs.m_maxClientVersion); + swap(lhs.m_minClientVersion, rhs.m_minClientVersion); + swap(lhs.m_tags, rhs.m_tags); + swap(lhs.m_type, rhs.m_type); + swap(lhs.m_url, rhs.m_url); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetMaxClientVersion(String value) + { + m_maxClientVersion = std::move(value); + this->m_model.maxClientVersion = m_maxClientVersion.empty() ? nullptr : m_maxClientVersion.data(); + } + + void SetMinClientVersion(String value) + { + m_minClientVersion = std::move(value); + this->m_model.minClientVersion = m_minClientVersion.empty() ? nullptr : m_minClientVersion.data(); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + void SetUrl(String value) + { + m_url = std::move(value); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + +private: + void SetModelPointers() + { + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.maxClientVersion = m_maxClientVersion.empty() ? nullptr : m_maxClientVersion.data(); + this->m_model.minClientVersion = m_minClientVersion.empty() ? nullptr : m_minClientVersion.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + + String m_id; + String m_maxClientVersion; + String m_minClientVersion; + CStringVector m_tags; + String m_type; + String m_url; +}; + +template class Alloc = std::allocator> +class PFCatalogDeepLinkWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogDeepLink; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogDeepLinkWrapper() = default; + + PFCatalogDeepLinkWrapper(const PFCatalogDeepLink& model) : + ModelWrapper{ model }, + m_platform{ SafeString(model.platform) }, + m_url{ SafeString(model.url) } + { + SetModelPointers(); + } + + PFCatalogDeepLinkWrapper(const PFCatalogDeepLinkWrapper& src) : + PFCatalogDeepLinkWrapper{ src.Model() } + { + } + + PFCatalogDeepLinkWrapper(PFCatalogDeepLinkWrapper&& src) : + PFCatalogDeepLinkWrapper{} + { + swap(*this, src); + } + + PFCatalogDeepLinkWrapper& operator=(PFCatalogDeepLinkWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogDeepLinkWrapper() = default; + + friend void swap(PFCatalogDeepLinkWrapper& lhs, PFCatalogDeepLinkWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_platform, rhs.m_platform); + swap(lhs.m_url, rhs.m_url); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlatform(String value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + } + + void SetUrl(String value) + { + m_url = std::move(value); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + +private: + void SetModelPointers() + { + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + + String m_platform; + String m_url; +}; + +template class Alloc = std::allocator> +class PFCatalogImageWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogImage; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogImageWrapper() = default; + + PFCatalogImageWrapper(const PFCatalogImage& model) : + ModelWrapper{ model }, + m_id{ SafeString(model.id) }, + m_tag{ SafeString(model.tag) }, + m_type{ SafeString(model.type) }, + m_url{ SafeString(model.url) } + { + SetModelPointers(); + } + + PFCatalogImageWrapper(const PFCatalogImageWrapper& src) : + PFCatalogImageWrapper{ src.Model() } + { + } + + PFCatalogImageWrapper(PFCatalogImageWrapper&& src) : + PFCatalogImageWrapper{} + { + swap(*this, src); + } + + PFCatalogImageWrapper& operator=(PFCatalogImageWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogImageWrapper() = default; + + friend void swap(PFCatalogImageWrapper& lhs, PFCatalogImageWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_tag, rhs.m_tag); + swap(lhs.m_type, rhs.m_type); + swap(lhs.m_url, rhs.m_url); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetTag(String value) + { + m_tag = std::move(value); + this->m_model.tag = m_tag.empty() ? nullptr : m_tag.data(); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + void SetUrl(String value) + { + m_url = std::move(value); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + +private: + void SetModelPointers() + { + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.tag = m_tag.empty() ? nullptr : m_tag.data(); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + + String m_id; + String m_tag; + String m_type; + String m_url; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogPriceAmountWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogPriceAmount; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogPriceAmountWrapper() = default; + + PFCatalogCatalogPriceAmountWrapper(const PFCatalogCatalogPriceAmount& model) : + ModelWrapper{ model }, + m_itemId{ SafeString(model.itemId) } + { + SetModelPointers(); + } + + PFCatalogCatalogPriceAmountWrapper(const PFCatalogCatalogPriceAmountWrapper& src) : + PFCatalogCatalogPriceAmountWrapper{ src.Model() } + { + } + + PFCatalogCatalogPriceAmountWrapper(PFCatalogCatalogPriceAmountWrapper&& src) : + PFCatalogCatalogPriceAmountWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogPriceAmountWrapper& operator=(PFCatalogCatalogPriceAmountWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogPriceAmountWrapper() = default; + + friend void swap(PFCatalogCatalogPriceAmountWrapper& lhs, PFCatalogCatalogPriceAmountWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_itemId, rhs.m_itemId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(int32_t value) + { + this->m_model.amount = value; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + String m_itemId; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogPriceWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogPrice; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogPriceWrapper() = default; + + PFCatalogCatalogPriceWrapper(const PFCatalogCatalogPrice& model) : + ModelWrapper{ model }, + m_amounts{ model.amounts, model.amounts + model.amountsCount }, + m_unitAmount{ model.unitAmount ? std::optional{ *model.unitAmount } : std::nullopt }, + m_unitDurationInSeconds{ model.unitDurationInSeconds ? std::optional{ *model.unitDurationInSeconds } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogCatalogPriceWrapper(const PFCatalogCatalogPriceWrapper& src) : + PFCatalogCatalogPriceWrapper{ src.Model() } + { + } + + PFCatalogCatalogPriceWrapper(PFCatalogCatalogPriceWrapper&& src) : + PFCatalogCatalogPriceWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogPriceWrapper& operator=(PFCatalogCatalogPriceWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogPriceWrapper() = default; + + friend void swap(PFCatalogCatalogPriceWrapper& lhs, PFCatalogCatalogPriceWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amounts, rhs.m_amounts); + swap(lhs.m_unitAmount, rhs.m_unitAmount); + swap(lhs.m_unitDurationInSeconds, rhs.m_unitDurationInSeconds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmounts(ModelVector, Alloc> value) + { + m_amounts = std::move(value); + this->m_model.amounts = m_amounts.empty() ? nullptr : m_amounts.data(); + this->m_model.amountsCount = static_cast(m_amounts.size()); + } + + void SetUnitAmount(std::optional value) + { + m_unitAmount = std::move(value); + this->m_model.unitAmount = m_unitAmount ? m_unitAmount.operator->() : nullptr; + } + + void SetUnitDurationInSeconds(std::optional value) + { + m_unitDurationInSeconds = std::move(value); + this->m_model.unitDurationInSeconds = m_unitDurationInSeconds ? m_unitDurationInSeconds.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amounts = m_amounts.empty() ? nullptr : m_amounts.data(); + this->m_model.unitAmount = m_unitAmount ? m_unitAmount.operator->() : nullptr; + this->m_model.unitDurationInSeconds = m_unitDurationInSeconds ? m_unitDurationInSeconds.operator->() : nullptr; + } + + ModelVector, Alloc> m_amounts; + std::optional m_unitAmount; + std::optional m_unitDurationInSeconds; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogPriceOptionsWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogPriceOptions; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogPriceOptionsWrapper() = default; + + PFCatalogCatalogPriceOptionsWrapper(const PFCatalogCatalogPriceOptions& model) : + ModelWrapper{ model }, + m_prices{ model.prices, model.prices + model.pricesCount } + { + SetModelPointers(); + } + + PFCatalogCatalogPriceOptionsWrapper(const PFCatalogCatalogPriceOptionsWrapper& src) : + PFCatalogCatalogPriceOptionsWrapper{ src.Model() } + { + } + + PFCatalogCatalogPriceOptionsWrapper(PFCatalogCatalogPriceOptionsWrapper&& src) : + PFCatalogCatalogPriceOptionsWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogPriceOptionsWrapper& operator=(PFCatalogCatalogPriceOptionsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogPriceOptionsWrapper() = default; + + friend void swap(PFCatalogCatalogPriceOptionsWrapper& lhs, PFCatalogCatalogPriceOptionsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_prices, rhs.m_prices); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPrices(ModelVector, Alloc> value) + { + m_prices = std::move(value); + this->m_model.prices = m_prices.empty() ? nullptr : m_prices.data(); + this->m_model.pricesCount = static_cast(m_prices.size()); + } + +private: + void SetModelPointers() + { + this->m_model.prices = m_prices.empty() ? nullptr : m_prices.data(); + } + + ModelVector, Alloc> m_prices; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogItemReferenceWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogItemReference; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogItemReferenceWrapper() = default; + + PFCatalogCatalogItemReferenceWrapper(const PFCatalogCatalogItemReference& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_id{ SafeString(model.id) }, + m_priceOptions{ model.priceOptions ? std::optional>{ *model.priceOptions } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogCatalogItemReferenceWrapper(const PFCatalogCatalogItemReferenceWrapper& src) : + PFCatalogCatalogItemReferenceWrapper{ src.Model() } + { + } + + PFCatalogCatalogItemReferenceWrapper(PFCatalogCatalogItemReferenceWrapper&& src) : + PFCatalogCatalogItemReferenceWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogItemReferenceWrapper& operator=(PFCatalogCatalogItemReferenceWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogItemReferenceWrapper() = default; + + friend void swap(PFCatalogCatalogItemReferenceWrapper& lhs, PFCatalogCatalogItemReferenceWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_priceOptions, rhs.m_priceOptions); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetPriceOptions(std::optional> value) + { + m_priceOptions = std::move(value); + this->m_model.priceOptions = m_priceOptions ? &m_priceOptions->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.priceOptions = m_priceOptions ? &m_priceOptions->Model() : nullptr; + } + + std::optional m_amount; + String m_id; + std::optional> m_priceOptions; +}; + +template class Alloc = std::allocator> +class PFCatalogKeywordSetWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogKeywordSet; + using DictionaryEntryType = PFCatalogKeywordSetDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogKeywordSetWrapper() = default; + + PFCatalogKeywordSetWrapper(const PFCatalogKeywordSet& model) : + ModelWrapper{ model }, + m_values{ model.values, model.values + model.valuesCount } + { + SetModelPointers(); + } + + PFCatalogKeywordSetWrapper(const PFCatalogKeywordSetWrapper& src) : + PFCatalogKeywordSetWrapper{ src.Model() } + { + } + + PFCatalogKeywordSetWrapper(PFCatalogKeywordSetWrapper&& src) : + PFCatalogKeywordSetWrapper{} + { + swap(*this, src); + } + + PFCatalogKeywordSetWrapper& operator=(PFCatalogKeywordSetWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogKeywordSetWrapper() = default; + + friend void swap(PFCatalogKeywordSetWrapper& lhs, PFCatalogKeywordSetWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_values, rhs.m_values); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetValues(CStringVector value) + { + m_values = std::move(value); + this->m_model.values = m_values.empty() ? nullptr : m_values.data(); + this->m_model.valuesCount = static_cast(m_values.size()); + } + +private: + void SetModelPointers() + { + this->m_model.values = m_values.empty() ? nullptr : m_values.data(); + } + + CStringVector m_values; +}; + +template class Alloc = std::allocator> +class PFCatalogModerationStateWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogModerationState; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogModerationStateWrapper() = default; + + PFCatalogModerationStateWrapper(const PFCatalogModerationState& model) : + ModelWrapper{ model }, + m_lastModifiedDate{ model.lastModifiedDate ? std::optional{ *model.lastModifiedDate } : std::nullopt }, + m_reason{ SafeString(model.reason) }, + m_status{ model.status ? std::optional{ *model.status } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogModerationStateWrapper(const PFCatalogModerationStateWrapper& src) : + PFCatalogModerationStateWrapper{ src.Model() } + { + } + + PFCatalogModerationStateWrapper(PFCatalogModerationStateWrapper&& src) : + PFCatalogModerationStateWrapper{} + { + swap(*this, src); + } + + PFCatalogModerationStateWrapper& operator=(PFCatalogModerationStateWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogModerationStateWrapper() = default; + + friend void swap(PFCatalogModerationStateWrapper& lhs, PFCatalogModerationStateWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_lastModifiedDate, rhs.m_lastModifiedDate); + swap(lhs.m_reason, rhs.m_reason); + swap(lhs.m_status, rhs.m_status); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetLastModifiedDate(std::optional value) + { + m_lastModifiedDate = std::move(value); + this->m_model.lastModifiedDate = m_lastModifiedDate ? m_lastModifiedDate.operator->() : nullptr; + } + + void SetReason(String value) + { + m_reason = std::move(value); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + + void SetStatus(std::optional value) + { + m_status = std::move(value); + this->m_model.status = m_status ? m_status.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.lastModifiedDate = m_lastModifiedDate ? m_lastModifiedDate.operator->() : nullptr; + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + this->m_model.status = m_status ? m_status.operator->() : nullptr; + } + + std::optional m_lastModifiedDate; + String m_reason; + std::optional m_status; +}; + +template class Alloc = std::allocator> +class PFCatalogRatingWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogRating; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogRatingWrapper() = default; + + PFCatalogRatingWrapper(const PFCatalogRating& model) : + ModelWrapper{ model }, + m_average{ model.average ? std::optional{ *model.average } : std::nullopt }, + m_count1Star{ model.count1Star ? std::optional{ *model.count1Star } : std::nullopt }, + m_count2Star{ model.count2Star ? std::optional{ *model.count2Star } : std::nullopt }, + m_count3Star{ model.count3Star ? std::optional{ *model.count3Star } : std::nullopt }, + m_count4Star{ model.count4Star ? std::optional{ *model.count4Star } : std::nullopt }, + m_count5Star{ model.count5Star ? std::optional{ *model.count5Star } : std::nullopt }, + m_totalCount{ model.totalCount ? std::optional{ *model.totalCount } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogRatingWrapper(const PFCatalogRatingWrapper& src) : + PFCatalogRatingWrapper{ src.Model() } + { + } + + PFCatalogRatingWrapper(PFCatalogRatingWrapper&& src) : + PFCatalogRatingWrapper{} + { + swap(*this, src); + } + + PFCatalogRatingWrapper& operator=(PFCatalogRatingWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogRatingWrapper() = default; + + friend void swap(PFCatalogRatingWrapper& lhs, PFCatalogRatingWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_average, rhs.m_average); + swap(lhs.m_count1Star, rhs.m_count1Star); + swap(lhs.m_count2Star, rhs.m_count2Star); + swap(lhs.m_count3Star, rhs.m_count3Star); + swap(lhs.m_count4Star, rhs.m_count4Star); + swap(lhs.m_count5Star, rhs.m_count5Star); + swap(lhs.m_totalCount, rhs.m_totalCount); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAverage(std::optional value) + { + m_average = std::move(value); + this->m_model.average = m_average ? m_average.operator->() : nullptr; + } + + void SetCount1Star(std::optional value) + { + m_count1Star = std::move(value); + this->m_model.count1Star = m_count1Star ? m_count1Star.operator->() : nullptr; + } + + void SetCount2Star(std::optional value) + { + m_count2Star = std::move(value); + this->m_model.count2Star = m_count2Star ? m_count2Star.operator->() : nullptr; + } + + void SetCount3Star(std::optional value) + { + m_count3Star = std::move(value); + this->m_model.count3Star = m_count3Star ? m_count3Star.operator->() : nullptr; + } + + void SetCount4Star(std::optional value) + { + m_count4Star = std::move(value); + this->m_model.count4Star = m_count4Star ? m_count4Star.operator->() : nullptr; + } + + void SetCount5Star(std::optional value) + { + m_count5Star = std::move(value); + this->m_model.count5Star = m_count5Star ? m_count5Star.operator->() : nullptr; + } + + void SetTotalCount(std::optional value) + { + m_totalCount = std::move(value); + this->m_model.totalCount = m_totalCount ? m_totalCount.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.average = m_average ? m_average.operator->() : nullptr; + this->m_model.count1Star = m_count1Star ? m_count1Star.operator->() : nullptr; + this->m_model.count2Star = m_count2Star ? m_count2Star.operator->() : nullptr; + this->m_model.count3Star = m_count3Star ? m_count3Star.operator->() : nullptr; + this->m_model.count4Star = m_count4Star ? m_count4Star.operator->() : nullptr; + this->m_model.count5Star = m_count5Star ? m_count5Star.operator->() : nullptr; + this->m_model.totalCount = m_totalCount ? m_totalCount.operator->() : nullptr; + } + + std::optional m_average; + std::optional m_count1Star; + std::optional m_count2Star; + std::optional m_count3Star; + std::optional m_count4Star; + std::optional m_count5Star; + std::optional m_totalCount; +}; + +template class Alloc = std::allocator> +class PFCatalogFilterOptionsWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogFilterOptions; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogFilterOptionsWrapper() = default; + + PFCatalogFilterOptionsWrapper(const PFCatalogFilterOptions& model) : + ModelWrapper{ model }, + m_filter{ SafeString(model.filter) }, + m_includeAllItems{ model.includeAllItems ? std::optional{ *model.includeAllItems } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogFilterOptionsWrapper(const PFCatalogFilterOptionsWrapper& src) : + PFCatalogFilterOptionsWrapper{ src.Model() } + { + } + + PFCatalogFilterOptionsWrapper(PFCatalogFilterOptionsWrapper&& src) : + PFCatalogFilterOptionsWrapper{} + { + swap(*this, src); + } + + PFCatalogFilterOptionsWrapper& operator=(PFCatalogFilterOptionsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogFilterOptionsWrapper() = default; + + friend void swap(PFCatalogFilterOptionsWrapper& lhs, PFCatalogFilterOptionsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_filter, rhs.m_filter); + swap(lhs.m_includeAllItems, rhs.m_includeAllItems); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFilter(String value) + { + m_filter = std::move(value); + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + + void SetIncludeAllItems(std::optional value) + { + m_includeAllItems = std::move(value); + this->m_model.includeAllItems = m_includeAllItems ? m_includeAllItems.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + this->m_model.includeAllItems = m_includeAllItems ? m_includeAllItems.operator->() : nullptr; + } + + String m_filter; + std::optional m_includeAllItems; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogPriceAmountOverrideWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogPriceAmountOverride; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogPriceAmountOverrideWrapper() = default; + + PFCatalogCatalogPriceAmountOverrideWrapper(const PFCatalogCatalogPriceAmountOverride& model) : + ModelWrapper{ model }, + m_fixedValue{ model.fixedValue ? std::optional{ *model.fixedValue } : std::nullopt }, + m_itemId{ SafeString(model.itemId) }, + m_multiplier{ model.multiplier ? std::optional{ *model.multiplier } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogCatalogPriceAmountOverrideWrapper(const PFCatalogCatalogPriceAmountOverrideWrapper& src) : + PFCatalogCatalogPriceAmountOverrideWrapper{ src.Model() } + { + } + + PFCatalogCatalogPriceAmountOverrideWrapper(PFCatalogCatalogPriceAmountOverrideWrapper&& src) : + PFCatalogCatalogPriceAmountOverrideWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogPriceAmountOverrideWrapper& operator=(PFCatalogCatalogPriceAmountOverrideWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogPriceAmountOverrideWrapper() = default; + + friend void swap(PFCatalogCatalogPriceAmountOverrideWrapper& lhs, PFCatalogCatalogPriceAmountOverrideWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_fixedValue, rhs.m_fixedValue); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_multiplier, rhs.m_multiplier); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFixedValue(std::optional value) + { + m_fixedValue = std::move(value); + this->m_model.fixedValue = m_fixedValue ? m_fixedValue.operator->() : nullptr; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetMultiplier(std::optional value) + { + m_multiplier = std::move(value); + this->m_model.multiplier = m_multiplier ? m_multiplier.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.fixedValue = m_fixedValue ? m_fixedValue.operator->() : nullptr; + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.multiplier = m_multiplier ? m_multiplier.operator->() : nullptr; + } + + std::optional m_fixedValue; + String m_itemId; + std::optional m_multiplier; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogPriceOverrideWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogPriceOverride; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogPriceOverrideWrapper() = default; + + PFCatalogCatalogPriceOverrideWrapper(const PFCatalogCatalogPriceOverride& model) : + ModelWrapper{ model }, + m_amounts{ model.amounts, model.amounts + model.amountsCount } + { + SetModelPointers(); + } + + PFCatalogCatalogPriceOverrideWrapper(const PFCatalogCatalogPriceOverrideWrapper& src) : + PFCatalogCatalogPriceOverrideWrapper{ src.Model() } + { + } + + PFCatalogCatalogPriceOverrideWrapper(PFCatalogCatalogPriceOverrideWrapper&& src) : + PFCatalogCatalogPriceOverrideWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogPriceOverrideWrapper& operator=(PFCatalogCatalogPriceOverrideWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogPriceOverrideWrapper() = default; + + friend void swap(PFCatalogCatalogPriceOverrideWrapper& lhs, PFCatalogCatalogPriceOverrideWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amounts, rhs.m_amounts); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmounts(ModelVector, Alloc> value) + { + m_amounts = std::move(value); + this->m_model.amounts = m_amounts.empty() ? nullptr : m_amounts.data(); + this->m_model.amountsCount = static_cast(m_amounts.size()); + } + +private: + void SetModelPointers() + { + this->m_model.amounts = m_amounts.empty() ? nullptr : m_amounts.data(); + } + + ModelVector, Alloc> m_amounts; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogPriceOptionsOverrideWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogPriceOptionsOverride; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogPriceOptionsOverrideWrapper() = default; + + PFCatalogCatalogPriceOptionsOverrideWrapper(const PFCatalogCatalogPriceOptionsOverride& model) : + ModelWrapper{ model }, + m_prices{ model.prices, model.prices + model.pricesCount } + { + SetModelPointers(); + } + + PFCatalogCatalogPriceOptionsOverrideWrapper(const PFCatalogCatalogPriceOptionsOverrideWrapper& src) : + PFCatalogCatalogPriceOptionsOverrideWrapper{ src.Model() } + { + } + + PFCatalogCatalogPriceOptionsOverrideWrapper(PFCatalogCatalogPriceOptionsOverrideWrapper&& src) : + PFCatalogCatalogPriceOptionsOverrideWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogPriceOptionsOverrideWrapper& operator=(PFCatalogCatalogPriceOptionsOverrideWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogPriceOptionsOverrideWrapper() = default; + + friend void swap(PFCatalogCatalogPriceOptionsOverrideWrapper& lhs, PFCatalogCatalogPriceOptionsOverrideWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_prices, rhs.m_prices); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPrices(ModelVector, Alloc> value) + { + m_prices = std::move(value); + this->m_model.prices = m_prices.empty() ? nullptr : m_prices.data(); + this->m_model.pricesCount = static_cast(m_prices.size()); + } + +private: + void SetModelPointers() + { + this->m_model.prices = m_prices.empty() ? nullptr : m_prices.data(); + } + + ModelVector, Alloc> m_prices; +}; + +template class Alloc = std::allocator> +class PFCatalogStoreDetailsWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogStoreDetails; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogStoreDetailsWrapper() = default; + + PFCatalogStoreDetailsWrapper(const PFCatalogStoreDetails& model) : + ModelWrapper{ model }, + m_filterOptions{ model.filterOptions ? std::optional>{ *model.filterOptions } : std::nullopt }, + m_priceOptionsOverride{ model.priceOptionsOverride ? std::optional>{ *model.priceOptionsOverride } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogStoreDetailsWrapper(const PFCatalogStoreDetailsWrapper& src) : + PFCatalogStoreDetailsWrapper{ src.Model() } + { + } + + PFCatalogStoreDetailsWrapper(PFCatalogStoreDetailsWrapper&& src) : + PFCatalogStoreDetailsWrapper{} + { + swap(*this, src); + } + + PFCatalogStoreDetailsWrapper& operator=(PFCatalogStoreDetailsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogStoreDetailsWrapper() = default; + + friend void swap(PFCatalogStoreDetailsWrapper& lhs, PFCatalogStoreDetailsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_filterOptions, rhs.m_filterOptions); + swap(lhs.m_priceOptionsOverride, rhs.m_priceOptionsOverride); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFilterOptions(std::optional> value) + { + m_filterOptions = std::move(value); + this->m_model.filterOptions = m_filterOptions ? &m_filterOptions->Model() : nullptr; + } + + void SetPriceOptionsOverride(std::optional> value) + { + m_priceOptionsOverride = std::move(value); + this->m_model.priceOptionsOverride = m_priceOptionsOverride ? &m_priceOptionsOverride->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.filterOptions = m_filterOptions ? &m_filterOptions->Model() : nullptr; + this->m_model.priceOptionsOverride = m_priceOptionsOverride ? &m_priceOptionsOverride->Model() : nullptr; + } + + std::optional> m_filterOptions; + std::optional> m_priceOptionsOverride; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogItemWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogItem; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogItemWrapper() = default; + + PFCatalogCatalogItemWrapper(const PFCatalogCatalogItem& model) : + ModelWrapper{ model }, + m_alternateIds{ model.alternateIds, model.alternateIds + model.alternateIdsCount }, + m_contents{ model.contents, model.contents + model.contentsCount }, + m_contentType{ SafeString(model.contentType) }, + m_creationDate{ model.creationDate ? std::optional{ *model.creationDate } : std::nullopt }, + m_creatorEntity{ model.creatorEntity ? std::optional>{ *model.creatorEntity } : std::nullopt }, + m_deepLinks{ model.deepLinks, model.deepLinks + model.deepLinksCount }, + m_defaultStackId{ SafeString(model.defaultStackId) }, + m_description{ model.description, model.description + model.descriptionCount }, + m_displayProperties{ model.displayProperties }, + m_displayVersion{ SafeString(model.displayVersion) }, + m_endDate{ model.endDate ? std::optional{ *model.endDate } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_id{ SafeString(model.id) }, + m_images{ model.images, model.images + model.imagesCount }, + m_isHidden{ model.isHidden ? std::optional{ *model.isHidden } : std::nullopt }, + m_itemReferences{ model.itemReferences, model.itemReferences + model.itemReferencesCount }, + m_keywords{ model.keywords, model.keywords + model.keywordsCount }, + m_lastModifiedDate{ model.lastModifiedDate ? std::optional{ *model.lastModifiedDate } : std::nullopt }, + m_moderation{ model.moderation ? std::optional>{ *model.moderation } : std::nullopt }, + m_platforms{ model.platforms, model.platforms + model.platformsCount }, + m_priceOptions{ model.priceOptions ? std::optional>{ *model.priceOptions } : std::nullopt }, + m_rating{ model.rating ? std::optional>{ *model.rating } : std::nullopt }, + m_startDate{ model.startDate ? std::optional{ *model.startDate } : std::nullopt }, + m_storeDetails{ model.storeDetails ? std::optional>{ *model.storeDetails } : std::nullopt }, + m_tags{ model.tags, model.tags + model.tagsCount }, + m_title{ model.title, model.title + model.titleCount }, + m_type{ SafeString(model.type) } + { + SetModelPointers(); + } + + PFCatalogCatalogItemWrapper(const PFCatalogCatalogItemWrapper& src) : + PFCatalogCatalogItemWrapper{ src.Model() } + { + } + + PFCatalogCatalogItemWrapper(PFCatalogCatalogItemWrapper&& src) : + PFCatalogCatalogItemWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogItemWrapper& operator=(PFCatalogCatalogItemWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogItemWrapper() = default; + + friend void swap(PFCatalogCatalogItemWrapper& lhs, PFCatalogCatalogItemWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateIds, rhs.m_alternateIds); + swap(lhs.m_contents, rhs.m_contents); + swap(lhs.m_contentType, rhs.m_contentType); + swap(lhs.m_creationDate, rhs.m_creationDate); + swap(lhs.m_creatorEntity, rhs.m_creatorEntity); + swap(lhs.m_deepLinks, rhs.m_deepLinks); + swap(lhs.m_defaultStackId, rhs.m_defaultStackId); + swap(lhs.m_description, rhs.m_description); + swap(lhs.m_displayProperties, rhs.m_displayProperties); + swap(lhs.m_displayVersion, rhs.m_displayVersion); + swap(lhs.m_endDate, rhs.m_endDate); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_images, rhs.m_images); + swap(lhs.m_isHidden, rhs.m_isHidden); + swap(lhs.m_itemReferences, rhs.m_itemReferences); + swap(lhs.m_keywords, rhs.m_keywords); + swap(lhs.m_lastModifiedDate, rhs.m_lastModifiedDate); + swap(lhs.m_moderation, rhs.m_moderation); + swap(lhs.m_platforms, rhs.m_platforms); + swap(lhs.m_priceOptions, rhs.m_priceOptions); + swap(lhs.m_rating, rhs.m_rating); + swap(lhs.m_startDate, rhs.m_startDate); + swap(lhs.m_storeDetails, rhs.m_storeDetails); + swap(lhs.m_tags, rhs.m_tags); + swap(lhs.m_title, rhs.m_title); + swap(lhs.m_type, rhs.m_type); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateIds(ModelVector, Alloc> value) + { + m_alternateIds = std::move(value); + this->m_model.alternateIds = m_alternateIds.empty() ? nullptr : m_alternateIds.data(); + this->m_model.alternateIdsCount = static_cast(m_alternateIds.size()); + } + + void SetContents(ModelVector, Alloc> value) + { + m_contents = std::move(value); + this->m_model.contents = m_contents.empty() ? nullptr : m_contents.data(); + this->m_model.contentsCount = static_cast(m_contents.size()); + } + + void SetContentType(String value) + { + m_contentType = std::move(value); + this->m_model.contentType = m_contentType.empty() ? nullptr : m_contentType.data(); + } + + void SetCreationDate(std::optional value) + { + m_creationDate = std::move(value); + this->m_model.creationDate = m_creationDate ? m_creationDate.operator->() : nullptr; + } + + void SetCreatorEntity(std::optional> value) + { + m_creatorEntity = std::move(value); + this->m_model.creatorEntity = m_creatorEntity ? &m_creatorEntity->Model() : nullptr; + } + + void SetDeepLinks(ModelVector, Alloc> value) + { + m_deepLinks = std::move(value); + this->m_model.deepLinks = m_deepLinks.empty() ? nullptr : m_deepLinks.data(); + this->m_model.deepLinksCount = static_cast(m_deepLinks.size()); + } + + void SetDefaultStackId(String value) + { + m_defaultStackId = std::move(value); + this->m_model.defaultStackId = m_defaultStackId.empty() ? nullptr : m_defaultStackId.data(); + } + + void SetDescription(StringDictionaryEntryVector value) + { + m_description = std::move(value); + this->m_model.description = m_description.empty() ? nullptr : m_description.data(); + this->m_model.descriptionCount = static_cast(m_description.size()); + } + + void SetDisplayProperties(JsonObject value) + { + m_displayProperties = std::move(value); + this->m_model.displayProperties.stringValue = m_displayProperties.stringValue.empty() ? nullptr : m_displayProperties.stringValue.data(); + } + + void SetDisplayVersion(String value) + { + m_displayVersion = std::move(value); + this->m_model.displayVersion = m_displayVersion.empty() ? nullptr : m_displayVersion.data(); + } + + void SetEndDate(std::optional value) + { + m_endDate = std::move(value); + this->m_model.endDate = m_endDate ? m_endDate.operator->() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetImages(ModelVector, Alloc> value) + { + m_images = std::move(value); + this->m_model.images = m_images.empty() ? nullptr : m_images.data(); + this->m_model.imagesCount = static_cast(m_images.size()); + } + + void SetIsHidden(std::optional value) + { + m_isHidden = std::move(value); + this->m_model.isHidden = m_isHidden ? m_isHidden.operator->() : nullptr; + } + + void SetItemReferences(ModelVector, Alloc> value) + { + m_itemReferences = std::move(value); + this->m_model.itemReferences = m_itemReferences.empty() ? nullptr : m_itemReferences.data(); + this->m_model.itemReferencesCount = static_cast(m_itemReferences.size()); + } + + void SetKeywords(ModelDictionaryEntryVector, Alloc> value) + { + m_keywords = std::move(value); + this->m_model.keywords = m_keywords.empty() ? nullptr : m_keywords.data(); + this->m_model.keywordsCount = static_cast(m_keywords.size()); + } + + void SetLastModifiedDate(std::optional value) + { + m_lastModifiedDate = std::move(value); + this->m_model.lastModifiedDate = m_lastModifiedDate ? m_lastModifiedDate.operator->() : nullptr; + } + + void SetModeration(std::optional> value) + { + m_moderation = std::move(value); + this->m_model.moderation = m_moderation ? &m_moderation->Model() : nullptr; + } + + void SetPlatforms(CStringVector value) + { + m_platforms = std::move(value); + this->m_model.platforms = m_platforms.empty() ? nullptr : m_platforms.data(); + this->m_model.platformsCount = static_cast(m_platforms.size()); + } + + void SetPriceOptions(std::optional> value) + { + m_priceOptions = std::move(value); + this->m_model.priceOptions = m_priceOptions ? &m_priceOptions->Model() : nullptr; + } + + void SetRating(std::optional> value) + { + m_rating = std::move(value); + this->m_model.rating = m_rating ? &m_rating->Model() : nullptr; + } + + void SetStartDate(std::optional value) + { + m_startDate = std::move(value); + this->m_model.startDate = m_startDate ? m_startDate.operator->() : nullptr; + } + + void SetStoreDetails(std::optional> value) + { + m_storeDetails = std::move(value); + this->m_model.storeDetails = m_storeDetails ? &m_storeDetails->Model() : nullptr; + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + + void SetTitle(StringDictionaryEntryVector value) + { + m_title = std::move(value); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + this->m_model.titleCount = static_cast(m_title.size()); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateIds = m_alternateIds.empty() ? nullptr : m_alternateIds.data(); + this->m_model.contents = m_contents.empty() ? nullptr : m_contents.data(); + this->m_model.contentType = m_contentType.empty() ? nullptr : m_contentType.data(); + this->m_model.creationDate = m_creationDate ? m_creationDate.operator->() : nullptr; + this->m_model.creatorEntity = m_creatorEntity ? &m_creatorEntity->Model() : nullptr; + this->m_model.deepLinks = m_deepLinks.empty() ? nullptr : m_deepLinks.data(); + this->m_model.defaultStackId = m_defaultStackId.empty() ? nullptr : m_defaultStackId.data(); + this->m_model.description = m_description.empty() ? nullptr : m_description.data(); + this->m_model.displayProperties.stringValue = m_displayProperties.stringValue.empty() ? nullptr : m_displayProperties.stringValue.data(); + this->m_model.displayVersion = m_displayVersion.empty() ? nullptr : m_displayVersion.data(); + this->m_model.endDate = m_endDate ? m_endDate.operator->() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.images = m_images.empty() ? nullptr : m_images.data(); + this->m_model.isHidden = m_isHidden ? m_isHidden.operator->() : nullptr; + this->m_model.itemReferences = m_itemReferences.empty() ? nullptr : m_itemReferences.data(); + this->m_model.keywords = m_keywords.empty() ? nullptr : m_keywords.data(); + this->m_model.lastModifiedDate = m_lastModifiedDate ? m_lastModifiedDate.operator->() : nullptr; + this->m_model.moderation = m_moderation ? &m_moderation->Model() : nullptr; + this->m_model.platforms = m_platforms.empty() ? nullptr : m_platforms.data(); + this->m_model.priceOptions = m_priceOptions ? &m_priceOptions->Model() : nullptr; + this->m_model.rating = m_rating ? &m_rating->Model() : nullptr; + this->m_model.startDate = m_startDate ? m_startDate.operator->() : nullptr; + this->m_model.storeDetails = m_storeDetails ? &m_storeDetails->Model() : nullptr; + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + ModelVector, Alloc> m_alternateIds; + ModelVector, Alloc> m_contents; + String m_contentType; + std::optional m_creationDate; + std::optional> m_creatorEntity; + ModelVector, Alloc> m_deepLinks; + String m_defaultStackId; + StringDictionaryEntryVector m_description; + JsonObject m_displayProperties; + String m_displayVersion; + std::optional m_endDate; + String m_eTag; + String m_id; + ModelVector, Alloc> m_images; + std::optional m_isHidden; + ModelVector, Alloc> m_itemReferences; + ModelDictionaryEntryVector, Alloc> m_keywords; + std::optional m_lastModifiedDate; + std::optional> m_moderation; + CStringVector m_platforms; + std::optional> m_priceOptions; + std::optional> m_rating; + std::optional m_startDate; + std::optional> m_storeDetails; + CStringVector m_tags; + StringDictionaryEntryVector m_title; + String m_type; +}; + +template class Alloc = std::allocator> +class PFCatalogCreateDraftItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCreateDraftItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCreateDraftItemRequestWrapper() = default; + + PFCatalogCreateDraftItemRequestWrapper(const PFCatalogCreateDraftItemRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogCreateDraftItemRequestWrapper(const PFCatalogCreateDraftItemRequestWrapper& src) : + PFCatalogCreateDraftItemRequestWrapper{ src.Model() } + { + } + + PFCatalogCreateDraftItemRequestWrapper(PFCatalogCreateDraftItemRequestWrapper&& src) : + PFCatalogCreateDraftItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogCreateDraftItemRequestWrapper& operator=(PFCatalogCreateDraftItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCreateDraftItemRequestWrapper() = default; + + friend void swap(PFCatalogCreateDraftItemRequestWrapper& lhs, PFCatalogCreateDraftItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + void SetPublish(bool value) + { + this->m_model.publish = value; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFCatalogCreateDraftItemResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCreateDraftItemResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCreateDraftItemResponseWrapper() = default; + + PFCatalogCreateDraftItemResponseWrapper(const PFCatalogCreateDraftItemResponse& model) : + ModelWrapper{ model }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogCreateDraftItemResponseWrapper(const PFCatalogCreateDraftItemResponseWrapper& src) : + PFCatalogCreateDraftItemResponseWrapper{ src.Model() } + { + } + + PFCatalogCreateDraftItemResponseWrapper(PFCatalogCreateDraftItemResponseWrapper&& src) : + PFCatalogCreateDraftItemResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogCreateDraftItemResponseWrapper& operator=(PFCatalogCreateDraftItemResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCreateDraftItemResponseWrapper() = default; + + friend void swap(PFCatalogCreateDraftItemResponseWrapper& lhs, PFCatalogCreateDraftItemResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFCatalogUploadInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogUploadInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogUploadInfoWrapper() = default; + + PFCatalogUploadInfoWrapper(const PFCatalogUploadInfo& model) : + ModelWrapper{ model }, + m_fileName{ SafeString(model.fileName) } + { + SetModelPointers(); + } + + PFCatalogUploadInfoWrapper(const PFCatalogUploadInfoWrapper& src) : + PFCatalogUploadInfoWrapper{ src.Model() } + { + } + + PFCatalogUploadInfoWrapper(PFCatalogUploadInfoWrapper&& src) : + PFCatalogUploadInfoWrapper{} + { + swap(*this, src); + } + + PFCatalogUploadInfoWrapper& operator=(PFCatalogUploadInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogUploadInfoWrapper() = default; + + friend void swap(PFCatalogUploadInfoWrapper& lhs, PFCatalogUploadInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_fileName, rhs.m_fileName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFileName(String value) + { + m_fileName = std::move(value); + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + + String m_fileName; +}; + +template class Alloc = std::allocator> +class PFCatalogCreateUploadUrlsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCreateUploadUrlsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCreateUploadUrlsRequestWrapper() = default; + + PFCatalogCreateUploadUrlsRequestWrapper(const PFCatalogCreateUploadUrlsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_files{ model.files, model.files + model.filesCount } + { + SetModelPointers(); + } + + PFCatalogCreateUploadUrlsRequestWrapper(const PFCatalogCreateUploadUrlsRequestWrapper& src) : + PFCatalogCreateUploadUrlsRequestWrapper{ src.Model() } + { + } + + PFCatalogCreateUploadUrlsRequestWrapper(PFCatalogCreateUploadUrlsRequestWrapper&& src) : + PFCatalogCreateUploadUrlsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogCreateUploadUrlsRequestWrapper& operator=(PFCatalogCreateUploadUrlsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCreateUploadUrlsRequestWrapper() = default; + + friend void swap(PFCatalogCreateUploadUrlsRequestWrapper& lhs, PFCatalogCreateUploadUrlsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_files, rhs.m_files); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetFiles(ModelVector, Alloc> value) + { + m_files = std::move(value); + this->m_model.files = m_files.empty() ? nullptr : m_files.data(); + this->m_model.filesCount = static_cast(m_files.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.files = m_files.empty() ? nullptr : m_files.data(); + } + + StringDictionaryEntryVector m_customTags; + ModelVector, Alloc> m_files; +}; + +template class Alloc = std::allocator> +class PFCatalogUploadUrlMetadataWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogUploadUrlMetadata; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogUploadUrlMetadataWrapper() = default; + + PFCatalogUploadUrlMetadataWrapper(const PFCatalogUploadUrlMetadata& model) : + ModelWrapper{ model }, + m_fileName{ SafeString(model.fileName) }, + m_id{ SafeString(model.id) }, + m_url{ SafeString(model.url) } + { + SetModelPointers(); + } + + PFCatalogUploadUrlMetadataWrapper(const PFCatalogUploadUrlMetadataWrapper& src) : + PFCatalogUploadUrlMetadataWrapper{ src.Model() } + { + } + + PFCatalogUploadUrlMetadataWrapper(PFCatalogUploadUrlMetadataWrapper&& src) : + PFCatalogUploadUrlMetadataWrapper{} + { + swap(*this, src); + } + + PFCatalogUploadUrlMetadataWrapper& operator=(PFCatalogUploadUrlMetadataWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogUploadUrlMetadataWrapper() = default; + + friend void swap(PFCatalogUploadUrlMetadataWrapper& lhs, PFCatalogUploadUrlMetadataWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_fileName, rhs.m_fileName); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_url, rhs.m_url); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFileName(String value) + { + m_fileName = std::move(value); + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetUrl(String value) + { + m_url = std::move(value); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + +private: + void SetModelPointers() + { + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.url = m_url.empty() ? nullptr : m_url.data(); + } + + String m_fileName; + String m_id; + String m_url; +}; + +template class Alloc = std::allocator> +class PFCatalogCreateUploadUrlsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCreateUploadUrlsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCreateUploadUrlsResponseWrapper() = default; + + PFCatalogCreateUploadUrlsResponseWrapper(const PFCatalogCreateUploadUrlsResponse& model) : + ModelWrapper{ model }, + m_uploadUrls{ model.uploadUrls, model.uploadUrls + model.uploadUrlsCount } + { + SetModelPointers(); + } + + PFCatalogCreateUploadUrlsResponseWrapper(const PFCatalogCreateUploadUrlsResponseWrapper& src) : + PFCatalogCreateUploadUrlsResponseWrapper{ src.Model() } + { + } + + PFCatalogCreateUploadUrlsResponseWrapper(PFCatalogCreateUploadUrlsResponseWrapper&& src) : + PFCatalogCreateUploadUrlsResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogCreateUploadUrlsResponseWrapper& operator=(PFCatalogCreateUploadUrlsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCreateUploadUrlsResponseWrapper() = default; + + friend void swap(PFCatalogCreateUploadUrlsResponseWrapper& lhs, PFCatalogCreateUploadUrlsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_uploadUrls, rhs.m_uploadUrls); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetUploadUrls(ModelVector, Alloc> value) + { + m_uploadUrls = std::move(value); + this->m_model.uploadUrls = m_uploadUrls.empty() ? nullptr : m_uploadUrls.data(); + this->m_model.uploadUrlsCount = static_cast(m_uploadUrls.size()); + } + +private: + void SetModelPointers() + { + this->m_model.uploadUrls = m_uploadUrls.empty() ? nullptr : m_uploadUrls.data(); + } + + ModelVector, Alloc> m_uploadUrls; +}; + +template class Alloc = std::allocator> +class PFCatalogDeleteEntityItemReviewsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogDeleteEntityItemReviewsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogDeleteEntityItemReviewsRequestWrapper() = default; + + PFCatalogDeleteEntityItemReviewsRequestWrapper(const PFCatalogDeleteEntityItemReviewsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogDeleteEntityItemReviewsRequestWrapper(const PFCatalogDeleteEntityItemReviewsRequestWrapper& src) : + PFCatalogDeleteEntityItemReviewsRequestWrapper{ src.Model() } + { + } + + PFCatalogDeleteEntityItemReviewsRequestWrapper(PFCatalogDeleteEntityItemReviewsRequestWrapper&& src) : + PFCatalogDeleteEntityItemReviewsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogDeleteEntityItemReviewsRequestWrapper& operator=(PFCatalogDeleteEntityItemReviewsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogDeleteEntityItemReviewsRequestWrapper() = default; + + friend void swap(PFCatalogDeleteEntityItemReviewsRequestWrapper& lhs, PFCatalogDeleteEntityItemReviewsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFCatalogDeleteItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogDeleteItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogDeleteItemRequestWrapper() = default; + + PFCatalogDeleteItemRequestWrapper(const PFCatalogDeleteItemRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogDeleteItemRequestWrapper(const PFCatalogDeleteItemRequestWrapper& src) : + PFCatalogDeleteItemRequestWrapper{ src.Model() } + { + } + + PFCatalogDeleteItemRequestWrapper(PFCatalogDeleteItemRequestWrapper&& src) : + PFCatalogDeleteItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogDeleteItemRequestWrapper& operator=(PFCatalogDeleteItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogDeleteItemRequestWrapper() = default; + + friend void swap(PFCatalogDeleteItemRequestWrapper& lhs, PFCatalogDeleteItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogGetCatalogConfigRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetCatalogConfigRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetCatalogConfigRequestWrapper() = default; + + PFCatalogGetCatalogConfigRequestWrapper(const PFCatalogGetCatalogConfigRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFCatalogGetCatalogConfigRequestWrapper(const PFCatalogGetCatalogConfigRequestWrapper& src) : + PFCatalogGetCatalogConfigRequestWrapper{ src.Model() } + { + } + + PFCatalogGetCatalogConfigRequestWrapper(PFCatalogGetCatalogConfigRequestWrapper&& src) : + PFCatalogGetCatalogConfigRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetCatalogConfigRequestWrapper& operator=(PFCatalogGetCatalogConfigRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetCatalogConfigRequestWrapper() = default; + + friend void swap(PFCatalogGetCatalogConfigRequestWrapper& lhs, PFCatalogGetCatalogConfigRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogSpecificConfigWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogSpecificConfig; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogSpecificConfigWrapper() = default; + + PFCatalogCatalogSpecificConfigWrapper(const PFCatalogCatalogSpecificConfig& model) : + ModelWrapper{ model }, + m_contentTypes{ model.contentTypes, model.contentTypes + model.contentTypesCount }, + m_tags{ model.tags, model.tags + model.tagsCount } + { + SetModelPointers(); + } + + PFCatalogCatalogSpecificConfigWrapper(const PFCatalogCatalogSpecificConfigWrapper& src) : + PFCatalogCatalogSpecificConfigWrapper{ src.Model() } + { + } + + PFCatalogCatalogSpecificConfigWrapper(PFCatalogCatalogSpecificConfigWrapper&& src) : + PFCatalogCatalogSpecificConfigWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogSpecificConfigWrapper& operator=(PFCatalogCatalogSpecificConfigWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogSpecificConfigWrapper() = default; + + friend void swap(PFCatalogCatalogSpecificConfigWrapper& lhs, PFCatalogCatalogSpecificConfigWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_contentTypes, rhs.m_contentTypes); + swap(lhs.m_tags, rhs.m_tags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContentTypes(CStringVector value) + { + m_contentTypes = std::move(value); + this->m_model.contentTypes = m_contentTypes.empty() ? nullptr : m_contentTypes.data(); + this->m_model.contentTypesCount = static_cast(m_contentTypes.size()); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.contentTypes = m_contentTypes.empty() ? nullptr : m_contentTypes.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + } + + CStringVector m_contentTypes; + CStringVector m_tags; +}; + +template class Alloc = std::allocator> +class PFCatalogDeepLinkFormatWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogDeepLinkFormat; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogDeepLinkFormatWrapper() = default; + + PFCatalogDeepLinkFormatWrapper(const PFCatalogDeepLinkFormat& model) : + ModelWrapper{ model }, + m_format{ SafeString(model.format) }, + m_platform{ SafeString(model.platform) } + { + SetModelPointers(); + } + + PFCatalogDeepLinkFormatWrapper(const PFCatalogDeepLinkFormatWrapper& src) : + PFCatalogDeepLinkFormatWrapper{ src.Model() } + { + } + + PFCatalogDeepLinkFormatWrapper(PFCatalogDeepLinkFormatWrapper&& src) : + PFCatalogDeepLinkFormatWrapper{} + { + swap(*this, src); + } + + PFCatalogDeepLinkFormatWrapper& operator=(PFCatalogDeepLinkFormatWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogDeepLinkFormatWrapper() = default; + + friend void swap(PFCatalogDeepLinkFormatWrapper& lhs, PFCatalogDeepLinkFormatWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_format, rhs.m_format); + swap(lhs.m_platform, rhs.m_platform); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFormat(String value) + { + m_format = std::move(value); + this->m_model.format = m_format.empty() ? nullptr : m_format.data(); + } + + void SetPlatform(String value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + } + +private: + void SetModelPointers() + { + this->m_model.format = m_format.empty() ? nullptr : m_format.data(); + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + } + + String m_format; + String m_platform; +}; + +template class Alloc = std::allocator> +class PFCatalogDisplayPropertyIndexInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogDisplayPropertyIndexInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogDisplayPropertyIndexInfoWrapper() = default; + + PFCatalogDisplayPropertyIndexInfoWrapper(const PFCatalogDisplayPropertyIndexInfo& model) : + ModelWrapper{ model }, + m_name{ SafeString(model.name) }, + m_type{ model.type ? std::optional{ *model.type } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogDisplayPropertyIndexInfoWrapper(const PFCatalogDisplayPropertyIndexInfoWrapper& src) : + PFCatalogDisplayPropertyIndexInfoWrapper{ src.Model() } + { + } + + PFCatalogDisplayPropertyIndexInfoWrapper(PFCatalogDisplayPropertyIndexInfoWrapper&& src) : + PFCatalogDisplayPropertyIndexInfoWrapper{} + { + swap(*this, src); + } + + PFCatalogDisplayPropertyIndexInfoWrapper& operator=(PFCatalogDisplayPropertyIndexInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogDisplayPropertyIndexInfoWrapper() = default; + + friend void swap(PFCatalogDisplayPropertyIndexInfoWrapper& lhs, PFCatalogDisplayPropertyIndexInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_name, rhs.m_name); + swap(lhs.m_type, rhs.m_type); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetType(std::optional value) + { + m_type = std::move(value); + this->m_model.type = m_type ? m_type.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + this->m_model.type = m_type ? m_type.operator->() : nullptr; + } + + String m_name; + std::optional m_type; +}; + +template class Alloc = std::allocator> +class PFCatalogFileConfigWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogFileConfig; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogFileConfigWrapper() = default; + + PFCatalogFileConfigWrapper(const PFCatalogFileConfig& model) : + ModelWrapper{ model }, + m_contentTypes{ model.contentTypes, model.contentTypes + model.contentTypesCount }, + m_tags{ model.tags, model.tags + model.tagsCount } + { + SetModelPointers(); + } + + PFCatalogFileConfigWrapper(const PFCatalogFileConfigWrapper& src) : + PFCatalogFileConfigWrapper{ src.Model() } + { + } + + PFCatalogFileConfigWrapper(PFCatalogFileConfigWrapper&& src) : + PFCatalogFileConfigWrapper{} + { + swap(*this, src); + } + + PFCatalogFileConfigWrapper& operator=(PFCatalogFileConfigWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogFileConfigWrapper() = default; + + friend void swap(PFCatalogFileConfigWrapper& lhs, PFCatalogFileConfigWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_contentTypes, rhs.m_contentTypes); + swap(lhs.m_tags, rhs.m_tags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContentTypes(CStringVector value) + { + m_contentTypes = std::move(value); + this->m_model.contentTypes = m_contentTypes.empty() ? nullptr : m_contentTypes.data(); + this->m_model.contentTypesCount = static_cast(m_contentTypes.size()); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.contentTypes = m_contentTypes.empty() ? nullptr : m_contentTypes.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + } + + CStringVector m_contentTypes; + CStringVector m_tags; +}; + +template class Alloc = std::allocator> +class PFCatalogImageConfigWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogImageConfig; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogImageConfigWrapper() = default; + + PFCatalogImageConfigWrapper(const PFCatalogImageConfig& model) : + ModelWrapper{ model }, + m_tags{ model.tags, model.tags + model.tagsCount } + { + SetModelPointers(); + } + + PFCatalogImageConfigWrapper(const PFCatalogImageConfigWrapper& src) : + PFCatalogImageConfigWrapper{ src.Model() } + { + } + + PFCatalogImageConfigWrapper(PFCatalogImageConfigWrapper&& src) : + PFCatalogImageConfigWrapper{} + { + swap(*this, src); + } + + PFCatalogImageConfigWrapper& operator=(PFCatalogImageConfigWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogImageConfigWrapper() = default; + + friend void swap(PFCatalogImageConfigWrapper& lhs, PFCatalogImageConfigWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_tags, rhs.m_tags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + } + + CStringVector m_tags; +}; + +template class Alloc = std::allocator> +class PFCatalogUserGeneratedContentSpecificConfigWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogUserGeneratedContentSpecificConfig; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogUserGeneratedContentSpecificConfigWrapper() = default; + + PFCatalogUserGeneratedContentSpecificConfigWrapper(const PFCatalogUserGeneratedContentSpecificConfig& model) : + ModelWrapper{ model }, + m_contentTypes{ model.contentTypes, model.contentTypes + model.contentTypesCount }, + m_tags{ model.tags, model.tags + model.tagsCount } + { + SetModelPointers(); + } + + PFCatalogUserGeneratedContentSpecificConfigWrapper(const PFCatalogUserGeneratedContentSpecificConfigWrapper& src) : + PFCatalogUserGeneratedContentSpecificConfigWrapper{ src.Model() } + { + } + + PFCatalogUserGeneratedContentSpecificConfigWrapper(PFCatalogUserGeneratedContentSpecificConfigWrapper&& src) : + PFCatalogUserGeneratedContentSpecificConfigWrapper{} + { + swap(*this, src); + } + + PFCatalogUserGeneratedContentSpecificConfigWrapper& operator=(PFCatalogUserGeneratedContentSpecificConfigWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogUserGeneratedContentSpecificConfigWrapper() = default; + + friend void swap(PFCatalogUserGeneratedContentSpecificConfigWrapper& lhs, PFCatalogUserGeneratedContentSpecificConfigWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_contentTypes, rhs.m_contentTypes); + swap(lhs.m_tags, rhs.m_tags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContentTypes(CStringVector value) + { + m_contentTypes = std::move(value); + this->m_model.contentTypes = m_contentTypes.empty() ? nullptr : m_contentTypes.data(); + this->m_model.contentTypesCount = static_cast(m_contentTypes.size()); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.contentTypes = m_contentTypes.empty() ? nullptr : m_contentTypes.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + } + + CStringVector m_contentTypes; + CStringVector m_tags; +}; + +template class Alloc = std::allocator> +class PFCatalogCatalogConfigWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogCatalogConfig; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogCatalogConfigWrapper() = default; + + PFCatalogCatalogConfigWrapper(const PFCatalogCatalogConfig& model) : + ModelWrapper{ model }, + m_adminEntities{ model.adminEntities, model.adminEntities + model.adminEntitiesCount }, + m_catalog{ model.catalog ? std::optional>{ *model.catalog } : std::nullopt }, + m_deepLinkFormats{ model.deepLinkFormats, model.deepLinkFormats + model.deepLinkFormatsCount }, + m_displayPropertyIndexInfos{ model.displayPropertyIndexInfos, model.displayPropertyIndexInfos + model.displayPropertyIndexInfosCount }, + m_file{ model.file ? std::optional>{ *model.file } : std::nullopt }, + m_image{ model.image ? std::optional>{ *model.image } : std::nullopt }, + m_platforms{ model.platforms, model.platforms + model.platformsCount }, + m_reviewerEntities{ model.reviewerEntities, model.reviewerEntities + model.reviewerEntitiesCount }, + m_userGeneratedContent{ model.userGeneratedContent ? std::optional>{ *model.userGeneratedContent } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogCatalogConfigWrapper(const PFCatalogCatalogConfigWrapper& src) : + PFCatalogCatalogConfigWrapper{ src.Model() } + { + } + + PFCatalogCatalogConfigWrapper(PFCatalogCatalogConfigWrapper&& src) : + PFCatalogCatalogConfigWrapper{} + { + swap(*this, src); + } + + PFCatalogCatalogConfigWrapper& operator=(PFCatalogCatalogConfigWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogCatalogConfigWrapper() = default; + + friend void swap(PFCatalogCatalogConfigWrapper& lhs, PFCatalogCatalogConfigWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_adminEntities, rhs.m_adminEntities); + swap(lhs.m_catalog, rhs.m_catalog); + swap(lhs.m_deepLinkFormats, rhs.m_deepLinkFormats); + swap(lhs.m_displayPropertyIndexInfos, rhs.m_displayPropertyIndexInfos); + swap(lhs.m_file, rhs.m_file); + swap(lhs.m_image, rhs.m_image); + swap(lhs.m_platforms, rhs.m_platforms); + swap(lhs.m_reviewerEntities, rhs.m_reviewerEntities); + swap(lhs.m_userGeneratedContent, rhs.m_userGeneratedContent); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdminEntities(ModelVector, Alloc> value) + { + m_adminEntities = std::move(value); + this->m_model.adminEntities = m_adminEntities.empty() ? nullptr : m_adminEntities.data(); + this->m_model.adminEntitiesCount = static_cast(m_adminEntities.size()); + } + + void SetCatalog(std::optional> value) + { + m_catalog = std::move(value); + this->m_model.catalog = m_catalog ? &m_catalog->Model() : nullptr; + } + + void SetDeepLinkFormats(ModelVector, Alloc> value) + { + m_deepLinkFormats = std::move(value); + this->m_model.deepLinkFormats = m_deepLinkFormats.empty() ? nullptr : m_deepLinkFormats.data(); + this->m_model.deepLinkFormatsCount = static_cast(m_deepLinkFormats.size()); + } + + void SetDisplayPropertyIndexInfos(ModelVector, Alloc> value) + { + m_displayPropertyIndexInfos = std::move(value); + this->m_model.displayPropertyIndexInfos = m_displayPropertyIndexInfos.empty() ? nullptr : m_displayPropertyIndexInfos.data(); + this->m_model.displayPropertyIndexInfosCount = static_cast(m_displayPropertyIndexInfos.size()); + } + + void SetFile(std::optional> value) + { + m_file = std::move(value); + this->m_model.file = m_file ? &m_file->Model() : nullptr; + } + + void SetImage(std::optional> value) + { + m_image = std::move(value); + this->m_model.image = m_image ? &m_image->Model() : nullptr; + } + + void SetIsCatalogEnabled(bool value) + { + this->m_model.isCatalogEnabled = value; + } + + void SetPlatforms(CStringVector value) + { + m_platforms = std::move(value); + this->m_model.platforms = m_platforms.empty() ? nullptr : m_platforms.data(); + this->m_model.platformsCount = static_cast(m_platforms.size()); + } + + void SetReviewerEntities(ModelVector, Alloc> value) + { + m_reviewerEntities = std::move(value); + this->m_model.reviewerEntities = m_reviewerEntities.empty() ? nullptr : m_reviewerEntities.data(); + this->m_model.reviewerEntitiesCount = static_cast(m_reviewerEntities.size()); + } + + void SetUserGeneratedContent(std::optional> value) + { + m_userGeneratedContent = std::move(value); + this->m_model.userGeneratedContent = m_userGeneratedContent ? &m_userGeneratedContent->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.adminEntities = m_adminEntities.empty() ? nullptr : m_adminEntities.data(); + this->m_model.catalog = m_catalog ? &m_catalog->Model() : nullptr; + this->m_model.deepLinkFormats = m_deepLinkFormats.empty() ? nullptr : m_deepLinkFormats.data(); + this->m_model.displayPropertyIndexInfos = m_displayPropertyIndexInfos.empty() ? nullptr : m_displayPropertyIndexInfos.data(); + this->m_model.file = m_file ? &m_file->Model() : nullptr; + this->m_model.image = m_image ? &m_image->Model() : nullptr; + this->m_model.platforms = m_platforms.empty() ? nullptr : m_platforms.data(); + this->m_model.reviewerEntities = m_reviewerEntities.empty() ? nullptr : m_reviewerEntities.data(); + this->m_model.userGeneratedContent = m_userGeneratedContent ? &m_userGeneratedContent->Model() : nullptr; + } + + ModelVector, Alloc> m_adminEntities; + std::optional> m_catalog; + ModelVector, Alloc> m_deepLinkFormats; + ModelVector, Alloc> m_displayPropertyIndexInfos; + std::optional> m_file; + std::optional> m_image; + CStringVector m_platforms; + ModelVector, Alloc> m_reviewerEntities; + std::optional> m_userGeneratedContent; +}; + +template class Alloc = std::allocator> +class PFCatalogGetCatalogConfigResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetCatalogConfigResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetCatalogConfigResponseWrapper() = default; + + PFCatalogGetCatalogConfigResponseWrapper(const PFCatalogGetCatalogConfigResponse& model) : + ModelWrapper{ model }, + m_config{ model.config ? std::optional>{ *model.config } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogGetCatalogConfigResponseWrapper(const PFCatalogGetCatalogConfigResponseWrapper& src) : + PFCatalogGetCatalogConfigResponseWrapper{ src.Model() } + { + } + + PFCatalogGetCatalogConfigResponseWrapper(PFCatalogGetCatalogConfigResponseWrapper&& src) : + PFCatalogGetCatalogConfigResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetCatalogConfigResponseWrapper& operator=(PFCatalogGetCatalogConfigResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetCatalogConfigResponseWrapper() = default; + + friend void swap(PFCatalogGetCatalogConfigResponseWrapper& lhs, PFCatalogGetCatalogConfigResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_config, rhs.m_config); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConfig(std::optional> value) + { + m_config = std::move(value); + this->m_model.config = m_config ? &m_config->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.config = m_config ? &m_config->Model() : nullptr; + } + + std::optional> m_config; +}; + +template class Alloc = std::allocator> +class PFCatalogGetDraftItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetDraftItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetDraftItemRequestWrapper() = default; + + PFCatalogGetDraftItemRequestWrapper(const PFCatalogGetDraftItemRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogGetDraftItemRequestWrapper(const PFCatalogGetDraftItemRequestWrapper& src) : + PFCatalogGetDraftItemRequestWrapper{ src.Model() } + { + } + + PFCatalogGetDraftItemRequestWrapper(PFCatalogGetDraftItemRequestWrapper&& src) : + PFCatalogGetDraftItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetDraftItemRequestWrapper& operator=(PFCatalogGetDraftItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetDraftItemRequestWrapper() = default; + + friend void swap(PFCatalogGetDraftItemRequestWrapper& lhs, PFCatalogGetDraftItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogGetDraftItemResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetDraftItemResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetDraftItemResponseWrapper() = default; + + PFCatalogGetDraftItemResponseWrapper(const PFCatalogGetDraftItemResponse& model) : + ModelWrapper{ model }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogGetDraftItemResponseWrapper(const PFCatalogGetDraftItemResponseWrapper& src) : + PFCatalogGetDraftItemResponseWrapper{ src.Model() } + { + } + + PFCatalogGetDraftItemResponseWrapper(PFCatalogGetDraftItemResponseWrapper&& src) : + PFCatalogGetDraftItemResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetDraftItemResponseWrapper& operator=(PFCatalogGetDraftItemResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetDraftItemResponseWrapper() = default; + + friend void swap(PFCatalogGetDraftItemResponseWrapper& lhs, PFCatalogGetDraftItemResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFCatalogGetDraftItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetDraftItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetDraftItemsRequestWrapper() = default; + + PFCatalogGetDraftItemsRequestWrapper(const PFCatalogGetDraftItemsRequest& model) : + ModelWrapper{ model }, + m_alternateIds{ model.alternateIds, model.alternateIds + model.alternateIdsCount }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_ids{ model.ids, model.ids + model.idsCount } + { + SetModelPointers(); + } + + PFCatalogGetDraftItemsRequestWrapper(const PFCatalogGetDraftItemsRequestWrapper& src) : + PFCatalogGetDraftItemsRequestWrapper{ src.Model() } + { + } + + PFCatalogGetDraftItemsRequestWrapper(PFCatalogGetDraftItemsRequestWrapper&& src) : + PFCatalogGetDraftItemsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetDraftItemsRequestWrapper& operator=(PFCatalogGetDraftItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetDraftItemsRequestWrapper() = default; + + friend void swap(PFCatalogGetDraftItemsRequestWrapper& lhs, PFCatalogGetDraftItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateIds, rhs.m_alternateIds); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_ids, rhs.m_ids); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateIds(ModelVector, Alloc> value) + { + m_alternateIds = std::move(value); + this->m_model.alternateIds = m_alternateIds.empty() ? nullptr : m_alternateIds.data(); + this->m_model.alternateIdsCount = static_cast(m_alternateIds.size()); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetIds(CStringVector value) + { + m_ids = std::move(value); + this->m_model.ids = m_ids.empty() ? nullptr : m_ids.data(); + this->m_model.idsCount = static_cast(m_ids.size()); + } + +private: + void SetModelPointers() + { + this->m_model.alternateIds = m_alternateIds.empty() ? nullptr : m_alternateIds.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.ids = m_ids.empty() ? nullptr : m_ids.data(); + } + + ModelVector, Alloc> m_alternateIds; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + CStringVector m_ids; +}; + +template class Alloc = std::allocator> +class PFCatalogGetDraftItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetDraftItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetDraftItemsResponseWrapper() = default; + + PFCatalogGetDraftItemsResponseWrapper(const PFCatalogGetDraftItemsResponse& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_items{ model.items, model.items + model.itemsCount } + { + SetModelPointers(); + } + + PFCatalogGetDraftItemsResponseWrapper(const PFCatalogGetDraftItemsResponseWrapper& src) : + PFCatalogGetDraftItemsResponseWrapper{ src.Model() } + { + } + + PFCatalogGetDraftItemsResponseWrapper(PFCatalogGetDraftItemsResponseWrapper&& src) : + PFCatalogGetDraftItemsResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetDraftItemsResponseWrapper& operator=(PFCatalogGetDraftItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetDraftItemsResponseWrapper() = default; + + friend void swap(PFCatalogGetDraftItemsResponseWrapper& lhs, PFCatalogGetDraftItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_items, rhs.m_items); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetItems(ModelVector, Alloc> value) + { + m_items = std::move(value); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + this->m_model.itemsCount = static_cast(m_items.size()); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + } + + String m_continuationToken; + ModelVector, Alloc> m_items; +}; + +template class Alloc = std::allocator> +class PFCatalogGetEntityDraftItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetEntityDraftItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetEntityDraftItemsRequestWrapper() = default; + + PFCatalogGetEntityDraftItemsRequestWrapper(const PFCatalogGetEntityDraftItemsRequest& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_filter{ SafeString(model.filter) } + { + SetModelPointers(); + } + + PFCatalogGetEntityDraftItemsRequestWrapper(const PFCatalogGetEntityDraftItemsRequestWrapper& src) : + PFCatalogGetEntityDraftItemsRequestWrapper{ src.Model() } + { + } + + PFCatalogGetEntityDraftItemsRequestWrapper(PFCatalogGetEntityDraftItemsRequestWrapper&& src) : + PFCatalogGetEntityDraftItemsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetEntityDraftItemsRequestWrapper& operator=(PFCatalogGetEntityDraftItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetEntityDraftItemsRequestWrapper() = default; + + friend void swap(PFCatalogGetEntityDraftItemsRequestWrapper& lhs, PFCatalogGetEntityDraftItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_filter, rhs.m_filter); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCount(int32_t value) + { + this->m_model.count = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetFilter(String value) + { + m_filter = std::move(value); + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_filter; +}; + +template class Alloc = std::allocator> +class PFCatalogGetEntityDraftItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetEntityDraftItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetEntityDraftItemsResponseWrapper() = default; + + PFCatalogGetEntityDraftItemsResponseWrapper(const PFCatalogGetEntityDraftItemsResponse& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_items{ model.items, model.items + model.itemsCount } + { + SetModelPointers(); + } + + PFCatalogGetEntityDraftItemsResponseWrapper(const PFCatalogGetEntityDraftItemsResponseWrapper& src) : + PFCatalogGetEntityDraftItemsResponseWrapper{ src.Model() } + { + } + + PFCatalogGetEntityDraftItemsResponseWrapper(PFCatalogGetEntityDraftItemsResponseWrapper&& src) : + PFCatalogGetEntityDraftItemsResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetEntityDraftItemsResponseWrapper& operator=(PFCatalogGetEntityDraftItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetEntityDraftItemsResponseWrapper() = default; + + friend void swap(PFCatalogGetEntityDraftItemsResponseWrapper& lhs, PFCatalogGetEntityDraftItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_items, rhs.m_items); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetItems(ModelVector, Alloc> value) + { + m_items = std::move(value); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + this->m_model.itemsCount = static_cast(m_items.size()); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + } + + String m_continuationToken; + ModelVector, Alloc> m_items; +}; + +template class Alloc = std::allocator> +class PFCatalogGetEntityItemReviewRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetEntityItemReviewRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetEntityItemReviewRequestWrapper() = default; + + PFCatalogGetEntityItemReviewRequestWrapper(const PFCatalogGetEntityItemReviewRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogGetEntityItemReviewRequestWrapper(const PFCatalogGetEntityItemReviewRequestWrapper& src) : + PFCatalogGetEntityItemReviewRequestWrapper{ src.Model() } + { + } + + PFCatalogGetEntityItemReviewRequestWrapper(PFCatalogGetEntityItemReviewRequestWrapper&& src) : + PFCatalogGetEntityItemReviewRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetEntityItemReviewRequestWrapper& operator=(PFCatalogGetEntityItemReviewRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetEntityItemReviewRequestWrapper() = default; + + friend void swap(PFCatalogGetEntityItemReviewRequestWrapper& lhs, PFCatalogGetEntityItemReviewRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogReviewWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogReview; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogReviewWrapper() = default; + + PFCatalogReviewWrapper(const PFCatalogReview& model) : + ModelWrapper{ model }, + m_itemId{ SafeString(model.itemId) }, + m_itemVersion{ SafeString(model.itemVersion) }, + m_locale{ SafeString(model.locale) }, + m_reviewerEntity{ model.reviewerEntity ? std::optional>{ *model.reviewerEntity } : std::nullopt }, + m_reviewerId{ SafeString(model.reviewerId) }, + m_reviewId{ SafeString(model.reviewId) }, + m_reviewText{ SafeString(model.reviewText) }, + m_title{ SafeString(model.title) } + { + SetModelPointers(); + } + + PFCatalogReviewWrapper(const PFCatalogReviewWrapper& src) : + PFCatalogReviewWrapper{ src.Model() } + { + } + + PFCatalogReviewWrapper(PFCatalogReviewWrapper&& src) : + PFCatalogReviewWrapper{} + { + swap(*this, src); + } + + PFCatalogReviewWrapper& operator=(PFCatalogReviewWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogReviewWrapper() = default; + + friend void swap(PFCatalogReviewWrapper& lhs, PFCatalogReviewWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_itemVersion, rhs.m_itemVersion); + swap(lhs.m_locale, rhs.m_locale); + swap(lhs.m_reviewerEntity, rhs.m_reviewerEntity); + swap(lhs.m_reviewerId, rhs.m_reviewerId); + swap(lhs.m_reviewId, rhs.m_reviewId); + swap(lhs.m_reviewText, rhs.m_reviewText); + swap(lhs.m_title, rhs.m_title); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetHelpfulNegative(int32_t value) + { + this->m_model.helpfulNegative = value; + } + + void SetHelpfulPositive(int32_t value) + { + this->m_model.helpfulPositive = value; + } + + void SetIsInstalled(bool value) + { + this->m_model.isInstalled = value; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetItemVersion(String value) + { + m_itemVersion = std::move(value); + this->m_model.itemVersion = m_itemVersion.empty() ? nullptr : m_itemVersion.data(); + } + + void SetLocale(String value) + { + m_locale = std::move(value); + this->m_model.locale = m_locale.empty() ? nullptr : m_locale.data(); + } + + void SetRating(int32_t value) + { + this->m_model.rating = value; + } + + void SetReviewerEntity(std::optional> value) + { + m_reviewerEntity = std::move(value); + this->m_model.reviewerEntity = m_reviewerEntity ? &m_reviewerEntity->Model() : nullptr; + } + + void SetReviewerId(String value) + { + m_reviewerId = std::move(value); + this->m_model.reviewerId = m_reviewerId.empty() ? nullptr : m_reviewerId.data(); + } + + void SetReviewId(String value) + { + m_reviewId = std::move(value); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + } + + void SetReviewText(String value) + { + m_reviewText = std::move(value); + this->m_model.reviewText = m_reviewText.empty() ? nullptr : m_reviewText.data(); + } + + void SetSubmitted(time_t value) + { + this->m_model.submitted = value; + } + + void SetTitle(String value) + { + m_title = std::move(value); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + } + +private: + void SetModelPointers() + { + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.itemVersion = m_itemVersion.empty() ? nullptr : m_itemVersion.data(); + this->m_model.locale = m_locale.empty() ? nullptr : m_locale.data(); + this->m_model.reviewerEntity = m_reviewerEntity ? &m_reviewerEntity->Model() : nullptr; + this->m_model.reviewerId = m_reviewerId.empty() ? nullptr : m_reviewerId.data(); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + this->m_model.reviewText = m_reviewText.empty() ? nullptr : m_reviewText.data(); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + } + + String m_itemId; + String m_itemVersion; + String m_locale; + std::optional> m_reviewerEntity; + String m_reviewerId; + String m_reviewId; + String m_reviewText; + String m_title; +}; + +template class Alloc = std::allocator> +class PFCatalogGetEntityItemReviewResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetEntityItemReviewResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetEntityItemReviewResponseWrapper() = default; + + PFCatalogGetEntityItemReviewResponseWrapper(const PFCatalogGetEntityItemReviewResponse& model) : + ModelWrapper{ model }, + m_review{ model.review ? std::optional>{ *model.review } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogGetEntityItemReviewResponseWrapper(const PFCatalogGetEntityItemReviewResponseWrapper& src) : + PFCatalogGetEntityItemReviewResponseWrapper{ src.Model() } + { + } + + PFCatalogGetEntityItemReviewResponseWrapper(PFCatalogGetEntityItemReviewResponseWrapper&& src) : + PFCatalogGetEntityItemReviewResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetEntityItemReviewResponseWrapper& operator=(PFCatalogGetEntityItemReviewResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetEntityItemReviewResponseWrapper() = default; + + friend void swap(PFCatalogGetEntityItemReviewResponseWrapper& lhs, PFCatalogGetEntityItemReviewResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_review, rhs.m_review); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetReview(std::optional> value) + { + m_review = std::move(value); + this->m_model.review = m_review ? &m_review->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.review = m_review ? &m_review->Model() : nullptr; + } + + std::optional> m_review; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemRequestWrapper() = default; + + PFCatalogGetItemRequestWrapper(const PFCatalogGetItemRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogGetItemRequestWrapper(const PFCatalogGetItemRequestWrapper& src) : + PFCatalogGetItemRequestWrapper{ src.Model() } + { + } + + PFCatalogGetItemRequestWrapper(PFCatalogGetItemRequestWrapper&& src) : + PFCatalogGetItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemRequestWrapper& operator=(PFCatalogGetItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemRequestWrapper() = default; + + friend void swap(PFCatalogGetItemRequestWrapper& lhs, PFCatalogGetItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemResponseWrapper() = default; + + PFCatalogGetItemResponseWrapper(const PFCatalogGetItemResponse& model) : + ModelWrapper{ model }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogGetItemResponseWrapper(const PFCatalogGetItemResponseWrapper& src) : + PFCatalogGetItemResponseWrapper{ src.Model() } + { + } + + PFCatalogGetItemResponseWrapper(PFCatalogGetItemResponseWrapper&& src) : + PFCatalogGetItemResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemResponseWrapper& operator=(PFCatalogGetItemResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemResponseWrapper() = default; + + friend void swap(PFCatalogGetItemResponseWrapper& lhs, PFCatalogGetItemResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemContainersRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemContainersRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemContainersRequestWrapper() = default; + + PFCatalogGetItemContainersRequestWrapper(const PFCatalogGetItemContainersRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogGetItemContainersRequestWrapper(const PFCatalogGetItemContainersRequestWrapper& src) : + PFCatalogGetItemContainersRequestWrapper{ src.Model() } + { + } + + PFCatalogGetItemContainersRequestWrapper(PFCatalogGetItemContainersRequestWrapper&& src) : + PFCatalogGetItemContainersRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemContainersRequestWrapper& operator=(PFCatalogGetItemContainersRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemContainersRequestWrapper() = default; + + friend void swap(PFCatalogGetItemContainersRequestWrapper& lhs, PFCatalogGetItemContainersRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCount(int32_t value) + { + this->m_model.count = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemContainersResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemContainersResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemContainersResponseWrapper() = default; + + PFCatalogGetItemContainersResponseWrapper(const PFCatalogGetItemContainersResponse& model) : + ModelWrapper{ model }, + m_containers{ model.containers, model.containers + model.containersCount }, + m_continuationToken{ SafeString(model.continuationToken) } + { + SetModelPointers(); + } + + PFCatalogGetItemContainersResponseWrapper(const PFCatalogGetItemContainersResponseWrapper& src) : + PFCatalogGetItemContainersResponseWrapper{ src.Model() } + { + } + + PFCatalogGetItemContainersResponseWrapper(PFCatalogGetItemContainersResponseWrapper&& src) : + PFCatalogGetItemContainersResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemContainersResponseWrapper& operator=(PFCatalogGetItemContainersResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemContainersResponseWrapper() = default; + + friend void swap(PFCatalogGetItemContainersResponseWrapper& lhs, PFCatalogGetItemContainersResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_containers, rhs.m_containers); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContainers(ModelVector, Alloc> value) + { + m_containers = std::move(value); + this->m_model.containers = m_containers.empty() ? nullptr : m_containers.data(); + this->m_model.containersCount = static_cast(m_containers.size()); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.containers = m_containers.empty() ? nullptr : m_containers.data(); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + ModelVector, Alloc> m_containers; + String m_continuationToken; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemModerationStateRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemModerationStateRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemModerationStateRequestWrapper() = default; + + PFCatalogGetItemModerationStateRequestWrapper(const PFCatalogGetItemModerationStateRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogGetItemModerationStateRequestWrapper(const PFCatalogGetItemModerationStateRequestWrapper& src) : + PFCatalogGetItemModerationStateRequestWrapper{ src.Model() } + { + } + + PFCatalogGetItemModerationStateRequestWrapper(PFCatalogGetItemModerationStateRequestWrapper&& src) : + PFCatalogGetItemModerationStateRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemModerationStateRequestWrapper& operator=(PFCatalogGetItemModerationStateRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemModerationStateRequestWrapper() = default; + + friend void swap(PFCatalogGetItemModerationStateRequestWrapper& lhs, PFCatalogGetItemModerationStateRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemModerationStateResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemModerationStateResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemModerationStateResponseWrapper() = default; + + PFCatalogGetItemModerationStateResponseWrapper(const PFCatalogGetItemModerationStateResponse& model) : + ModelWrapper{ model }, + m_state{ model.state ? std::optional>{ *model.state } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogGetItemModerationStateResponseWrapper(const PFCatalogGetItemModerationStateResponseWrapper& src) : + PFCatalogGetItemModerationStateResponseWrapper{ src.Model() } + { + } + + PFCatalogGetItemModerationStateResponseWrapper(PFCatalogGetItemModerationStateResponseWrapper&& src) : + PFCatalogGetItemModerationStateResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemModerationStateResponseWrapper& operator=(PFCatalogGetItemModerationStateResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemModerationStateResponseWrapper() = default; + + friend void swap(PFCatalogGetItemModerationStateResponseWrapper& lhs, PFCatalogGetItemModerationStateResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_state, rhs.m_state); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetState(std::optional> value) + { + m_state = std::move(value); + this->m_model.state = m_state ? &m_state->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.state = m_state ? &m_state->Model() : nullptr; + } + + std::optional> m_state; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemPublishStatusRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemPublishStatusRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemPublishStatusRequestWrapper() = default; + + PFCatalogGetItemPublishStatusRequestWrapper(const PFCatalogGetItemPublishStatusRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogGetItemPublishStatusRequestWrapper(const PFCatalogGetItemPublishStatusRequestWrapper& src) : + PFCatalogGetItemPublishStatusRequestWrapper{ src.Model() } + { + } + + PFCatalogGetItemPublishStatusRequestWrapper(PFCatalogGetItemPublishStatusRequestWrapper&& src) : + PFCatalogGetItemPublishStatusRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemPublishStatusRequestWrapper& operator=(PFCatalogGetItemPublishStatusRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemPublishStatusRequestWrapper() = default; + + friend void swap(PFCatalogGetItemPublishStatusRequestWrapper& lhs, PFCatalogGetItemPublishStatusRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemPublishStatusResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemPublishStatusResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemPublishStatusResponseWrapper() = default; + + PFCatalogGetItemPublishStatusResponseWrapper(const PFCatalogGetItemPublishStatusResponse& model) : + ModelWrapper{ model }, + m_result{ model.result ? std::optional{ *model.result } : std::nullopt }, + m_statusMessage{ SafeString(model.statusMessage) } + { + SetModelPointers(); + } + + PFCatalogGetItemPublishStatusResponseWrapper(const PFCatalogGetItemPublishStatusResponseWrapper& src) : + PFCatalogGetItemPublishStatusResponseWrapper{ src.Model() } + { + } + + PFCatalogGetItemPublishStatusResponseWrapper(PFCatalogGetItemPublishStatusResponseWrapper&& src) : + PFCatalogGetItemPublishStatusResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemPublishStatusResponseWrapper& operator=(PFCatalogGetItemPublishStatusResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemPublishStatusResponseWrapper() = default; + + friend void swap(PFCatalogGetItemPublishStatusResponseWrapper& lhs, PFCatalogGetItemPublishStatusResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_result, rhs.m_result); + swap(lhs.m_statusMessage, rhs.m_statusMessage); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetResult(std::optional value) + { + m_result = std::move(value); + this->m_model.result = m_result ? m_result.operator->() : nullptr; + } + + void SetStatusMessage(String value) + { + m_statusMessage = std::move(value); + this->m_model.statusMessage = m_statusMessage.empty() ? nullptr : m_statusMessage.data(); + } + +private: + void SetModelPointers() + { + this->m_model.result = m_result ? m_result.operator->() : nullptr; + this->m_model.statusMessage = m_statusMessage.empty() ? nullptr : m_statusMessage.data(); + } + + std::optional m_result; + String m_statusMessage; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemReviewsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemReviewsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemReviewsRequestWrapper() = default; + + PFCatalogGetItemReviewsRequestWrapper(const PFCatalogGetItemReviewsRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_id{ SafeString(model.id) }, + m_orderBy{ SafeString(model.orderBy) } + { + SetModelPointers(); + } + + PFCatalogGetItemReviewsRequestWrapper(const PFCatalogGetItemReviewsRequestWrapper& src) : + PFCatalogGetItemReviewsRequestWrapper{ src.Model() } + { + } + + PFCatalogGetItemReviewsRequestWrapper(PFCatalogGetItemReviewsRequestWrapper&& src) : + PFCatalogGetItemReviewsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemReviewsRequestWrapper& operator=(PFCatalogGetItemReviewsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemReviewsRequestWrapper() = default; + + friend void swap(PFCatalogGetItemReviewsRequestWrapper& lhs, PFCatalogGetItemReviewsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_orderBy, rhs.m_orderBy); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCount(int32_t value) + { + this->m_model.count = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetOrderBy(String value) + { + m_orderBy = std::move(value); + this->m_model.orderBy = m_orderBy.empty() ? nullptr : m_orderBy.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.orderBy = m_orderBy.empty() ? nullptr : m_orderBy.data(); + } + + std::optional> m_alternateId; + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + String m_id; + String m_orderBy; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemReviewsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemReviewsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemReviewsResponseWrapper() = default; + + PFCatalogGetItemReviewsResponseWrapper(const PFCatalogGetItemReviewsResponse& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_reviews{ model.reviews, model.reviews + model.reviewsCount } + { + SetModelPointers(); + } + + PFCatalogGetItemReviewsResponseWrapper(const PFCatalogGetItemReviewsResponseWrapper& src) : + PFCatalogGetItemReviewsResponseWrapper{ src.Model() } + { + } + + PFCatalogGetItemReviewsResponseWrapper(PFCatalogGetItemReviewsResponseWrapper&& src) : + PFCatalogGetItemReviewsResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemReviewsResponseWrapper& operator=(PFCatalogGetItemReviewsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemReviewsResponseWrapper() = default; + + friend void swap(PFCatalogGetItemReviewsResponseWrapper& lhs, PFCatalogGetItemReviewsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_reviews, rhs.m_reviews); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetReviews(ModelVector, Alloc> value) + { + m_reviews = std::move(value); + this->m_model.reviews = m_reviews.empty() ? nullptr : m_reviews.data(); + this->m_model.reviewsCount = static_cast(m_reviews.size()); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.reviews = m_reviews.empty() ? nullptr : m_reviews.data(); + } + + String m_continuationToken; + ModelVector, Alloc> m_reviews; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemReviewSummaryRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemReviewSummaryRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemReviewSummaryRequestWrapper() = default; + + PFCatalogGetItemReviewSummaryRequestWrapper(const PFCatalogGetItemReviewSummaryRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogGetItemReviewSummaryRequestWrapper(const PFCatalogGetItemReviewSummaryRequestWrapper& src) : + PFCatalogGetItemReviewSummaryRequestWrapper{ src.Model() } + { + } + + PFCatalogGetItemReviewSummaryRequestWrapper(PFCatalogGetItemReviewSummaryRequestWrapper&& src) : + PFCatalogGetItemReviewSummaryRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemReviewSummaryRequestWrapper& operator=(PFCatalogGetItemReviewSummaryRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemReviewSummaryRequestWrapper() = default; + + friend void swap(PFCatalogGetItemReviewSummaryRequestWrapper& lhs, PFCatalogGetItemReviewSummaryRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemReviewSummaryResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemReviewSummaryResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemReviewSummaryResponseWrapper() = default; + + PFCatalogGetItemReviewSummaryResponseWrapper(const PFCatalogGetItemReviewSummaryResponse& model) : + ModelWrapper{ model }, + m_leastFavorableReview{ model.leastFavorableReview ? std::optional>{ *model.leastFavorableReview } : std::nullopt }, + m_mostFavorableReview{ model.mostFavorableReview ? std::optional>{ *model.mostFavorableReview } : std::nullopt }, + m_rating{ model.rating ? std::optional>{ *model.rating } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogGetItemReviewSummaryResponseWrapper(const PFCatalogGetItemReviewSummaryResponseWrapper& src) : + PFCatalogGetItemReviewSummaryResponseWrapper{ src.Model() } + { + } + + PFCatalogGetItemReviewSummaryResponseWrapper(PFCatalogGetItemReviewSummaryResponseWrapper&& src) : + PFCatalogGetItemReviewSummaryResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemReviewSummaryResponseWrapper& operator=(PFCatalogGetItemReviewSummaryResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemReviewSummaryResponseWrapper() = default; + + friend void swap(PFCatalogGetItemReviewSummaryResponseWrapper& lhs, PFCatalogGetItemReviewSummaryResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_leastFavorableReview, rhs.m_leastFavorableReview); + swap(lhs.m_mostFavorableReview, rhs.m_mostFavorableReview); + swap(lhs.m_rating, rhs.m_rating); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetLeastFavorableReview(std::optional> value) + { + m_leastFavorableReview = std::move(value); + this->m_model.leastFavorableReview = m_leastFavorableReview ? &m_leastFavorableReview->Model() : nullptr; + } + + void SetMostFavorableReview(std::optional> value) + { + m_mostFavorableReview = std::move(value); + this->m_model.mostFavorableReview = m_mostFavorableReview ? &m_mostFavorableReview->Model() : nullptr; + } + + void SetRating(std::optional> value) + { + m_rating = std::move(value); + this->m_model.rating = m_rating ? &m_rating->Model() : nullptr; + } + + void SetReviewsCount(int32_t value) + { + this->m_model.reviewsCount = value; + } + +private: + void SetModelPointers() + { + this->m_model.leastFavorableReview = m_leastFavorableReview ? &m_leastFavorableReview->Model() : nullptr; + this->m_model.mostFavorableReview = m_mostFavorableReview ? &m_mostFavorableReview->Model() : nullptr; + this->m_model.rating = m_rating ? &m_rating->Model() : nullptr; + } + + std::optional> m_leastFavorableReview; + std::optional> m_mostFavorableReview; + std::optional> m_rating; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemsRequestWrapper() = default; + + PFCatalogGetItemsRequestWrapper(const PFCatalogGetItemsRequest& model) : + ModelWrapper{ model }, + m_alternateIds{ model.alternateIds, model.alternateIds + model.alternateIdsCount }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_ids{ model.ids, model.ids + model.idsCount } + { + SetModelPointers(); + } + + PFCatalogGetItemsRequestWrapper(const PFCatalogGetItemsRequestWrapper& src) : + PFCatalogGetItemsRequestWrapper{ src.Model() } + { + } + + PFCatalogGetItemsRequestWrapper(PFCatalogGetItemsRequestWrapper&& src) : + PFCatalogGetItemsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemsRequestWrapper& operator=(PFCatalogGetItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemsRequestWrapper() = default; + + friend void swap(PFCatalogGetItemsRequestWrapper& lhs, PFCatalogGetItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateIds, rhs.m_alternateIds); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_ids, rhs.m_ids); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateIds(ModelVector, Alloc> value) + { + m_alternateIds = std::move(value); + this->m_model.alternateIds = m_alternateIds.empty() ? nullptr : m_alternateIds.data(); + this->m_model.alternateIdsCount = static_cast(m_alternateIds.size()); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetIds(CStringVector value) + { + m_ids = std::move(value); + this->m_model.ids = m_ids.empty() ? nullptr : m_ids.data(); + this->m_model.idsCount = static_cast(m_ids.size()); + } + +private: + void SetModelPointers() + { + this->m_model.alternateIds = m_alternateIds.empty() ? nullptr : m_alternateIds.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.ids = m_ids.empty() ? nullptr : m_ids.data(); + } + + ModelVector, Alloc> m_alternateIds; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + CStringVector m_ids; +}; + +template class Alloc = std::allocator> +class PFCatalogGetItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogGetItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogGetItemsResponseWrapper() = default; + + PFCatalogGetItemsResponseWrapper(const PFCatalogGetItemsResponse& model) : + ModelWrapper{ model }, + m_items{ model.items, model.items + model.itemsCount } + { + SetModelPointers(); + } + + PFCatalogGetItemsResponseWrapper(const PFCatalogGetItemsResponseWrapper& src) : + PFCatalogGetItemsResponseWrapper{ src.Model() } + { + } + + PFCatalogGetItemsResponseWrapper(PFCatalogGetItemsResponseWrapper&& src) : + PFCatalogGetItemsResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogGetItemsResponseWrapper& operator=(PFCatalogGetItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogGetItemsResponseWrapper() = default; + + friend void swap(PFCatalogGetItemsResponseWrapper& lhs, PFCatalogGetItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_items, rhs.m_items); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetItems(ModelVector, Alloc> value) + { + m_items = std::move(value); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + this->m_model.itemsCount = static_cast(m_items.size()); + } + +private: + void SetModelPointers() + { + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + } + + ModelVector, Alloc> m_items; +}; + +template class Alloc = std::allocator> +class PFCatalogPublishDraftItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogPublishDraftItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogPublishDraftItemRequestWrapper() = default; + + PFCatalogPublishDraftItemRequestWrapper(const PFCatalogPublishDraftItemRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogPublishDraftItemRequestWrapper(const PFCatalogPublishDraftItemRequestWrapper& src) : + PFCatalogPublishDraftItemRequestWrapper{ src.Model() } + { + } + + PFCatalogPublishDraftItemRequestWrapper(PFCatalogPublishDraftItemRequestWrapper&& src) : + PFCatalogPublishDraftItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogPublishDraftItemRequestWrapper& operator=(PFCatalogPublishDraftItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogPublishDraftItemRequestWrapper() = default; + + friend void swap(PFCatalogPublishDraftItemRequestWrapper& lhs, PFCatalogPublishDraftItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_eTag; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogReportItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogReportItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogReportItemRequestWrapper() = default; + + PFCatalogReportItemRequestWrapper(const PFCatalogReportItemRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_concernCategory{ model.concernCategory ? std::optional{ *model.concernCategory } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) }, + m_reason{ SafeString(model.reason) } + { + SetModelPointers(); + } + + PFCatalogReportItemRequestWrapper(const PFCatalogReportItemRequestWrapper& src) : + PFCatalogReportItemRequestWrapper{ src.Model() } + { + } + + PFCatalogReportItemRequestWrapper(PFCatalogReportItemRequestWrapper&& src) : + PFCatalogReportItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogReportItemRequestWrapper& operator=(PFCatalogReportItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogReportItemRequestWrapper() = default; + + friend void swap(PFCatalogReportItemRequestWrapper& lhs, PFCatalogReportItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_concernCategory, rhs.m_concernCategory); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_reason, rhs.m_reason); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetConcernCategory(std::optional value) + { + m_concernCategory = std::move(value); + this->m_model.concernCategory = m_concernCategory ? m_concernCategory.operator->() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetReason(String value) + { + m_reason = std::move(value); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.concernCategory = m_concernCategory ? m_concernCategory.operator->() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + + std::optional> m_alternateId; + std::optional m_concernCategory; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; + String m_reason; +}; + +template class Alloc = std::allocator> +class PFCatalogReportItemReviewRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogReportItemReviewRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogReportItemReviewRequestWrapper() = default; + + PFCatalogReportItemReviewRequestWrapper(const PFCatalogReportItemReviewRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_concernCategory{ model.concernCategory ? std::optional{ *model.concernCategory } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_itemId{ SafeString(model.itemId) }, + m_reason{ SafeString(model.reason) }, + m_reviewId{ SafeString(model.reviewId) } + { + SetModelPointers(); + } + + PFCatalogReportItemReviewRequestWrapper(const PFCatalogReportItemReviewRequestWrapper& src) : + PFCatalogReportItemReviewRequestWrapper{ src.Model() } + { + } + + PFCatalogReportItemReviewRequestWrapper(PFCatalogReportItemReviewRequestWrapper&& src) : + PFCatalogReportItemReviewRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogReportItemReviewRequestWrapper& operator=(PFCatalogReportItemReviewRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogReportItemReviewRequestWrapper() = default; + + friend void swap(PFCatalogReportItemReviewRequestWrapper& lhs, PFCatalogReportItemReviewRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_concernCategory, rhs.m_concernCategory); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_reason, rhs.m_reason); + swap(lhs.m_reviewId, rhs.m_reviewId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetConcernCategory(std::optional value) + { + m_concernCategory = std::move(value); + this->m_model.concernCategory = m_concernCategory ? m_concernCategory.operator->() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetReason(String value) + { + m_reason = std::move(value); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + + void SetReviewId(String value) + { + m_reviewId = std::move(value); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.concernCategory = m_concernCategory ? m_concernCategory.operator->() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + } + + std::optional> m_alternateId; + std::optional m_concernCategory; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_itemId; + String m_reason; + String m_reviewId; +}; + +template class Alloc = std::allocator> +class PFCatalogReviewItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogReviewItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogReviewItemRequestWrapper() = default; + + PFCatalogReviewItemRequestWrapper(const PFCatalogReviewItemRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_id{ SafeString(model.id) }, + m_review{ model.review ? std::optional>{ *model.review } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogReviewItemRequestWrapper(const PFCatalogReviewItemRequestWrapper& src) : + PFCatalogReviewItemRequestWrapper{ src.Model() } + { + } + + PFCatalogReviewItemRequestWrapper(PFCatalogReviewItemRequestWrapper&& src) : + PFCatalogReviewItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogReviewItemRequestWrapper& operator=(PFCatalogReviewItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogReviewItemRequestWrapper() = default; + + friend void swap(PFCatalogReviewItemRequestWrapper& lhs, PFCatalogReviewItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_review, rhs.m_review); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetReview(std::optional> value) + { + m_review = std::move(value); + this->m_model.review = m_review ? &m_review->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.review = m_review ? &m_review->Model() : nullptr; + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_id; + std::optional> m_review; +}; + +template class Alloc = std::allocator> +class PFCatalogStoreReferenceWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogStoreReference; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogStoreReferenceWrapper() = default; + + PFCatalogStoreReferenceWrapper(const PFCatalogStoreReference& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_id{ SafeString(model.id) } + { + SetModelPointers(); + } + + PFCatalogStoreReferenceWrapper(const PFCatalogStoreReferenceWrapper& src) : + PFCatalogStoreReferenceWrapper{ src.Model() } + { + } + + PFCatalogStoreReferenceWrapper(PFCatalogStoreReferenceWrapper&& src) : + PFCatalogStoreReferenceWrapper{} + { + swap(*this, src); + } + + PFCatalogStoreReferenceWrapper& operator=(PFCatalogStoreReferenceWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogStoreReferenceWrapper() = default; + + friend void swap(PFCatalogStoreReferenceWrapper& lhs, PFCatalogStoreReferenceWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_id, rhs.m_id); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + std::optional> m_alternateId; + String m_id; +}; + +template class Alloc = std::allocator> +class PFCatalogSearchItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogSearchItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogSearchItemsRequestWrapper() = default; + + PFCatalogSearchItemsRequestWrapper(const PFCatalogSearchItemsRequest& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_filter{ SafeString(model.filter) }, + m_language{ SafeString(model.language) }, + m_orderBy{ SafeString(model.orderBy) }, + m_search{ SafeString(model.search) }, + m_select{ SafeString(model.select) }, + m_store{ model.store ? std::optional>{ *model.store } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogSearchItemsRequestWrapper(const PFCatalogSearchItemsRequestWrapper& src) : + PFCatalogSearchItemsRequestWrapper{ src.Model() } + { + } + + PFCatalogSearchItemsRequestWrapper(PFCatalogSearchItemsRequestWrapper&& src) : + PFCatalogSearchItemsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogSearchItemsRequestWrapper& operator=(PFCatalogSearchItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogSearchItemsRequestWrapper() = default; + + friend void swap(PFCatalogSearchItemsRequestWrapper& lhs, PFCatalogSearchItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_filter, rhs.m_filter); + swap(lhs.m_language, rhs.m_language); + swap(lhs.m_orderBy, rhs.m_orderBy); + swap(lhs.m_search, rhs.m_search); + swap(lhs.m_select, rhs.m_select); + swap(lhs.m_store, rhs.m_store); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCount(int32_t value) + { + this->m_model.count = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetFilter(String value) + { + m_filter = std::move(value); + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + + void SetLanguage(String value) + { + m_language = std::move(value); + this->m_model.language = m_language.empty() ? nullptr : m_language.data(); + } + + void SetOrderBy(String value) + { + m_orderBy = std::move(value); + this->m_model.orderBy = m_orderBy.empty() ? nullptr : m_orderBy.data(); + } + + void SetSearch(String value) + { + m_search = std::move(value); + this->m_model.search = m_search.empty() ? nullptr : m_search.data(); + } + + void SetSelect(String value) + { + m_select = std::move(value); + this->m_model.select = m_select.empty() ? nullptr : m_select.data(); + } + + void SetStore(std::optional> value) + { + m_store = std::move(value); + this->m_model.store = m_store ? &m_store->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + this->m_model.language = m_language.empty() ? nullptr : m_language.data(); + this->m_model.orderBy = m_orderBy.empty() ? nullptr : m_orderBy.data(); + this->m_model.search = m_search.empty() ? nullptr : m_search.data(); + this->m_model.select = m_select.empty() ? nullptr : m_select.data(); + this->m_model.store = m_store ? &m_store->Model() : nullptr; + } + + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_filter; + String m_language; + String m_orderBy; + String m_search; + String m_select; + std::optional> m_store; +}; + +template class Alloc = std::allocator> +class PFCatalogSearchItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogSearchItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogSearchItemsResponseWrapper() = default; + + PFCatalogSearchItemsResponseWrapper(const PFCatalogSearchItemsResponse& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_items{ model.items, model.items + model.itemsCount } + { + SetModelPointers(); + } + + PFCatalogSearchItemsResponseWrapper(const PFCatalogSearchItemsResponseWrapper& src) : + PFCatalogSearchItemsResponseWrapper{ src.Model() } + { + } + + PFCatalogSearchItemsResponseWrapper(PFCatalogSearchItemsResponseWrapper&& src) : + PFCatalogSearchItemsResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogSearchItemsResponseWrapper& operator=(PFCatalogSearchItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogSearchItemsResponseWrapper() = default; + + friend void swap(PFCatalogSearchItemsResponseWrapper& lhs, PFCatalogSearchItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_items, rhs.m_items); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetItems(ModelVector, Alloc> value) + { + m_items = std::move(value); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + this->m_model.itemsCount = static_cast(m_items.size()); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + } + + String m_continuationToken; + ModelVector, Alloc> m_items; +}; + +template class Alloc = std::allocator> +class PFCatalogSetItemModerationStateRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogSetItemModerationStateRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogSetItemModerationStateRequestWrapper() = default; + + PFCatalogSetItemModerationStateRequestWrapper(const PFCatalogSetItemModerationStateRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_id{ SafeString(model.id) }, + m_reason{ SafeString(model.reason) }, + m_status{ model.status ? std::optional{ *model.status } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogSetItemModerationStateRequestWrapper(const PFCatalogSetItemModerationStateRequestWrapper& src) : + PFCatalogSetItemModerationStateRequestWrapper{ src.Model() } + { + } + + PFCatalogSetItemModerationStateRequestWrapper(PFCatalogSetItemModerationStateRequestWrapper&& src) : + PFCatalogSetItemModerationStateRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogSetItemModerationStateRequestWrapper& operator=(PFCatalogSetItemModerationStateRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogSetItemModerationStateRequestWrapper() = default; + + friend void swap(PFCatalogSetItemModerationStateRequestWrapper& lhs, PFCatalogSetItemModerationStateRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_reason, rhs.m_reason); + swap(lhs.m_status, rhs.m_status); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetReason(String value) + { + m_reason = std::move(value); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + } + + void SetStatus(std::optional value) + { + m_status = std::move(value); + this->m_model.status = m_status ? m_status.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.reason = m_reason.empty() ? nullptr : m_reason.data(); + this->m_model.status = m_status ? m_status.operator->() : nullptr; + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + String m_id; + String m_reason; + std::optional m_status; +}; + +template class Alloc = std::allocator> +class PFCatalogSubmitItemReviewVoteRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogSubmitItemReviewVoteRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogSubmitItemReviewVoteRequestWrapper() = default; + + PFCatalogSubmitItemReviewVoteRequestWrapper(const PFCatalogSubmitItemReviewVoteRequest& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_itemId{ SafeString(model.itemId) }, + m_reviewId{ SafeString(model.reviewId) }, + m_vote{ model.vote ? std::optional{ *model.vote } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogSubmitItemReviewVoteRequestWrapper(const PFCatalogSubmitItemReviewVoteRequestWrapper& src) : + PFCatalogSubmitItemReviewVoteRequestWrapper{ src.Model() } + { + } + + PFCatalogSubmitItemReviewVoteRequestWrapper(PFCatalogSubmitItemReviewVoteRequestWrapper&& src) : + PFCatalogSubmitItemReviewVoteRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogSubmitItemReviewVoteRequestWrapper& operator=(PFCatalogSubmitItemReviewVoteRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogSubmitItemReviewVoteRequestWrapper() = default; + + friend void swap(PFCatalogSubmitItemReviewVoteRequestWrapper& lhs, PFCatalogSubmitItemReviewVoteRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_reviewId, rhs.m_reviewId); + swap(lhs.m_vote, rhs.m_vote); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetReviewId(String value) + { + m_reviewId = std::move(value); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + } + + void SetVote(std::optional value) + { + m_vote = std::move(value); + this->m_model.vote = m_vote ? m_vote.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + this->m_model.vote = m_vote ? m_vote.operator->() : nullptr; + } + + std::optional> m_alternateId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_itemId; + String m_reviewId; + std::optional m_vote; +}; + +template class Alloc = std::allocator> +class PFCatalogReviewTakedownWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogReviewTakedown; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogReviewTakedownWrapper() = default; + + PFCatalogReviewTakedownWrapper(const PFCatalogReviewTakedown& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_itemId{ SafeString(model.itemId) }, + m_reviewId{ SafeString(model.reviewId) } + { + SetModelPointers(); + } + + PFCatalogReviewTakedownWrapper(const PFCatalogReviewTakedownWrapper& src) : + PFCatalogReviewTakedownWrapper{ src.Model() } + { + } + + PFCatalogReviewTakedownWrapper(PFCatalogReviewTakedownWrapper&& src) : + PFCatalogReviewTakedownWrapper{} + { + swap(*this, src); + } + + PFCatalogReviewTakedownWrapper& operator=(PFCatalogReviewTakedownWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogReviewTakedownWrapper() = default; + + friend void swap(PFCatalogReviewTakedownWrapper& lhs, PFCatalogReviewTakedownWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_reviewId, rhs.m_reviewId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetReviewId(String value) + { + m_reviewId = std::move(value); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.reviewId = m_reviewId.empty() ? nullptr : m_reviewId.data(); + } + + std::optional> m_alternateId; + String m_itemId; + String m_reviewId; +}; + +template class Alloc = std::allocator> +class PFCatalogTakedownItemReviewsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogTakedownItemReviewsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogTakedownItemReviewsRequestWrapper() = default; + + PFCatalogTakedownItemReviewsRequestWrapper(const PFCatalogTakedownItemReviewsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_reviews{ model.reviews, model.reviews + model.reviewsCount } + { + SetModelPointers(); + } + + PFCatalogTakedownItemReviewsRequestWrapper(const PFCatalogTakedownItemReviewsRequestWrapper& src) : + PFCatalogTakedownItemReviewsRequestWrapper{ src.Model() } + { + } + + PFCatalogTakedownItemReviewsRequestWrapper(PFCatalogTakedownItemReviewsRequestWrapper&& src) : + PFCatalogTakedownItemReviewsRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogTakedownItemReviewsRequestWrapper& operator=(PFCatalogTakedownItemReviewsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogTakedownItemReviewsRequestWrapper() = default; + + friend void swap(PFCatalogTakedownItemReviewsRequestWrapper& lhs, PFCatalogTakedownItemReviewsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_reviews, rhs.m_reviews); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetReviews(ModelVector, Alloc> value) + { + m_reviews = std::move(value); + this->m_model.reviews = m_reviews.empty() ? nullptr : m_reviews.data(); + this->m_model.reviewsCount = static_cast(m_reviews.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.reviews = m_reviews.empty() ? nullptr : m_reviews.data(); + } + + StringDictionaryEntryVector m_customTags; + ModelVector, Alloc> m_reviews; +}; + +template class Alloc = std::allocator> +class PFCatalogUpdateCatalogConfigRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogUpdateCatalogConfigRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogUpdateCatalogConfigRequestWrapper() = default; + + PFCatalogUpdateCatalogConfigRequestWrapper(const PFCatalogUpdateCatalogConfigRequest& model) : + ModelWrapper{ model }, + m_config{ model.config ? std::optional>{ *model.config } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFCatalogUpdateCatalogConfigRequestWrapper(const PFCatalogUpdateCatalogConfigRequestWrapper& src) : + PFCatalogUpdateCatalogConfigRequestWrapper{ src.Model() } + { + } + + PFCatalogUpdateCatalogConfigRequestWrapper(PFCatalogUpdateCatalogConfigRequestWrapper&& src) : + PFCatalogUpdateCatalogConfigRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogUpdateCatalogConfigRequestWrapper& operator=(PFCatalogUpdateCatalogConfigRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogUpdateCatalogConfigRequestWrapper() = default; + + friend void swap(PFCatalogUpdateCatalogConfigRequestWrapper& lhs, PFCatalogUpdateCatalogConfigRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_config, rhs.m_config); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConfig(std::optional> value) + { + m_config = std::move(value); + this->m_model.config = m_config ? &m_config->Model() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.config = m_config ? &m_config->Model() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + std::optional> m_config; + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFCatalogUpdateDraftItemRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogUpdateDraftItemRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogUpdateDraftItemRequestWrapper() = default; + + PFCatalogUpdateDraftItemRequestWrapper(const PFCatalogUpdateDraftItemRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogUpdateDraftItemRequestWrapper(const PFCatalogUpdateDraftItemRequestWrapper& src) : + PFCatalogUpdateDraftItemRequestWrapper{ src.Model() } + { + } + + PFCatalogUpdateDraftItemRequestWrapper(PFCatalogUpdateDraftItemRequestWrapper&& src) : + PFCatalogUpdateDraftItemRequestWrapper{} + { + swap(*this, src); + } + + PFCatalogUpdateDraftItemRequestWrapper& operator=(PFCatalogUpdateDraftItemRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogUpdateDraftItemRequestWrapper() = default; + + friend void swap(PFCatalogUpdateDraftItemRequestWrapper& lhs, PFCatalogUpdateDraftItemRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + void SetPublish(bool value) + { + this->m_model.publish = value; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFCatalogUpdateDraftItemResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFCatalogUpdateDraftItemResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCatalogUpdateDraftItemResponseWrapper() = default; + + PFCatalogUpdateDraftItemResponseWrapper(const PFCatalogUpdateDraftItemResponse& model) : + ModelWrapper{ model }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFCatalogUpdateDraftItemResponseWrapper(const PFCatalogUpdateDraftItemResponseWrapper& src) : + PFCatalogUpdateDraftItemResponseWrapper{ src.Model() } + { + } + + PFCatalogUpdateDraftItemResponseWrapper(PFCatalogUpdateDraftItemResponseWrapper&& src) : + PFCatalogUpdateDraftItemResponseWrapper{} + { + swap(*this, src); + } + + PFCatalogUpdateDraftItemResponseWrapper& operator=(PFCatalogUpdateDraftItemResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCatalogUpdateDraftItemResponseWrapper() = default; + + friend void swap(PFCatalogUpdateDraftItemResponseWrapper& lhs, PFCatalogUpdateDraftItemResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional> m_item; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CharacterTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CharacterTypeWrappers.h new file mode 100644 index 0000000..f26d839 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CharacterTypeWrappers.h @@ -0,0 +1,1030 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFCharacterListUsersCharactersRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterListUsersCharactersRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterListUsersCharactersRequestWrapper() = default; + + PFCharacterListUsersCharactersRequestWrapper(const PFCharacterListUsersCharactersRequest& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFCharacterListUsersCharactersRequestWrapper(const PFCharacterListUsersCharactersRequestWrapper& src) : + PFCharacterListUsersCharactersRequestWrapper{ src.Model() } + { + } + + PFCharacterListUsersCharactersRequestWrapper(PFCharacterListUsersCharactersRequestWrapper&& src) : + PFCharacterListUsersCharactersRequestWrapper{} + { + swap(*this, src); + } + + PFCharacterListUsersCharactersRequestWrapper& operator=(PFCharacterListUsersCharactersRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterListUsersCharactersRequestWrapper() = default; + + friend void swap(PFCharacterListUsersCharactersRequestWrapper& lhs, PFCharacterListUsersCharactersRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFCharacterListUsersCharactersResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterListUsersCharactersResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterListUsersCharactersResultWrapper() = default; + + PFCharacterListUsersCharactersResultWrapper(const PFCharacterListUsersCharactersResult& model) : + ModelWrapper{ model }, + m_characters{ model.characters, model.characters + model.charactersCount } + { + SetModelPointers(); + } + + PFCharacterListUsersCharactersResultWrapper(const PFCharacterListUsersCharactersResultWrapper& src) : + PFCharacterListUsersCharactersResultWrapper{ src.Model() } + { + } + + PFCharacterListUsersCharactersResultWrapper(PFCharacterListUsersCharactersResultWrapper&& src) : + PFCharacterListUsersCharactersResultWrapper{} + { + swap(*this, src); + } + + PFCharacterListUsersCharactersResultWrapper& operator=(PFCharacterListUsersCharactersResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterListUsersCharactersResultWrapper() = default; + + friend void swap(PFCharacterListUsersCharactersResultWrapper& lhs, PFCharacterListUsersCharactersResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characters, rhs.m_characters); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacters(ModelVector, Alloc> value) + { + m_characters = std::move(value); + this->m_model.characters = m_characters.empty() ? nullptr : m_characters.data(); + this->m_model.charactersCount = static_cast(m_characters.size()); + } + +private: + void SetModelPointers() + { + this->m_model.characters = m_characters.empty() ? nullptr : m_characters.data(); + } + + ModelVector, Alloc> m_characters; +}; + +template class Alloc = std::allocator> +class PFCharacterGetCharacterDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterGetCharacterDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterGetCharacterDataRequestWrapper() = default; + + PFCharacterGetCharacterDataRequestWrapper(const PFCharacterGetCharacterDataRequest& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_ifChangedFromDataVersion{ model.ifChangedFromDataVersion ? std::optional{ *model.ifChangedFromDataVersion } : std::nullopt }, + m_keys{ model.keys, model.keys + model.keysCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFCharacterGetCharacterDataRequestWrapper(const PFCharacterGetCharacterDataRequestWrapper& src) : + PFCharacterGetCharacterDataRequestWrapper{ src.Model() } + { + } + + PFCharacterGetCharacterDataRequestWrapper(PFCharacterGetCharacterDataRequestWrapper&& src) : + PFCharacterGetCharacterDataRequestWrapper{} + { + swap(*this, src); + } + + PFCharacterGetCharacterDataRequestWrapper& operator=(PFCharacterGetCharacterDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterGetCharacterDataRequestWrapper() = default; + + friend void swap(PFCharacterGetCharacterDataRequestWrapper& lhs, PFCharacterGetCharacterDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_ifChangedFromDataVersion, rhs.m_ifChangedFromDataVersion); + swap(lhs.m_keys, rhs.m_keys); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetIfChangedFromDataVersion(std::optional value) + { + m_ifChangedFromDataVersion = std::move(value); + this->m_model.ifChangedFromDataVersion = m_ifChangedFromDataVersion ? m_ifChangedFromDataVersion.operator->() : nullptr; + } + + void SetKeys(CStringVector value) + { + m_keys = std::move(value); + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + this->m_model.keysCount = static_cast(m_keys.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.ifChangedFromDataVersion = m_ifChangedFromDataVersion ? m_ifChangedFromDataVersion.operator->() : nullptr; + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_characterId; + std::optional m_ifChangedFromDataVersion; + CStringVector m_keys; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFCharacterClientGetCharacterDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterClientGetCharacterDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterClientGetCharacterDataResultWrapper() = default; + + PFCharacterClientGetCharacterDataResultWrapper(const PFCharacterClientGetCharacterDataResult& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFCharacterClientGetCharacterDataResultWrapper(const PFCharacterClientGetCharacterDataResultWrapper& src) : + PFCharacterClientGetCharacterDataResultWrapper{ src.Model() } + { + } + + PFCharacterClientGetCharacterDataResultWrapper(PFCharacterClientGetCharacterDataResultWrapper&& src) : + PFCharacterClientGetCharacterDataResultWrapper{} + { + swap(*this, src); + } + + PFCharacterClientGetCharacterDataResultWrapper& operator=(PFCharacterClientGetCharacterDataResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterClientGetCharacterDataResultWrapper() = default; + + friend void swap(PFCharacterClientGetCharacterDataResultWrapper& lhs, PFCharacterClientGetCharacterDataResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetData(ModelDictionaryEntryVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetDataVersion(uint32_t value) + { + this->m_model.dataVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + String m_characterId; + ModelDictionaryEntryVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFCharacterClientGrantCharacterToUserRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterClientGrantCharacterToUserRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterClientGrantCharacterToUserRequestWrapper() = default; + + PFCharacterClientGrantCharacterToUserRequestWrapper(const PFCharacterClientGrantCharacterToUserRequest& model) : + ModelWrapper{ model }, + m_catalogVersion{ SafeString(model.catalogVersion) }, + m_characterName{ SafeString(model.characterName) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_itemId{ SafeString(model.itemId) } + { + SetModelPointers(); + } + + PFCharacterClientGrantCharacterToUserRequestWrapper(const PFCharacterClientGrantCharacterToUserRequestWrapper& src) : + PFCharacterClientGrantCharacterToUserRequestWrapper{ src.Model() } + { + } + + PFCharacterClientGrantCharacterToUserRequestWrapper(PFCharacterClientGrantCharacterToUserRequestWrapper&& src) : + PFCharacterClientGrantCharacterToUserRequestWrapper{} + { + swap(*this, src); + } + + PFCharacterClientGrantCharacterToUserRequestWrapper& operator=(PFCharacterClientGrantCharacterToUserRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterClientGrantCharacterToUserRequestWrapper() = default; + + friend void swap(PFCharacterClientGrantCharacterToUserRequestWrapper& lhs, PFCharacterClientGrantCharacterToUserRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_catalogVersion, rhs.m_catalogVersion); + swap(lhs.m_characterName, rhs.m_characterName); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_itemId, rhs.m_itemId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCatalogVersion(String value) + { + m_catalogVersion = std::move(value); + this->m_model.catalogVersion = m_catalogVersion.empty() ? nullptr : m_catalogVersion.data(); + } + + void SetCharacterName(String value) + { + m_characterName = std::move(value); + this->m_model.characterName = m_characterName.empty() ? nullptr : m_characterName.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.catalogVersion = m_catalogVersion.empty() ? nullptr : m_catalogVersion.data(); + this->m_model.characterName = m_characterName.empty() ? nullptr : m_characterName.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + String m_catalogVersion; + String m_characterName; + StringDictionaryEntryVector m_customTags; + String m_itemId; +}; + +template class Alloc = std::allocator> +class PFCharacterClientGrantCharacterToUserResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterClientGrantCharacterToUserResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterClientGrantCharacterToUserResultWrapper() = default; + + PFCharacterClientGrantCharacterToUserResultWrapper(const PFCharacterClientGrantCharacterToUserResult& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_characterType{ SafeString(model.characterType) } + { + SetModelPointers(); + } + + PFCharacterClientGrantCharacterToUserResultWrapper(const PFCharacterClientGrantCharacterToUserResultWrapper& src) : + PFCharacterClientGrantCharacterToUserResultWrapper{ src.Model() } + { + } + + PFCharacterClientGrantCharacterToUserResultWrapper(PFCharacterClientGrantCharacterToUserResultWrapper&& src) : + PFCharacterClientGrantCharacterToUserResultWrapper{} + { + swap(*this, src); + } + + PFCharacterClientGrantCharacterToUserResultWrapper& operator=(PFCharacterClientGrantCharacterToUserResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterClientGrantCharacterToUserResultWrapper() = default; + + friend void swap(PFCharacterClientGrantCharacterToUserResultWrapper& lhs, PFCharacterClientGrantCharacterToUserResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_characterType, rhs.m_characterType); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetCharacterType(String value) + { + m_characterType = std::move(value); + this->m_model.characterType = m_characterType.empty() ? nullptr : m_characterType.data(); + } + + void SetResult(bool value) + { + this->m_model.result = value; + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.characterType = m_characterType.empty() ? nullptr : m_characterType.data(); + } + + String m_characterId; + String m_characterType; +}; + +template class Alloc = std::allocator> +class PFCharacterClientUpdateCharacterDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterClientUpdateCharacterDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterClientUpdateCharacterDataRequestWrapper() = default; + + PFCharacterClientUpdateCharacterDataRequestWrapper(const PFCharacterClientUpdateCharacterDataRequest& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_data{ model.data, model.data + model.dataCount }, + m_keysToRemove{ model.keysToRemove, model.keysToRemove + model.keysToRemoveCount }, + m_permission{ model.permission ? std::optional{ *model.permission } : std::nullopt } + { + SetModelPointers(); + } + + PFCharacterClientUpdateCharacterDataRequestWrapper(const PFCharacterClientUpdateCharacterDataRequestWrapper& src) : + PFCharacterClientUpdateCharacterDataRequestWrapper{ src.Model() } + { + } + + PFCharacterClientUpdateCharacterDataRequestWrapper(PFCharacterClientUpdateCharacterDataRequestWrapper&& src) : + PFCharacterClientUpdateCharacterDataRequestWrapper{} + { + swap(*this, src); + } + + PFCharacterClientUpdateCharacterDataRequestWrapper& operator=(PFCharacterClientUpdateCharacterDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterClientUpdateCharacterDataRequestWrapper() = default; + + friend void swap(PFCharacterClientUpdateCharacterDataRequestWrapper& lhs, PFCharacterClientUpdateCharacterDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_data, rhs.m_data); + swap(lhs.m_keysToRemove, rhs.m_keysToRemove); + swap(lhs.m_permission, rhs.m_permission); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetData(StringDictionaryEntryVector value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetKeysToRemove(CStringVector value) + { + m_keysToRemove = std::move(value); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.keysToRemoveCount = static_cast(m_keysToRemove.size()); + } + + void SetPermission(std::optional value) + { + m_permission = std::move(value); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + } + + String m_characterId; + StringDictionaryEntryVector m_customTags; + StringDictionaryEntryVector m_data; + CStringVector m_keysToRemove; + std::optional m_permission; +}; + +template class Alloc = std::allocator> +class PFCharacterUpdateCharacterDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterUpdateCharacterDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetDataVersion(uint32_t value) + { + this->m_model.dataVersion = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFCharacterDeleteCharacterFromUserRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterDeleteCharacterFromUserRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterDeleteCharacterFromUserRequestWrapper() = default; + + PFCharacterDeleteCharacterFromUserRequestWrapper(const PFCharacterDeleteCharacterFromUserRequest& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFCharacterDeleteCharacterFromUserRequestWrapper(const PFCharacterDeleteCharacterFromUserRequestWrapper& src) : + PFCharacterDeleteCharacterFromUserRequestWrapper{ src.Model() } + { + } + + PFCharacterDeleteCharacterFromUserRequestWrapper(PFCharacterDeleteCharacterFromUserRequestWrapper&& src) : + PFCharacterDeleteCharacterFromUserRequestWrapper{} + { + swap(*this, src); + } + + PFCharacterDeleteCharacterFromUserRequestWrapper& operator=(PFCharacterDeleteCharacterFromUserRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterDeleteCharacterFromUserRequestWrapper() = default; + + friend void swap(PFCharacterDeleteCharacterFromUserRequestWrapper& lhs, PFCharacterDeleteCharacterFromUserRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetSaveCharacterInventory(bool value) + { + this->m_model.saveCharacterInventory = value; + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_characterId; + StringDictionaryEntryVector m_customTags; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFCharacterServerGetCharacterDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterServerGetCharacterDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterServerGetCharacterDataResultWrapper() = default; + + PFCharacterServerGetCharacterDataResultWrapper(const PFCharacterServerGetCharacterDataResult& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_data{ model.data, model.data + model.dataCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFCharacterServerGetCharacterDataResultWrapper(const PFCharacterServerGetCharacterDataResultWrapper& src) : + PFCharacterServerGetCharacterDataResultWrapper{ src.Model() } + { + } + + PFCharacterServerGetCharacterDataResultWrapper(PFCharacterServerGetCharacterDataResultWrapper&& src) : + PFCharacterServerGetCharacterDataResultWrapper{} + { + swap(*this, src); + } + + PFCharacterServerGetCharacterDataResultWrapper& operator=(PFCharacterServerGetCharacterDataResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterServerGetCharacterDataResultWrapper() = default; + + friend void swap(PFCharacterServerGetCharacterDataResultWrapper& lhs, PFCharacterServerGetCharacterDataResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_data, rhs.m_data); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetData(ModelDictionaryEntryVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetDataVersion(uint32_t value) + { + this->m_model.dataVersion = value; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_characterId; + ModelDictionaryEntryVector, Alloc> m_data; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFCharacterServerGrantCharacterToUserRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterServerGrantCharacterToUserRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterServerGrantCharacterToUserRequestWrapper() = default; + + PFCharacterServerGrantCharacterToUserRequestWrapper(const PFCharacterServerGrantCharacterToUserRequest& model) : + ModelWrapper{ model }, + m_characterName{ SafeString(model.characterName) }, + m_characterType{ SafeString(model.characterType) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFCharacterServerGrantCharacterToUserRequestWrapper(const PFCharacterServerGrantCharacterToUserRequestWrapper& src) : + PFCharacterServerGrantCharacterToUserRequestWrapper{ src.Model() } + { + } + + PFCharacterServerGrantCharacterToUserRequestWrapper(PFCharacterServerGrantCharacterToUserRequestWrapper&& src) : + PFCharacterServerGrantCharacterToUserRequestWrapper{} + { + swap(*this, src); + } + + PFCharacterServerGrantCharacterToUserRequestWrapper& operator=(PFCharacterServerGrantCharacterToUserRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterServerGrantCharacterToUserRequestWrapper() = default; + + friend void swap(PFCharacterServerGrantCharacterToUserRequestWrapper& lhs, PFCharacterServerGrantCharacterToUserRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterName, rhs.m_characterName); + swap(lhs.m_characterType, rhs.m_characterType); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterName(String value) + { + m_characterName = std::move(value); + this->m_model.characterName = m_characterName.empty() ? nullptr : m_characterName.data(); + } + + void SetCharacterType(String value) + { + m_characterType = std::move(value); + this->m_model.characterType = m_characterType.empty() ? nullptr : m_characterType.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.characterName = m_characterName.empty() ? nullptr : m_characterName.data(); + this->m_model.characterType = m_characterType.empty() ? nullptr : m_characterType.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_characterName; + String m_characterType; + StringDictionaryEntryVector m_customTags; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFCharacterServerGrantCharacterToUserResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterServerGrantCharacterToUserResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterServerGrantCharacterToUserResultWrapper() = default; + + PFCharacterServerGrantCharacterToUserResultWrapper(const PFCharacterServerGrantCharacterToUserResult& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) } + { + SetModelPointers(); + } + + PFCharacterServerGrantCharacterToUserResultWrapper(const PFCharacterServerGrantCharacterToUserResultWrapper& src) : + PFCharacterServerGrantCharacterToUserResultWrapper{ src.Model() } + { + } + + PFCharacterServerGrantCharacterToUserResultWrapper(PFCharacterServerGrantCharacterToUserResultWrapper&& src) : + PFCharacterServerGrantCharacterToUserResultWrapper{} + { + swap(*this, src); + } + + PFCharacterServerGrantCharacterToUserResultWrapper& operator=(PFCharacterServerGrantCharacterToUserResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterServerGrantCharacterToUserResultWrapper() = default; + + friend void swap(PFCharacterServerGrantCharacterToUserResultWrapper& lhs, PFCharacterServerGrantCharacterToUserResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + String m_characterId; +}; + +template class Alloc = std::allocator> +class PFCharacterServerUpdateCharacterDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCharacterServerUpdateCharacterDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCharacterServerUpdateCharacterDataRequestWrapper() = default; + + PFCharacterServerUpdateCharacterDataRequestWrapper(const PFCharacterServerUpdateCharacterDataRequest& model) : + ModelWrapper{ model }, + m_characterId{ SafeString(model.characterId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_data{ model.data, model.data + model.dataCount }, + m_keysToRemove{ model.keysToRemove, model.keysToRemove + model.keysToRemoveCount }, + m_permission{ model.permission ? std::optional{ *model.permission } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFCharacterServerUpdateCharacterDataRequestWrapper(const PFCharacterServerUpdateCharacterDataRequestWrapper& src) : + PFCharacterServerUpdateCharacterDataRequestWrapper{ src.Model() } + { + } + + PFCharacterServerUpdateCharacterDataRequestWrapper(PFCharacterServerUpdateCharacterDataRequestWrapper&& src) : + PFCharacterServerUpdateCharacterDataRequestWrapper{} + { + swap(*this, src); + } + + PFCharacterServerUpdateCharacterDataRequestWrapper& operator=(PFCharacterServerUpdateCharacterDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCharacterServerUpdateCharacterDataRequestWrapper() = default; + + friend void swap(PFCharacterServerUpdateCharacterDataRequestWrapper& lhs, PFCharacterServerUpdateCharacterDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_characterId, rhs.m_characterId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_data, rhs.m_data); + swap(lhs.m_keysToRemove, rhs.m_keysToRemove); + swap(lhs.m_permission, rhs.m_permission); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCharacterId(String value) + { + m_characterId = std::move(value); + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetData(StringDictionaryEntryVector value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetKeysToRemove(CStringVector value) + { + m_keysToRemove = std::move(value); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.keysToRemoveCount = static_cast(m_keysToRemove.size()); + } + + void SetPermission(std::optional value) + { + m_permission = std::move(value); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.characterId = m_characterId.empty() ? nullptr : m_characterId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_characterId; + StringDictionaryEntryVector m_customTags; + StringDictionaryEntryVector m_data; + CStringVector m_keysToRemove; + std::optional m_permission; + String m_playFabId; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CloudScriptTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CloudScriptTypeWrappers.h new file mode 100644 index 0000000..b46919e --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/CloudScriptTypeWrappers.h @@ -0,0 +1,295 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFCloudScriptExecuteFunctionRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFCloudScriptExecuteFunctionRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCloudScriptExecuteFunctionRequestWrapper() = default; + + PFCloudScriptExecuteFunctionRequestWrapper(const PFCloudScriptExecuteFunctionRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_functionName{ SafeString(model.functionName) }, + m_functionParameter{ model.functionParameter }, + m_generatePlayStreamEvent{ model.generatePlayStreamEvent ? std::optional{ *model.generatePlayStreamEvent } : std::nullopt } + { + SetModelPointers(); + } + + PFCloudScriptExecuteFunctionRequestWrapper(const PFCloudScriptExecuteFunctionRequestWrapper& src) : + PFCloudScriptExecuteFunctionRequestWrapper{ src.Model() } + { + } + + PFCloudScriptExecuteFunctionRequestWrapper(PFCloudScriptExecuteFunctionRequestWrapper&& src) : + PFCloudScriptExecuteFunctionRequestWrapper{} + { + swap(*this, src); + } + + PFCloudScriptExecuteFunctionRequestWrapper& operator=(PFCloudScriptExecuteFunctionRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCloudScriptExecuteFunctionRequestWrapper() = default; + + friend void swap(PFCloudScriptExecuteFunctionRequestWrapper& lhs, PFCloudScriptExecuteFunctionRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_functionName, rhs.m_functionName); + swap(lhs.m_functionParameter, rhs.m_functionParameter); + swap(lhs.m_generatePlayStreamEvent, rhs.m_generatePlayStreamEvent); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetFunctionName(String value) + { + m_functionName = std::move(value); + this->m_model.functionName = m_functionName.empty() ? nullptr : m_functionName.data(); + } + + void SetFunctionParameter(JsonObject value) + { + m_functionParameter = std::move(value); + this->m_model.functionParameter.stringValue = m_functionParameter.stringValue.empty() ? nullptr : m_functionParameter.stringValue.data(); + } + + void SetGeneratePlayStreamEvent(std::optional value) + { + m_generatePlayStreamEvent = std::move(value); + this->m_model.generatePlayStreamEvent = m_generatePlayStreamEvent ? m_generatePlayStreamEvent.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.functionName = m_functionName.empty() ? nullptr : m_functionName.data(); + this->m_model.functionParameter.stringValue = m_functionParameter.stringValue.empty() ? nullptr : m_functionParameter.stringValue.data(); + this->m_model.generatePlayStreamEvent = m_generatePlayStreamEvent ? m_generatePlayStreamEvent.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_functionName; + JsonObject m_functionParameter; + std::optional m_generatePlayStreamEvent; +}; + +template class Alloc = std::allocator> +class PFCloudScriptFunctionExecutionErrorWrapper : public ModelWrapper +{ +public: + using ModelType = PFCloudScriptFunctionExecutionError; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCloudScriptFunctionExecutionErrorWrapper() = default; + + PFCloudScriptFunctionExecutionErrorWrapper(const PFCloudScriptFunctionExecutionError& model) : + ModelWrapper{ model }, + m_error{ SafeString(model.error) }, + m_message{ SafeString(model.message) }, + m_stackTrace{ SafeString(model.stackTrace) } + { + SetModelPointers(); + } + + PFCloudScriptFunctionExecutionErrorWrapper(const PFCloudScriptFunctionExecutionErrorWrapper& src) : + PFCloudScriptFunctionExecutionErrorWrapper{ src.Model() } + { + } + + PFCloudScriptFunctionExecutionErrorWrapper(PFCloudScriptFunctionExecutionErrorWrapper&& src) : + PFCloudScriptFunctionExecutionErrorWrapper{} + { + swap(*this, src); + } + + PFCloudScriptFunctionExecutionErrorWrapper& operator=(PFCloudScriptFunctionExecutionErrorWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCloudScriptFunctionExecutionErrorWrapper() = default; + + friend void swap(PFCloudScriptFunctionExecutionErrorWrapper& lhs, PFCloudScriptFunctionExecutionErrorWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_error, rhs.m_error); + swap(lhs.m_message, rhs.m_message); + swap(lhs.m_stackTrace, rhs.m_stackTrace); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetError(String value) + { + m_error = std::move(value); + this->m_model.error = m_error.empty() ? nullptr : m_error.data(); + } + + void SetMessage(String value) + { + m_message = std::move(value); + this->m_model.message = m_message.empty() ? nullptr : m_message.data(); + } + + void SetStackTrace(String value) + { + m_stackTrace = std::move(value); + this->m_model.stackTrace = m_stackTrace.empty() ? nullptr : m_stackTrace.data(); + } + +private: + void SetModelPointers() + { + this->m_model.error = m_error.empty() ? nullptr : m_error.data(); + this->m_model.message = m_message.empty() ? nullptr : m_message.data(); + this->m_model.stackTrace = m_stackTrace.empty() ? nullptr : m_stackTrace.data(); + } + + String m_error; + String m_message; + String m_stackTrace; +}; + +template class Alloc = std::allocator> +class PFCloudScriptExecuteFunctionResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFCloudScriptExecuteFunctionResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFCloudScriptExecuteFunctionResultWrapper() = default; + + PFCloudScriptExecuteFunctionResultWrapper(const PFCloudScriptExecuteFunctionResult& model) : + ModelWrapper{ model }, + m_error{ model.error ? std::optional>{ *model.error } : std::nullopt }, + m_functionName{ SafeString(model.functionName) }, + m_functionResult{ model.functionResult }, + m_functionResultTooLarge{ model.functionResultTooLarge ? std::optional{ *model.functionResultTooLarge } : std::nullopt } + { + SetModelPointers(); + } + + PFCloudScriptExecuteFunctionResultWrapper(const PFCloudScriptExecuteFunctionResultWrapper& src) : + PFCloudScriptExecuteFunctionResultWrapper{ src.Model() } + { + } + + PFCloudScriptExecuteFunctionResultWrapper(PFCloudScriptExecuteFunctionResultWrapper&& src) : + PFCloudScriptExecuteFunctionResultWrapper{} + { + swap(*this, src); + } + + PFCloudScriptExecuteFunctionResultWrapper& operator=(PFCloudScriptExecuteFunctionResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFCloudScriptExecuteFunctionResultWrapper() = default; + + friend void swap(PFCloudScriptExecuteFunctionResultWrapper& lhs, PFCloudScriptExecuteFunctionResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_error, rhs.m_error); + swap(lhs.m_functionName, rhs.m_functionName); + swap(lhs.m_functionResult, rhs.m_functionResult); + swap(lhs.m_functionResultTooLarge, rhs.m_functionResultTooLarge); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetError(std::optional> value) + { + m_error = std::move(value); + this->m_model.error = m_error ? &m_error->Model() : nullptr; + } + + void SetExecutionTimeMilliseconds(int32_t value) + { + this->m_model.executionTimeMilliseconds = value; + } + + void SetFunctionName(String value) + { + m_functionName = std::move(value); + this->m_model.functionName = m_functionName.empty() ? nullptr : m_functionName.data(); + } + + void SetFunctionResult(JsonObject value) + { + m_functionResult = std::move(value); + this->m_model.functionResult.stringValue = m_functionResult.stringValue.empty() ? nullptr : m_functionResult.stringValue.data(); + } + + void SetFunctionResultTooLarge(std::optional value) + { + m_functionResultTooLarge = std::move(value); + this->m_model.functionResultTooLarge = m_functionResultTooLarge ? m_functionResultTooLarge.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.error = m_error ? &m_error->Model() : nullptr; + this->m_model.functionName = m_functionName.empty() ? nullptr : m_functionName.data(); + this->m_model.functionResult.stringValue = m_functionResult.stringValue.empty() ? nullptr : m_functionResult.stringValue.data(); + this->m_model.functionResultTooLarge = m_functionResultTooLarge ? m_functionResultTooLarge.operator->() : nullptr; + } + + std::optional> m_error; + String m_functionName; + JsonObject m_functionResult; + std::optional m_functionResultTooLarge; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/DataTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/DataTypeWrappers.h new file mode 100644 index 0000000..66e9e56 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/DataTypeWrappers.h @@ -0,0 +1,1538 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFDataAbortFileUploadsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataAbortFileUploadsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataAbortFileUploadsRequestWrapper() = default; + + PFDataAbortFileUploadsRequestWrapper(const PFDataAbortFileUploadsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_fileNames{ model.fileNames, model.fileNames + model.fileNamesCount }, + m_profileVersion{ model.profileVersion ? std::optional{ *model.profileVersion } : std::nullopt } + { + SetModelPointers(); + } + + PFDataAbortFileUploadsRequestWrapper(const PFDataAbortFileUploadsRequestWrapper& src) : + PFDataAbortFileUploadsRequestWrapper{ src.Model() } + { + } + + PFDataAbortFileUploadsRequestWrapper(PFDataAbortFileUploadsRequestWrapper&& src) : + PFDataAbortFileUploadsRequestWrapper{} + { + swap(*this, src); + } + + PFDataAbortFileUploadsRequestWrapper& operator=(PFDataAbortFileUploadsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataAbortFileUploadsRequestWrapper() = default; + + friend void swap(PFDataAbortFileUploadsRequestWrapper& lhs, PFDataAbortFileUploadsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_fileNames, rhs.m_fileNames); + swap(lhs.m_profileVersion, rhs.m_profileVersion); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetFileNames(CStringVector value) + { + m_fileNames = std::move(value); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + this->m_model.fileNamesCount = static_cast(m_fileNames.size()); + } + + void SetProfileVersion(std::optional value) + { + m_profileVersion = std::move(value); + this->m_model.profileVersion = m_profileVersion ? m_profileVersion.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + this->m_model.profileVersion = m_profileVersion ? m_profileVersion.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + CStringVector m_fileNames; + std::optional m_profileVersion; +}; + +template class Alloc = std::allocator> +class PFDataAbortFileUploadsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataAbortFileUploadsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataAbortFileUploadsResponseWrapper() = default; + + PFDataAbortFileUploadsResponseWrapper(const PFDataAbortFileUploadsResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFDataAbortFileUploadsResponseWrapper(const PFDataAbortFileUploadsResponseWrapper& src) : + PFDataAbortFileUploadsResponseWrapper{ src.Model() } + { + } + + PFDataAbortFileUploadsResponseWrapper(PFDataAbortFileUploadsResponseWrapper&& src) : + PFDataAbortFileUploadsResponseWrapper{} + { + swap(*this, src); + } + + PFDataAbortFileUploadsResponseWrapper& operator=(PFDataAbortFileUploadsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataAbortFileUploadsResponseWrapper() = default; + + friend void swap(PFDataAbortFileUploadsResponseWrapper& lhs, PFDataAbortFileUploadsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFDataDeleteFilesRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataDeleteFilesRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataDeleteFilesRequestWrapper() = default; + + PFDataDeleteFilesRequestWrapper(const PFDataDeleteFilesRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_fileNames{ model.fileNames, model.fileNames + model.fileNamesCount }, + m_profileVersion{ model.profileVersion ? std::optional{ *model.profileVersion } : std::nullopt } + { + SetModelPointers(); + } + + PFDataDeleteFilesRequestWrapper(const PFDataDeleteFilesRequestWrapper& src) : + PFDataDeleteFilesRequestWrapper{ src.Model() } + { + } + + PFDataDeleteFilesRequestWrapper(PFDataDeleteFilesRequestWrapper&& src) : + PFDataDeleteFilesRequestWrapper{} + { + swap(*this, src); + } + + PFDataDeleteFilesRequestWrapper& operator=(PFDataDeleteFilesRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataDeleteFilesRequestWrapper() = default; + + friend void swap(PFDataDeleteFilesRequestWrapper& lhs, PFDataDeleteFilesRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_fileNames, rhs.m_fileNames); + swap(lhs.m_profileVersion, rhs.m_profileVersion); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetFileNames(CStringVector value) + { + m_fileNames = std::move(value); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + this->m_model.fileNamesCount = static_cast(m_fileNames.size()); + } + + void SetProfileVersion(std::optional value) + { + m_profileVersion = std::move(value); + this->m_model.profileVersion = m_profileVersion ? m_profileVersion.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + this->m_model.profileVersion = m_profileVersion ? m_profileVersion.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + CStringVector m_fileNames; + std::optional m_profileVersion; +}; + +template class Alloc = std::allocator> +class PFDataDeleteFilesResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataDeleteFilesResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataDeleteFilesResponseWrapper() = default; + + PFDataDeleteFilesResponseWrapper(const PFDataDeleteFilesResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFDataDeleteFilesResponseWrapper(const PFDataDeleteFilesResponseWrapper& src) : + PFDataDeleteFilesResponseWrapper{ src.Model() } + { + } + + PFDataDeleteFilesResponseWrapper(PFDataDeleteFilesResponseWrapper&& src) : + PFDataDeleteFilesResponseWrapper{} + { + swap(*this, src); + } + + PFDataDeleteFilesResponseWrapper& operator=(PFDataDeleteFilesResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataDeleteFilesResponseWrapper() = default; + + friend void swap(PFDataDeleteFilesResponseWrapper& lhs, PFDataDeleteFilesResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFDataFinalizeFileUploadsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataFinalizeFileUploadsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataFinalizeFileUploadsRequestWrapper() = default; + + PFDataFinalizeFileUploadsRequestWrapper(const PFDataFinalizeFileUploadsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_fileNames{ model.fileNames, model.fileNames + model.fileNamesCount } + { + SetModelPointers(); + } + + PFDataFinalizeFileUploadsRequestWrapper(const PFDataFinalizeFileUploadsRequestWrapper& src) : + PFDataFinalizeFileUploadsRequestWrapper{ src.Model() } + { + } + + PFDataFinalizeFileUploadsRequestWrapper(PFDataFinalizeFileUploadsRequestWrapper&& src) : + PFDataFinalizeFileUploadsRequestWrapper{} + { + swap(*this, src); + } + + PFDataFinalizeFileUploadsRequestWrapper& operator=(PFDataFinalizeFileUploadsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataFinalizeFileUploadsRequestWrapper() = default; + + friend void swap(PFDataFinalizeFileUploadsRequestWrapper& lhs, PFDataFinalizeFileUploadsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_fileNames, rhs.m_fileNames); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetFileNames(CStringVector value) + { + m_fileNames = std::move(value); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + this->m_model.fileNamesCount = static_cast(m_fileNames.size()); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + CStringVector m_fileNames; +}; + +template class Alloc = std::allocator> +class PFDataGetFileMetadataWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataGetFileMetadata; + using DictionaryEntryType = PFDataGetFileMetadataDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataGetFileMetadataWrapper() = default; + + PFDataGetFileMetadataWrapper(const PFDataGetFileMetadata& model) : + ModelWrapper{ model }, + m_checksum{ SafeString(model.checksum) }, + m_downloadUrl{ SafeString(model.downloadUrl) }, + m_fileName{ SafeString(model.fileName) } + { + SetModelPointers(); + } + + PFDataGetFileMetadataWrapper(const PFDataGetFileMetadataWrapper& src) : + PFDataGetFileMetadataWrapper{ src.Model() } + { + } + + PFDataGetFileMetadataWrapper(PFDataGetFileMetadataWrapper&& src) : + PFDataGetFileMetadataWrapper{} + { + swap(*this, src); + } + + PFDataGetFileMetadataWrapper& operator=(PFDataGetFileMetadataWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataGetFileMetadataWrapper() = default; + + friend void swap(PFDataGetFileMetadataWrapper& lhs, PFDataGetFileMetadataWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_checksum, rhs.m_checksum); + swap(lhs.m_downloadUrl, rhs.m_downloadUrl); + swap(lhs.m_fileName, rhs.m_fileName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetChecksum(String value) + { + m_checksum = std::move(value); + this->m_model.checksum = m_checksum.empty() ? nullptr : m_checksum.data(); + } + + void SetDownloadUrl(String value) + { + m_downloadUrl = std::move(value); + this->m_model.downloadUrl = m_downloadUrl.empty() ? nullptr : m_downloadUrl.data(); + } + + void SetFileName(String value) + { + m_fileName = std::move(value); + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + + void SetLastModified(time_t value) + { + this->m_model.lastModified = value; + } + + void SetSize(int32_t value) + { + this->m_model.size = value; + } + +private: + void SetModelPointers() + { + this->m_model.checksum = m_checksum.empty() ? nullptr : m_checksum.data(); + this->m_model.downloadUrl = m_downloadUrl.empty() ? nullptr : m_downloadUrl.data(); + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + + String m_checksum; + String m_downloadUrl; + String m_fileName; +}; + +template class Alloc = std::allocator> +class PFDataFinalizeFileUploadsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataFinalizeFileUploadsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataFinalizeFileUploadsResponseWrapper() = default; + + PFDataFinalizeFileUploadsResponseWrapper(const PFDataFinalizeFileUploadsResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_metadata{ model.metadata, model.metadata + model.metadataCount } + { + SetModelPointers(); + } + + PFDataFinalizeFileUploadsResponseWrapper(const PFDataFinalizeFileUploadsResponseWrapper& src) : + PFDataFinalizeFileUploadsResponseWrapper{ src.Model() } + { + } + + PFDataFinalizeFileUploadsResponseWrapper(PFDataFinalizeFileUploadsResponseWrapper&& src) : + PFDataFinalizeFileUploadsResponseWrapper{} + { + swap(*this, src); + } + + PFDataFinalizeFileUploadsResponseWrapper& operator=(PFDataFinalizeFileUploadsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataFinalizeFileUploadsResponseWrapper() = default; + + friend void swap(PFDataFinalizeFileUploadsResponseWrapper& lhs, PFDataFinalizeFileUploadsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_metadata, rhs.m_metadata); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetMetadata(ModelDictionaryEntryVector, Alloc> value) + { + m_metadata = std::move(value); + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + this->m_model.metadataCount = static_cast(m_metadata.size()); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + } + + std::optional> m_entity; + ModelDictionaryEntryVector, Alloc> m_metadata; +}; + +template class Alloc = std::allocator> +class PFDataGetFilesRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataGetFilesRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataGetFilesRequestWrapper() = default; + + PFDataGetFilesRequestWrapper(const PFDataGetFilesRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} } + { + SetModelPointers(); + } + + PFDataGetFilesRequestWrapper(const PFDataGetFilesRequestWrapper& src) : + PFDataGetFilesRequestWrapper{ src.Model() } + { + } + + PFDataGetFilesRequestWrapper(PFDataGetFilesRequestWrapper&& src) : + PFDataGetFilesRequestWrapper{} + { + swap(*this, src); + } + + PFDataGetFilesRequestWrapper& operator=(PFDataGetFilesRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataGetFilesRequestWrapper() = default; + + friend void swap(PFDataGetFilesRequestWrapper& lhs, PFDataGetFilesRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; +}; + +template class Alloc = std::allocator> +class PFDataGetFilesResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataGetFilesResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataGetFilesResponseWrapper() = default; + + PFDataGetFilesResponseWrapper(const PFDataGetFilesResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_metadata{ model.metadata, model.metadata + model.metadataCount } + { + SetModelPointers(); + } + + PFDataGetFilesResponseWrapper(const PFDataGetFilesResponseWrapper& src) : + PFDataGetFilesResponseWrapper{ src.Model() } + { + } + + PFDataGetFilesResponseWrapper(PFDataGetFilesResponseWrapper&& src) : + PFDataGetFilesResponseWrapper{} + { + swap(*this, src); + } + + PFDataGetFilesResponseWrapper& operator=(PFDataGetFilesResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataGetFilesResponseWrapper() = default; + + friend void swap(PFDataGetFilesResponseWrapper& lhs, PFDataGetFilesResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_metadata, rhs.m_metadata); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetMetadata(ModelDictionaryEntryVector, Alloc> value) + { + m_metadata = std::move(value); + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + this->m_model.metadataCount = static_cast(m_metadata.size()); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + } + + std::optional> m_entity; + ModelDictionaryEntryVector, Alloc> m_metadata; +}; + +template class Alloc = std::allocator> +class PFDataGetObjectsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataGetObjectsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataGetObjectsRequestWrapper() = default; + + PFDataGetObjectsRequestWrapper(const PFDataGetObjectsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_escapeObject{ model.escapeObject ? std::optional{ *model.escapeObject } : std::nullopt } + { + SetModelPointers(); + } + + PFDataGetObjectsRequestWrapper(const PFDataGetObjectsRequestWrapper& src) : + PFDataGetObjectsRequestWrapper{ src.Model() } + { + } + + PFDataGetObjectsRequestWrapper(PFDataGetObjectsRequestWrapper&& src) : + PFDataGetObjectsRequestWrapper{} + { + swap(*this, src); + } + + PFDataGetObjectsRequestWrapper& operator=(PFDataGetObjectsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataGetObjectsRequestWrapper() = default; + + friend void swap(PFDataGetObjectsRequestWrapper& lhs, PFDataGetObjectsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_escapeObject, rhs.m_escapeObject); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetEscapeObject(std::optional value) + { + m_escapeObject = std::move(value); + this->m_model.escapeObject = m_escapeObject ? m_escapeObject.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.escapeObject = m_escapeObject ? m_escapeObject.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + std::optional m_escapeObject; +}; + +template class Alloc = std::allocator> +class PFDataObjectResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataObjectResult; + using DictionaryEntryType = PFDataObjectResultDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataObjectResultWrapper() = default; + + PFDataObjectResultWrapper(const PFDataObjectResult& model) : + ModelWrapper{ model }, + m_dataObject{ model.dataObject }, + m_escapedDataObject{ SafeString(model.escapedDataObject) }, + m_objectName{ SafeString(model.objectName) } + { + SetModelPointers(); + } + + PFDataObjectResultWrapper(const PFDataObjectResultWrapper& src) : + PFDataObjectResultWrapper{ src.Model() } + { + } + + PFDataObjectResultWrapper(PFDataObjectResultWrapper&& src) : + PFDataObjectResultWrapper{} + { + swap(*this, src); + } + + PFDataObjectResultWrapper& operator=(PFDataObjectResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataObjectResultWrapper() = default; + + friend void swap(PFDataObjectResultWrapper& lhs, PFDataObjectResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_dataObject, rhs.m_dataObject); + swap(lhs.m_escapedDataObject, rhs.m_escapedDataObject); + swap(lhs.m_objectName, rhs.m_objectName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDataObject(JsonObject value) + { + m_dataObject = std::move(value); + this->m_model.dataObject.stringValue = m_dataObject.stringValue.empty() ? nullptr : m_dataObject.stringValue.data(); + } + + void SetEscapedDataObject(String value) + { + m_escapedDataObject = std::move(value); + this->m_model.escapedDataObject = m_escapedDataObject.empty() ? nullptr : m_escapedDataObject.data(); + } + + void SetObjectName(String value) + { + m_objectName = std::move(value); + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.dataObject.stringValue = m_dataObject.stringValue.empty() ? nullptr : m_dataObject.stringValue.data(); + this->m_model.escapedDataObject = m_escapedDataObject.empty() ? nullptr : m_escapedDataObject.data(); + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + } + + JsonObject m_dataObject; + String m_escapedDataObject; + String m_objectName; +}; + +template class Alloc = std::allocator> +class PFDataGetObjectsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataGetObjectsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataGetObjectsResponseWrapper() = default; + + PFDataGetObjectsResponseWrapper(const PFDataGetObjectsResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_objects{ model.objects, model.objects + model.objectsCount } + { + SetModelPointers(); + } + + PFDataGetObjectsResponseWrapper(const PFDataGetObjectsResponseWrapper& src) : + PFDataGetObjectsResponseWrapper{ src.Model() } + { + } + + PFDataGetObjectsResponseWrapper(PFDataGetObjectsResponseWrapper&& src) : + PFDataGetObjectsResponseWrapper{} + { + swap(*this, src); + } + + PFDataGetObjectsResponseWrapper& operator=(PFDataGetObjectsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataGetObjectsResponseWrapper() = default; + + friend void swap(PFDataGetObjectsResponseWrapper& lhs, PFDataGetObjectsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_objects, rhs.m_objects); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetObjects(ModelDictionaryEntryVector, Alloc> value) + { + m_objects = std::move(value); + this->m_model.objects = m_objects.empty() ? nullptr : m_objects.data(); + this->m_model.objectsCount = static_cast(m_objects.size()); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.objects = m_objects.empty() ? nullptr : m_objects.data(); + } + + std::optional> m_entity; + ModelDictionaryEntryVector, Alloc> m_objects; +}; + +template class Alloc = std::allocator> +class PFDataInitiateFileUploadsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataInitiateFileUploadsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataInitiateFileUploadsRequestWrapper() = default; + + PFDataInitiateFileUploadsRequestWrapper(const PFDataInitiateFileUploadsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_fileNames{ model.fileNames, model.fileNames + model.fileNamesCount }, + m_profileVersion{ model.profileVersion ? std::optional{ *model.profileVersion } : std::nullopt } + { + SetModelPointers(); + } + + PFDataInitiateFileUploadsRequestWrapper(const PFDataInitiateFileUploadsRequestWrapper& src) : + PFDataInitiateFileUploadsRequestWrapper{ src.Model() } + { + } + + PFDataInitiateFileUploadsRequestWrapper(PFDataInitiateFileUploadsRequestWrapper&& src) : + PFDataInitiateFileUploadsRequestWrapper{} + { + swap(*this, src); + } + + PFDataInitiateFileUploadsRequestWrapper& operator=(PFDataInitiateFileUploadsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataInitiateFileUploadsRequestWrapper() = default; + + friend void swap(PFDataInitiateFileUploadsRequestWrapper& lhs, PFDataInitiateFileUploadsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_fileNames, rhs.m_fileNames); + swap(lhs.m_profileVersion, rhs.m_profileVersion); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetFileNames(CStringVector value) + { + m_fileNames = std::move(value); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + this->m_model.fileNamesCount = static_cast(m_fileNames.size()); + } + + void SetProfileVersion(std::optional value) + { + m_profileVersion = std::move(value); + this->m_model.profileVersion = m_profileVersion ? m_profileVersion.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.fileNames = m_fileNames.empty() ? nullptr : m_fileNames.data(); + this->m_model.profileVersion = m_profileVersion ? m_profileVersion.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + CStringVector m_fileNames; + std::optional m_profileVersion; +}; + +template class Alloc = std::allocator> +class PFDataInitiateFileUploadMetadataWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataInitiateFileUploadMetadata; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataInitiateFileUploadMetadataWrapper() = default; + + PFDataInitiateFileUploadMetadataWrapper(const PFDataInitiateFileUploadMetadata& model) : + ModelWrapper{ model }, + m_fileName{ SafeString(model.fileName) }, + m_uploadUrl{ SafeString(model.uploadUrl) } + { + SetModelPointers(); + } + + PFDataInitiateFileUploadMetadataWrapper(const PFDataInitiateFileUploadMetadataWrapper& src) : + PFDataInitiateFileUploadMetadataWrapper{ src.Model() } + { + } + + PFDataInitiateFileUploadMetadataWrapper(PFDataInitiateFileUploadMetadataWrapper&& src) : + PFDataInitiateFileUploadMetadataWrapper{} + { + swap(*this, src); + } + + PFDataInitiateFileUploadMetadataWrapper& operator=(PFDataInitiateFileUploadMetadataWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataInitiateFileUploadMetadataWrapper() = default; + + friend void swap(PFDataInitiateFileUploadMetadataWrapper& lhs, PFDataInitiateFileUploadMetadataWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_fileName, rhs.m_fileName); + swap(lhs.m_uploadUrl, rhs.m_uploadUrl); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFileName(String value) + { + m_fileName = std::move(value); + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + + void SetUploadUrl(String value) + { + m_uploadUrl = std::move(value); + this->m_model.uploadUrl = m_uploadUrl.empty() ? nullptr : m_uploadUrl.data(); + } + +private: + void SetModelPointers() + { + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + this->m_model.uploadUrl = m_uploadUrl.empty() ? nullptr : m_uploadUrl.data(); + } + + String m_fileName; + String m_uploadUrl; +}; + +template class Alloc = std::allocator> +class PFDataInitiateFileUploadsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataInitiateFileUploadsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataInitiateFileUploadsResponseWrapper() = default; + + PFDataInitiateFileUploadsResponseWrapper(const PFDataInitiateFileUploadsResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_uploadDetails{ model.uploadDetails, model.uploadDetails + model.uploadDetailsCount } + { + SetModelPointers(); + } + + PFDataInitiateFileUploadsResponseWrapper(const PFDataInitiateFileUploadsResponseWrapper& src) : + PFDataInitiateFileUploadsResponseWrapper{ src.Model() } + { + } + + PFDataInitiateFileUploadsResponseWrapper(PFDataInitiateFileUploadsResponseWrapper&& src) : + PFDataInitiateFileUploadsResponseWrapper{} + { + swap(*this, src); + } + + PFDataInitiateFileUploadsResponseWrapper& operator=(PFDataInitiateFileUploadsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataInitiateFileUploadsResponseWrapper() = default; + + friend void swap(PFDataInitiateFileUploadsResponseWrapper& lhs, PFDataInitiateFileUploadsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_uploadDetails, rhs.m_uploadDetails); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetUploadDetails(ModelVector, Alloc> value) + { + m_uploadDetails = std::move(value); + this->m_model.uploadDetails = m_uploadDetails.empty() ? nullptr : m_uploadDetails.data(); + this->m_model.uploadDetailsCount = static_cast(m_uploadDetails.size()); + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.uploadDetails = m_uploadDetails.empty() ? nullptr : m_uploadDetails.data(); + } + + std::optional> m_entity; + ModelVector, Alloc> m_uploadDetails; +}; + +template class Alloc = std::allocator> +class PFDataSetObjectWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataSetObject; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataSetObjectWrapper() = default; + + PFDataSetObjectWrapper(const PFDataSetObject& model) : + ModelWrapper{ model }, + m_dataObject{ model.dataObject }, + m_deleteObject{ model.deleteObject ? std::optional{ *model.deleteObject } : std::nullopt }, + m_escapedDataObject{ SafeString(model.escapedDataObject) }, + m_objectName{ SafeString(model.objectName) } + { + SetModelPointers(); + } + + PFDataSetObjectWrapper(const PFDataSetObjectWrapper& src) : + PFDataSetObjectWrapper{ src.Model() } + { + } + + PFDataSetObjectWrapper(PFDataSetObjectWrapper&& src) : + PFDataSetObjectWrapper{} + { + swap(*this, src); + } + + PFDataSetObjectWrapper& operator=(PFDataSetObjectWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataSetObjectWrapper() = default; + + friend void swap(PFDataSetObjectWrapper& lhs, PFDataSetObjectWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_dataObject, rhs.m_dataObject); + swap(lhs.m_deleteObject, rhs.m_deleteObject); + swap(lhs.m_escapedDataObject, rhs.m_escapedDataObject); + swap(lhs.m_objectName, rhs.m_objectName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDataObject(JsonObject value) + { + m_dataObject = std::move(value); + this->m_model.dataObject.stringValue = m_dataObject.stringValue.empty() ? nullptr : m_dataObject.stringValue.data(); + } + + void SetDeleteObject(std::optional value) + { + m_deleteObject = std::move(value); + this->m_model.deleteObject = m_deleteObject ? m_deleteObject.operator->() : nullptr; + } + + void SetEscapedDataObject(String value) + { + m_escapedDataObject = std::move(value); + this->m_model.escapedDataObject = m_escapedDataObject.empty() ? nullptr : m_escapedDataObject.data(); + } + + void SetObjectName(String value) + { + m_objectName = std::move(value); + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.dataObject.stringValue = m_dataObject.stringValue.empty() ? nullptr : m_dataObject.stringValue.data(); + this->m_model.deleteObject = m_deleteObject ? m_deleteObject.operator->() : nullptr; + this->m_model.escapedDataObject = m_escapedDataObject.empty() ? nullptr : m_escapedDataObject.data(); + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + } + + JsonObject m_dataObject; + std::optional m_deleteObject; + String m_escapedDataObject; + String m_objectName; +}; + +template class Alloc = std::allocator> +class PFDataSetObjectsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataSetObjectsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataSetObjectsRequestWrapper() = default; + + PFDataSetObjectsRequestWrapper(const PFDataSetObjectsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_expectedProfileVersion{ model.expectedProfileVersion ? std::optional{ *model.expectedProfileVersion } : std::nullopt }, + m_objects{ model.objects, model.objects + model.objectsCount } + { + SetModelPointers(); + } + + PFDataSetObjectsRequestWrapper(const PFDataSetObjectsRequestWrapper& src) : + PFDataSetObjectsRequestWrapper{ src.Model() } + { + } + + PFDataSetObjectsRequestWrapper(PFDataSetObjectsRequestWrapper&& src) : + PFDataSetObjectsRequestWrapper{} + { + swap(*this, src); + } + + PFDataSetObjectsRequestWrapper& operator=(PFDataSetObjectsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataSetObjectsRequestWrapper() = default; + + friend void swap(PFDataSetObjectsRequestWrapper& lhs, PFDataSetObjectsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_expectedProfileVersion, rhs.m_expectedProfileVersion); + swap(lhs.m_objects, rhs.m_objects); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetExpectedProfileVersion(std::optional value) + { + m_expectedProfileVersion = std::move(value); + this->m_model.expectedProfileVersion = m_expectedProfileVersion ? m_expectedProfileVersion.operator->() : nullptr; + } + + void SetObjects(ModelVector, Alloc> value) + { + m_objects = std::move(value); + this->m_model.objects = m_objects.empty() ? nullptr : m_objects.data(); + this->m_model.objectsCount = static_cast(m_objects.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.expectedProfileVersion = m_expectedProfileVersion ? m_expectedProfileVersion.operator->() : nullptr; + this->m_model.objects = m_objects.empty() ? nullptr : m_objects.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + std::optional m_expectedProfileVersion; + ModelVector, Alloc> m_objects; +}; + +template class Alloc = std::allocator> +class PFDataSetObjectInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataSetObjectInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataSetObjectInfoWrapper() = default; + + PFDataSetObjectInfoWrapper(const PFDataSetObjectInfo& model) : + ModelWrapper{ model }, + m_objectName{ SafeString(model.objectName) }, + m_operationReason{ SafeString(model.operationReason) }, + m_setResult{ model.setResult ? std::optional{ *model.setResult } : std::nullopt } + { + SetModelPointers(); + } + + PFDataSetObjectInfoWrapper(const PFDataSetObjectInfoWrapper& src) : + PFDataSetObjectInfoWrapper{ src.Model() } + { + } + + PFDataSetObjectInfoWrapper(PFDataSetObjectInfoWrapper&& src) : + PFDataSetObjectInfoWrapper{} + { + swap(*this, src); + } + + PFDataSetObjectInfoWrapper& operator=(PFDataSetObjectInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataSetObjectInfoWrapper() = default; + + friend void swap(PFDataSetObjectInfoWrapper& lhs, PFDataSetObjectInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_objectName, rhs.m_objectName); + swap(lhs.m_operationReason, rhs.m_operationReason); + swap(lhs.m_setResult, rhs.m_setResult); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetObjectName(String value) + { + m_objectName = std::move(value); + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + } + + void SetOperationReason(String value) + { + m_operationReason = std::move(value); + this->m_model.operationReason = m_operationReason.empty() ? nullptr : m_operationReason.data(); + } + + void SetSetResult(std::optional value) + { + m_setResult = std::move(value); + this->m_model.setResult = m_setResult ? m_setResult.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + this->m_model.operationReason = m_operationReason.empty() ? nullptr : m_operationReason.data(); + this->m_model.setResult = m_setResult ? m_setResult.operator->() : nullptr; + } + + String m_objectName; + String m_operationReason; + std::optional m_setResult; +}; + +template class Alloc = std::allocator> +class PFDataSetObjectsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFDataSetObjectsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFDataSetObjectsResponseWrapper() = default; + + PFDataSetObjectsResponseWrapper(const PFDataSetObjectsResponse& model) : + ModelWrapper{ model }, + m_setResults{ model.setResults, model.setResults + model.setResultsCount } + { + SetModelPointers(); + } + + PFDataSetObjectsResponseWrapper(const PFDataSetObjectsResponseWrapper& src) : + PFDataSetObjectsResponseWrapper{ src.Model() } + { + } + + PFDataSetObjectsResponseWrapper(PFDataSetObjectsResponseWrapper&& src) : + PFDataSetObjectsResponseWrapper{} + { + swap(*this, src); + } + + PFDataSetObjectsResponseWrapper& operator=(PFDataSetObjectsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFDataSetObjectsResponseWrapper() = default; + + friend void swap(PFDataSetObjectsResponseWrapper& lhs, PFDataSetObjectsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_setResults, rhs.m_setResults); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetSetResults(ModelVector, Alloc> value) + { + m_setResults = std::move(value); + this->m_model.setResults = m_setResults.empty() ? nullptr : m_setResults.data(); + this->m_model.setResultsCount = static_cast(m_setResults.size()); + } + +private: + void SetModelPointers() + { + this->m_model.setResults = m_setResults.empty() ? nullptr : m_setResults.data(); + } + + ModelVector, Alloc> m_setResults; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/ExperimentationTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/ExperimentationTypeWrappers.h new file mode 100644 index 0000000..bad8998 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/ExperimentationTypeWrappers.h @@ -0,0 +1,150 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFExperimentationGetTreatmentAssignmentRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFExperimentationGetTreatmentAssignmentRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFExperimentationGetTreatmentAssignmentRequestWrapper() = default; + + PFExperimentationGetTreatmentAssignmentRequestWrapper(const PFExperimentationGetTreatmentAssignmentRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFExperimentationGetTreatmentAssignmentRequestWrapper(const PFExperimentationGetTreatmentAssignmentRequestWrapper& src) : + PFExperimentationGetTreatmentAssignmentRequestWrapper{ src.Model() } + { + } + + PFExperimentationGetTreatmentAssignmentRequestWrapper(PFExperimentationGetTreatmentAssignmentRequestWrapper&& src) : + PFExperimentationGetTreatmentAssignmentRequestWrapper{} + { + swap(*this, src); + } + + PFExperimentationGetTreatmentAssignmentRequestWrapper& operator=(PFExperimentationGetTreatmentAssignmentRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFExperimentationGetTreatmentAssignmentRequestWrapper() = default; + + friend void swap(PFExperimentationGetTreatmentAssignmentRequestWrapper& lhs, PFExperimentationGetTreatmentAssignmentRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFExperimentationGetTreatmentAssignmentResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFExperimentationGetTreatmentAssignmentResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFExperimentationGetTreatmentAssignmentResultWrapper() = default; + + PFExperimentationGetTreatmentAssignmentResultWrapper(const PFExperimentationGetTreatmentAssignmentResult& model) : + ModelWrapper{ model }, + m_treatmentAssignment{ model.treatmentAssignment ? std::optional>{ *model.treatmentAssignment } : std::nullopt } + { + SetModelPointers(); + } + + PFExperimentationGetTreatmentAssignmentResultWrapper(const PFExperimentationGetTreatmentAssignmentResultWrapper& src) : + PFExperimentationGetTreatmentAssignmentResultWrapper{ src.Model() } + { + } + + PFExperimentationGetTreatmentAssignmentResultWrapper(PFExperimentationGetTreatmentAssignmentResultWrapper&& src) : + PFExperimentationGetTreatmentAssignmentResultWrapper{} + { + swap(*this, src); + } + + PFExperimentationGetTreatmentAssignmentResultWrapper& operator=(PFExperimentationGetTreatmentAssignmentResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFExperimentationGetTreatmentAssignmentResultWrapper() = default; + + friend void swap(PFExperimentationGetTreatmentAssignmentResultWrapper& lhs, PFExperimentationGetTreatmentAssignmentResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_treatmentAssignment, rhs.m_treatmentAssignment); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTreatmentAssignment(std::optional> value) + { + m_treatmentAssignment = std::move(value); + this->m_model.treatmentAssignment = m_treatmentAssignment ? &m_treatmentAssignment->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.treatmentAssignment = m_treatmentAssignment ? &m_treatmentAssignment->Model() : nullptr; + } + + std::optional> m_treatmentAssignment; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/FriendsTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/FriendsTypeWrappers.h new file mode 100644 index 0000000..bbe231a --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/FriendsTypeWrappers.h @@ -0,0 +1,950 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#if HC_PLATFORM == HC_PLATFORM_GDK +#include +#endif + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFFriendsClientAddFriendRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsClientAddFriendRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsClientAddFriendRequestWrapper() = default; + + PFFriendsClientAddFriendRequestWrapper(const PFFriendsClientAddFriendRequest& model) : + ModelWrapper{ model }, + m_friendEmail{ SafeString(model.friendEmail) }, + m_friendPlayFabId{ SafeString(model.friendPlayFabId) }, + m_friendTitleDisplayName{ SafeString(model.friendTitleDisplayName) }, + m_friendUsername{ SafeString(model.friendUsername) } + { + SetModelPointers(); + } + + PFFriendsClientAddFriendRequestWrapper(const PFFriendsClientAddFriendRequestWrapper& src) : + PFFriendsClientAddFriendRequestWrapper{ src.Model() } + { + } + + PFFriendsClientAddFriendRequestWrapper(PFFriendsClientAddFriendRequestWrapper&& src) : + PFFriendsClientAddFriendRequestWrapper{} + { + swap(*this, src); + } + + PFFriendsClientAddFriendRequestWrapper& operator=(PFFriendsClientAddFriendRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsClientAddFriendRequestWrapper() = default; + + friend void swap(PFFriendsClientAddFriendRequestWrapper& lhs, PFFriendsClientAddFriendRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_friendEmail, rhs.m_friendEmail); + swap(lhs.m_friendPlayFabId, rhs.m_friendPlayFabId); + swap(lhs.m_friendTitleDisplayName, rhs.m_friendTitleDisplayName); + swap(lhs.m_friendUsername, rhs.m_friendUsername); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFriendEmail(String value) + { + m_friendEmail = std::move(value); + this->m_model.friendEmail = m_friendEmail.empty() ? nullptr : m_friendEmail.data(); + } + + void SetFriendPlayFabId(String value) + { + m_friendPlayFabId = std::move(value); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + + void SetFriendTitleDisplayName(String value) + { + m_friendTitleDisplayName = std::move(value); + this->m_model.friendTitleDisplayName = m_friendTitleDisplayName.empty() ? nullptr : m_friendTitleDisplayName.data(); + } + + void SetFriendUsername(String value) + { + m_friendUsername = std::move(value); + this->m_model.friendUsername = m_friendUsername.empty() ? nullptr : m_friendUsername.data(); + } + +private: + void SetModelPointers() + { + this->m_model.friendEmail = m_friendEmail.empty() ? nullptr : m_friendEmail.data(); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + this->m_model.friendTitleDisplayName = m_friendTitleDisplayName.empty() ? nullptr : m_friendTitleDisplayName.data(); + this->m_model.friendUsername = m_friendUsername.empty() ? nullptr : m_friendUsername.data(); + } + + String m_friendEmail; + String m_friendPlayFabId; + String m_friendTitleDisplayName; + String m_friendUsername; +}; + +template class Alloc = std::allocator> +class PFFriendsAddFriendResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsAddFriendResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetCreated(bool value) + { + this->m_model.created = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFFriendsClientGetFriendsListRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsClientGetFriendsListRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + +#if HC_PLATFORM == HC_PLATFORM_GDK + PFFriendsClientGetFriendsListRequestWrapper(XUser user) + : m_user{ std::move(user) } + { + SetModelPointers(); + } +#else + PFFriendsClientGetFriendsListRequestWrapper() = default; +#endif + + PFFriendsClientGetFriendsListRequestWrapper(const PFFriendsClientGetFriendsListRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_externalPlatformFriends{ model.externalPlatformFriends ? std::optional{ *model.externalPlatformFriends } : std::nullopt }, + m_profileConstraints{ model.profileConstraints ? std::optional>{ *model.profileConstraints } : std::nullopt }, +#if HC_PLATFORM == HC_PLATFORM_GDK + m_user{ XUser::Duplicate(model.user) } +#else + m_xboxToken{ SafeString(model.xboxToken) } +#endif + { + SetModelPointers(); + } + + PFFriendsClientGetFriendsListRequestWrapper(const PFFriendsClientGetFriendsListRequestWrapper& src) : + PFFriendsClientGetFriendsListRequestWrapper{ src.Model() } + { + } + + PFFriendsClientGetFriendsListRequestWrapper(PFFriendsClientGetFriendsListRequestWrapper&& src) : +#if HC_PLATFORM == HC_PLATFORM_GDK + PFFriendsClientGetFriendsListRequestWrapper{ XUser::Wrap(nullptr) } +#else + PFFriendsClientGetFriendsListRequestWrapper{} +#endif + { + swap(*this, src); + } + + PFFriendsClientGetFriendsListRequestWrapper& operator=(PFFriendsClientGetFriendsListRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsClientGetFriendsListRequestWrapper() = default; + + friend void swap(PFFriendsClientGetFriendsListRequestWrapper& lhs, PFFriendsClientGetFriendsListRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_externalPlatformFriends, rhs.m_externalPlatformFriends); + swap(lhs.m_profileConstraints, rhs.m_profileConstraints); +#if HC_PLATFORM == HC_PLATFORM_GDK + swap(lhs.m_user, rhs.m_user); +#endif + swap(lhs.m_xboxToken, rhs.m_xboxToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetExternalPlatformFriends(std::optional value) + { + m_externalPlatformFriends = std::move(value); + this->m_model.externalPlatformFriends = m_externalPlatformFriends ? m_externalPlatformFriends.operator->() : nullptr; + } + + void SetProfileConstraints(std::optional> value) + { + m_profileConstraints = std::move(value); + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; + } + +#if HC_PLATFORM == HC_PLATFORM_GDK + void SetUser(XUser value) + { + m_user = std::move(value); + this->m_model.user = m_user.Handle(); + } +#else + void SetXboxToken(String value) + { + m_xboxToken = std::move(value); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } +#endif + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.externalPlatformFriends = m_externalPlatformFriends ? m_externalPlatformFriends.operator->() : nullptr; + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; +#if HC_PLATFORM == HC_PLATFORM_GDK + this->m_model.user = m_user.Handle(); +#else + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); +#endif + } + + StringDictionaryEntryVector m_customTags; + std::optional m_externalPlatformFriends; + std::optional> m_profileConstraints; +#if HC_PLATFORM == HC_PLATFORM_GDK + XUser m_user; +#endif + String m_xboxToken; +}; + +template class Alloc = std::allocator> +class PFFriendsFriendInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsFriendInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsFriendInfoWrapper() = default; + + PFFriendsFriendInfoWrapper(const PFFriendsFriendInfo& model) : + ModelWrapper{ model }, + m_facebookInfo{ model.facebookInfo ? std::optional>{ *model.facebookInfo } : std::nullopt }, + m_friendPlayFabId{ SafeString(model.friendPlayFabId) }, + m_gameCenterInfo{ model.gameCenterInfo ? std::optional>{ *model.gameCenterInfo } : std::nullopt }, + m_profile{ model.profile ? std::optional>{ *model.profile } : std::nullopt }, + m_PSNInfo{ model.PSNInfo ? std::optional>{ *model.PSNInfo } : std::nullopt }, + m_steamInfo{ model.steamInfo ? std::optional>{ *model.steamInfo } : std::nullopt }, + m_tags{ model.tags, model.tags + model.tagsCount }, + m_titleDisplayName{ SafeString(model.titleDisplayName) }, + m_username{ SafeString(model.username) }, + m_xboxInfo{ model.xboxInfo ? std::optional>{ *model.xboxInfo } : std::nullopt } + { + SetModelPointers(); + } + + PFFriendsFriendInfoWrapper(const PFFriendsFriendInfoWrapper& src) : + PFFriendsFriendInfoWrapper{ src.Model() } + { + } + + PFFriendsFriendInfoWrapper(PFFriendsFriendInfoWrapper&& src) : + PFFriendsFriendInfoWrapper{} + { + swap(*this, src); + } + + PFFriendsFriendInfoWrapper& operator=(PFFriendsFriendInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsFriendInfoWrapper() = default; + + friend void swap(PFFriendsFriendInfoWrapper& lhs, PFFriendsFriendInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_facebookInfo, rhs.m_facebookInfo); + swap(lhs.m_friendPlayFabId, rhs.m_friendPlayFabId); + swap(lhs.m_gameCenterInfo, rhs.m_gameCenterInfo); + swap(lhs.m_profile, rhs.m_profile); + swap(lhs.m_PSNInfo, rhs.m_PSNInfo); + swap(lhs.m_steamInfo, rhs.m_steamInfo); + swap(lhs.m_tags, rhs.m_tags); + swap(lhs.m_titleDisplayName, rhs.m_titleDisplayName); + swap(lhs.m_username, rhs.m_username); + swap(lhs.m_xboxInfo, rhs.m_xboxInfo); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFacebookInfo(std::optional> value) + { + m_facebookInfo = std::move(value); + this->m_model.facebookInfo = m_facebookInfo ? &m_facebookInfo->Model() : nullptr; + } + + void SetFriendPlayFabId(String value) + { + m_friendPlayFabId = std::move(value); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + + void SetGameCenterInfo(std::optional> value) + { + m_gameCenterInfo = std::move(value); + this->m_model.gameCenterInfo = m_gameCenterInfo ? &m_gameCenterInfo->Model() : nullptr; + } + + void SetProfile(std::optional> value) + { + m_profile = std::move(value); + this->m_model.profile = m_profile ? &m_profile->Model() : nullptr; + } + + void SetPSNInfo(std::optional> value) + { + m_PSNInfo = std::move(value); + this->m_model.PSNInfo = m_PSNInfo ? &m_PSNInfo->Model() : nullptr; + } + + void SetSteamInfo(std::optional> value) + { + m_steamInfo = std::move(value); + this->m_model.steamInfo = m_steamInfo ? &m_steamInfo->Model() : nullptr; + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + + void SetTitleDisplayName(String value) + { + m_titleDisplayName = std::move(value); + this->m_model.titleDisplayName = m_titleDisplayName.empty() ? nullptr : m_titleDisplayName.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + void SetXboxInfo(std::optional> value) + { + m_xboxInfo = std::move(value); + this->m_model.xboxInfo = m_xboxInfo ? &m_xboxInfo->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.facebookInfo = m_facebookInfo ? &m_facebookInfo->Model() : nullptr; + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + this->m_model.gameCenterInfo = m_gameCenterInfo ? &m_gameCenterInfo->Model() : nullptr; + this->m_model.profile = m_profile ? &m_profile->Model() : nullptr; + this->m_model.PSNInfo = m_PSNInfo ? &m_PSNInfo->Model() : nullptr; + this->m_model.steamInfo = m_steamInfo ? &m_steamInfo->Model() : nullptr; + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.titleDisplayName = m_titleDisplayName.empty() ? nullptr : m_titleDisplayName.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + this->m_model.xboxInfo = m_xboxInfo ? &m_xboxInfo->Model() : nullptr; + } + + std::optional> m_facebookInfo; + String m_friendPlayFabId; + std::optional> m_gameCenterInfo; + std::optional> m_profile; + std::optional> m_PSNInfo; + std::optional> m_steamInfo; + CStringVector m_tags; + String m_titleDisplayName; + String m_username; + std::optional> m_xboxInfo; +}; + +template class Alloc = std::allocator> +class PFFriendsGetFriendsListResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsGetFriendsListResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsGetFriendsListResultWrapper() = default; + + PFFriendsGetFriendsListResultWrapper(const PFFriendsGetFriendsListResult& model) : + ModelWrapper{ model }, + m_friends{ model.friends, model.friends + model.friendsCount } + { + SetModelPointers(); + } + + PFFriendsGetFriendsListResultWrapper(const PFFriendsGetFriendsListResultWrapper& src) : + PFFriendsGetFriendsListResultWrapper{ src.Model() } + { + } + + PFFriendsGetFriendsListResultWrapper(PFFriendsGetFriendsListResultWrapper&& src) : + PFFriendsGetFriendsListResultWrapper{} + { + swap(*this, src); + } + + PFFriendsGetFriendsListResultWrapper& operator=(PFFriendsGetFriendsListResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsGetFriendsListResultWrapper() = default; + + friend void swap(PFFriendsGetFriendsListResultWrapper& lhs, PFFriendsGetFriendsListResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_friends, rhs.m_friends); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFriends(ModelVector, Alloc> value) + { + m_friends = std::move(value); + this->m_model.friends = m_friends.empty() ? nullptr : m_friends.data(); + this->m_model.friendsCount = static_cast(m_friends.size()); + } + +private: + void SetModelPointers() + { + this->m_model.friends = m_friends.empty() ? nullptr : m_friends.data(); + } + + ModelVector, Alloc> m_friends; +}; + +template class Alloc = std::allocator> +class PFFriendsClientRemoveFriendRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsClientRemoveFriendRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsClientRemoveFriendRequestWrapper() = default; + + PFFriendsClientRemoveFriendRequestWrapper(const PFFriendsClientRemoveFriendRequest& model) : + ModelWrapper{ model }, + m_friendPlayFabId{ SafeString(model.friendPlayFabId) } + { + SetModelPointers(); + } + + PFFriendsClientRemoveFriendRequestWrapper(const PFFriendsClientRemoveFriendRequestWrapper& src) : + PFFriendsClientRemoveFriendRequestWrapper{ src.Model() } + { + } + + PFFriendsClientRemoveFriendRequestWrapper(PFFriendsClientRemoveFriendRequestWrapper&& src) : + PFFriendsClientRemoveFriendRequestWrapper{} + { + swap(*this, src); + } + + PFFriendsClientRemoveFriendRequestWrapper& operator=(PFFriendsClientRemoveFriendRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsClientRemoveFriendRequestWrapper() = default; + + friend void swap(PFFriendsClientRemoveFriendRequestWrapper& lhs, PFFriendsClientRemoveFriendRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_friendPlayFabId, rhs.m_friendPlayFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFriendPlayFabId(String value) + { + m_friendPlayFabId = std::move(value); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + + String m_friendPlayFabId; +}; + +template class Alloc = std::allocator> +class PFFriendsClientSetFriendTagsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsClientSetFriendTagsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsClientSetFriendTagsRequestWrapper() = default; + + PFFriendsClientSetFriendTagsRequestWrapper(const PFFriendsClientSetFriendTagsRequest& model) : + ModelWrapper{ model }, + m_friendPlayFabId{ SafeString(model.friendPlayFabId) }, + m_tags{ model.tags, model.tags + model.tagsCount } + { + SetModelPointers(); + } + + PFFriendsClientSetFriendTagsRequestWrapper(const PFFriendsClientSetFriendTagsRequestWrapper& src) : + PFFriendsClientSetFriendTagsRequestWrapper{ src.Model() } + { + } + + PFFriendsClientSetFriendTagsRequestWrapper(PFFriendsClientSetFriendTagsRequestWrapper&& src) : + PFFriendsClientSetFriendTagsRequestWrapper{} + { + swap(*this, src); + } + + PFFriendsClientSetFriendTagsRequestWrapper& operator=(PFFriendsClientSetFriendTagsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsClientSetFriendTagsRequestWrapper() = default; + + friend void swap(PFFriendsClientSetFriendTagsRequestWrapper& lhs, PFFriendsClientSetFriendTagsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_friendPlayFabId, rhs.m_friendPlayFabId); + swap(lhs.m_tags, rhs.m_tags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFriendPlayFabId(String value) + { + m_friendPlayFabId = std::move(value); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + } + + String m_friendPlayFabId; + CStringVector m_tags; +}; + +template class Alloc = std::allocator> +class PFFriendsServerAddFriendRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsServerAddFriendRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsServerAddFriendRequestWrapper() = default; + + PFFriendsServerAddFriendRequestWrapper(const PFFriendsServerAddFriendRequest& model) : + ModelWrapper{ model }, + m_friendEmail{ SafeString(model.friendEmail) }, + m_friendPlayFabId{ SafeString(model.friendPlayFabId) }, + m_friendTitleDisplayName{ SafeString(model.friendTitleDisplayName) }, + m_friendUsername{ SafeString(model.friendUsername) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFFriendsServerAddFriendRequestWrapper(const PFFriendsServerAddFriendRequestWrapper& src) : + PFFriendsServerAddFriendRequestWrapper{ src.Model() } + { + } + + PFFriendsServerAddFriendRequestWrapper(PFFriendsServerAddFriendRequestWrapper&& src) : + PFFriendsServerAddFriendRequestWrapper{} + { + swap(*this, src); + } + + PFFriendsServerAddFriendRequestWrapper& operator=(PFFriendsServerAddFriendRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsServerAddFriendRequestWrapper() = default; + + friend void swap(PFFriendsServerAddFriendRequestWrapper& lhs, PFFriendsServerAddFriendRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_friendEmail, rhs.m_friendEmail); + swap(lhs.m_friendPlayFabId, rhs.m_friendPlayFabId); + swap(lhs.m_friendTitleDisplayName, rhs.m_friendTitleDisplayName); + swap(lhs.m_friendUsername, rhs.m_friendUsername); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFriendEmail(String value) + { + m_friendEmail = std::move(value); + this->m_model.friendEmail = m_friendEmail.empty() ? nullptr : m_friendEmail.data(); + } + + void SetFriendPlayFabId(String value) + { + m_friendPlayFabId = std::move(value); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + + void SetFriendTitleDisplayName(String value) + { + m_friendTitleDisplayName = std::move(value); + this->m_model.friendTitleDisplayName = m_friendTitleDisplayName.empty() ? nullptr : m_friendTitleDisplayName.data(); + } + + void SetFriendUsername(String value) + { + m_friendUsername = std::move(value); + this->m_model.friendUsername = m_friendUsername.empty() ? nullptr : m_friendUsername.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.friendEmail = m_friendEmail.empty() ? nullptr : m_friendEmail.data(); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + this->m_model.friendTitleDisplayName = m_friendTitleDisplayName.empty() ? nullptr : m_friendTitleDisplayName.data(); + this->m_model.friendUsername = m_friendUsername.empty() ? nullptr : m_friendUsername.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_friendEmail; + String m_friendPlayFabId; + String m_friendTitleDisplayName; + String m_friendUsername; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFFriendsServerGetFriendsListRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsServerGetFriendsListRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsServerGetFriendsListRequestWrapper() = default; + + PFFriendsServerGetFriendsListRequestWrapper(const PFFriendsServerGetFriendsListRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_externalPlatformFriends{ model.externalPlatformFriends ? std::optional{ *model.externalPlatformFriends } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) }, + m_profileConstraints{ model.profileConstraints ? std::optional>{ *model.profileConstraints } : std::nullopt }, + m_xboxToken{ SafeString(model.xboxToken) } + { + SetModelPointers(); + } + + PFFriendsServerGetFriendsListRequestWrapper(const PFFriendsServerGetFriendsListRequestWrapper& src) : + PFFriendsServerGetFriendsListRequestWrapper{ src.Model() } + { + } + + PFFriendsServerGetFriendsListRequestWrapper(PFFriendsServerGetFriendsListRequestWrapper&& src) : + PFFriendsServerGetFriendsListRequestWrapper{} + { + swap(*this, src); + } + + PFFriendsServerGetFriendsListRequestWrapper& operator=(PFFriendsServerGetFriendsListRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsServerGetFriendsListRequestWrapper() = default; + + friend void swap(PFFriendsServerGetFriendsListRequestWrapper& lhs, PFFriendsServerGetFriendsListRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_externalPlatformFriends, rhs.m_externalPlatformFriends); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_profileConstraints, rhs.m_profileConstraints); + swap(lhs.m_xboxToken, rhs.m_xboxToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetExternalPlatformFriends(std::optional value) + { + m_externalPlatformFriends = std::move(value); + this->m_model.externalPlatformFriends = m_externalPlatformFriends ? m_externalPlatformFriends.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetProfileConstraints(std::optional> value) + { + m_profileConstraints = std::move(value); + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; + } + + void SetXboxToken(String value) + { + m_xboxToken = std::move(value); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.externalPlatformFriends = m_externalPlatformFriends ? m_externalPlatformFriends.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.profileConstraints = m_profileConstraints ? &m_profileConstraints->Model() : nullptr; + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_externalPlatformFriends; + String m_playFabId; + std::optional> m_profileConstraints; + String m_xboxToken; +}; + +template class Alloc = std::allocator> +class PFFriendsServerRemoveFriendRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsServerRemoveFriendRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsServerRemoveFriendRequestWrapper() = default; + + PFFriendsServerRemoveFriendRequestWrapper(const PFFriendsServerRemoveFriendRequest& model) : + ModelWrapper{ model }, + m_friendPlayFabId{ SafeString(model.friendPlayFabId) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFFriendsServerRemoveFriendRequestWrapper(const PFFriendsServerRemoveFriendRequestWrapper& src) : + PFFriendsServerRemoveFriendRequestWrapper{ src.Model() } + { + } + + PFFriendsServerRemoveFriendRequestWrapper(PFFriendsServerRemoveFriendRequestWrapper&& src) : + PFFriendsServerRemoveFriendRequestWrapper{} + { + swap(*this, src); + } + + PFFriendsServerRemoveFriendRequestWrapper& operator=(PFFriendsServerRemoveFriendRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsServerRemoveFriendRequestWrapper() = default; + + friend void swap(PFFriendsServerRemoveFriendRequestWrapper& lhs, PFFriendsServerRemoveFriendRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_friendPlayFabId, rhs.m_friendPlayFabId); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFriendPlayFabId(String value) + { + m_friendPlayFabId = std::move(value); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_friendPlayFabId; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFFriendsServerSetFriendTagsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFFriendsServerSetFriendTagsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFFriendsServerSetFriendTagsRequestWrapper() = default; + + PFFriendsServerSetFriendTagsRequestWrapper(const PFFriendsServerSetFriendTagsRequest& model) : + ModelWrapper{ model }, + m_friendPlayFabId{ SafeString(model.friendPlayFabId) }, + m_playFabId{ SafeString(model.playFabId) }, + m_tags{ model.tags, model.tags + model.tagsCount } + { + SetModelPointers(); + } + + PFFriendsServerSetFriendTagsRequestWrapper(const PFFriendsServerSetFriendTagsRequestWrapper& src) : + PFFriendsServerSetFriendTagsRequestWrapper{ src.Model() } + { + } + + PFFriendsServerSetFriendTagsRequestWrapper(PFFriendsServerSetFriendTagsRequestWrapper&& src) : + PFFriendsServerSetFriendTagsRequestWrapper{} + { + swap(*this, src); + } + + PFFriendsServerSetFriendTagsRequestWrapper& operator=(PFFriendsServerSetFriendTagsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFFriendsServerSetFriendTagsRequestWrapper() = default; + + friend void swap(PFFriendsServerSetFriendTagsRequestWrapper& lhs, PFFriendsServerSetFriendTagsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_friendPlayFabId, rhs.m_friendPlayFabId); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_tags, rhs.m_tags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFriendPlayFabId(String value) + { + m_friendPlayFabId = std::move(value); + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.friendPlayFabId = m_friendPlayFabId.empty() ? nullptr : m_friendPlayFabId.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + } + + String m_friendPlayFabId; + String m_playFabId; + CStringVector m_tags; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/GroupsTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/GroupsTypeWrappers.h new file mode 100644 index 0000000..be36e60 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/GroupsTypeWrappers.h @@ -0,0 +1,3677 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFGroupsAcceptGroupApplicationRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsAcceptGroupApplicationRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsAcceptGroupApplicationRequestWrapper() = default; + + PFGroupsAcceptGroupApplicationRequestWrapper(const PFGroupsAcceptGroupApplicationRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsAcceptGroupApplicationRequestWrapper(const PFGroupsAcceptGroupApplicationRequestWrapper& src) : + PFGroupsAcceptGroupApplicationRequestWrapper{ src.Model() } + { + } + + PFGroupsAcceptGroupApplicationRequestWrapper(PFGroupsAcceptGroupApplicationRequestWrapper&& src) : + PFGroupsAcceptGroupApplicationRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsAcceptGroupApplicationRequestWrapper& operator=(PFGroupsAcceptGroupApplicationRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsAcceptGroupApplicationRequestWrapper() = default; + + friend void swap(PFGroupsAcceptGroupApplicationRequestWrapper& lhs, PFGroupsAcceptGroupApplicationRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsAcceptGroupInvitationRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsAcceptGroupInvitationRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsAcceptGroupInvitationRequestWrapper() = default; + + PFGroupsAcceptGroupInvitationRequestWrapper(const PFGroupsAcceptGroupInvitationRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsAcceptGroupInvitationRequestWrapper(const PFGroupsAcceptGroupInvitationRequestWrapper& src) : + PFGroupsAcceptGroupInvitationRequestWrapper{ src.Model() } + { + } + + PFGroupsAcceptGroupInvitationRequestWrapper(PFGroupsAcceptGroupInvitationRequestWrapper&& src) : + PFGroupsAcceptGroupInvitationRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsAcceptGroupInvitationRequestWrapper& operator=(PFGroupsAcceptGroupInvitationRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsAcceptGroupInvitationRequestWrapper() = default; + + friend void swap(PFGroupsAcceptGroupInvitationRequestWrapper& lhs, PFGroupsAcceptGroupInvitationRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsAddMembersRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsAddMembersRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsAddMembersRequestWrapper() = default; + + PFGroupsAddMembersRequestWrapper(const PFGroupsAddMembersRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_members{ model.members, model.members + model.membersCount }, + m_roleId{ SafeString(model.roleId) } + { + SetModelPointers(); + } + + PFGroupsAddMembersRequestWrapper(const PFGroupsAddMembersRequestWrapper& src) : + PFGroupsAddMembersRequestWrapper{ src.Model() } + { + } + + PFGroupsAddMembersRequestWrapper(PFGroupsAddMembersRequestWrapper&& src) : + PFGroupsAddMembersRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsAddMembersRequestWrapper& operator=(PFGroupsAddMembersRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsAddMembersRequestWrapper() = default; + + friend void swap(PFGroupsAddMembersRequestWrapper& lhs, PFGroupsAddMembersRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_members, rhs.m_members); + swap(lhs.m_roleId, rhs.m_roleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetMembers(ModelVector, Alloc> value) + { + m_members = std::move(value); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.membersCount = static_cast(m_members.size()); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; + ModelVector, Alloc> m_members; + String m_roleId; +}; + +template class Alloc = std::allocator> +class PFGroupsApplyToGroupRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsApplyToGroupRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsApplyToGroupRequestWrapper() = default; + + PFGroupsApplyToGroupRequestWrapper(const PFGroupsApplyToGroupRequest& model) : + ModelWrapper{ model }, + m_autoAcceptOutstandingInvite{ model.autoAcceptOutstandingInvite ? std::optional{ *model.autoAcceptOutstandingInvite } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsApplyToGroupRequestWrapper(const PFGroupsApplyToGroupRequestWrapper& src) : + PFGroupsApplyToGroupRequestWrapper{ src.Model() } + { + } + + PFGroupsApplyToGroupRequestWrapper(PFGroupsApplyToGroupRequestWrapper&& src) : + PFGroupsApplyToGroupRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsApplyToGroupRequestWrapper& operator=(PFGroupsApplyToGroupRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsApplyToGroupRequestWrapper() = default; + + friend void swap(PFGroupsApplyToGroupRequestWrapper& lhs, PFGroupsApplyToGroupRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_autoAcceptOutstandingInvite, rhs.m_autoAcceptOutstandingInvite); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAutoAcceptOutstandingInvite(std::optional value) + { + m_autoAcceptOutstandingInvite = std::move(value); + this->m_model.autoAcceptOutstandingInvite = m_autoAcceptOutstandingInvite ? m_autoAcceptOutstandingInvite.operator->() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.autoAcceptOutstandingInvite = m_autoAcceptOutstandingInvite ? m_autoAcceptOutstandingInvite.operator->() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.group = &m_group.Model(); + } + + std::optional m_autoAcceptOutstandingInvite; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsEntityWithLineageWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsEntityWithLineage; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsEntityWithLineageWrapper() = default; + + PFGroupsEntityWithLineageWrapper(const PFGroupsEntityWithLineage& model) : + ModelWrapper{ model }, + m_key{ model.key ? std::optional>{ *model.key } : std::nullopt }, + m_lineage{ model.lineage, model.lineage + model.lineageCount } + { + SetModelPointers(); + } + + PFGroupsEntityWithLineageWrapper(const PFGroupsEntityWithLineageWrapper& src) : + PFGroupsEntityWithLineageWrapper{ src.Model() } + { + } + + PFGroupsEntityWithLineageWrapper(PFGroupsEntityWithLineageWrapper&& src) : + PFGroupsEntityWithLineageWrapper{} + { + swap(*this, src); + } + + PFGroupsEntityWithLineageWrapper& operator=(PFGroupsEntityWithLineageWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsEntityWithLineageWrapper() = default; + + friend void swap(PFGroupsEntityWithLineageWrapper& lhs, PFGroupsEntityWithLineageWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_key, rhs.m_key); + swap(lhs.m_lineage, rhs.m_lineage); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKey(std::optional> value) + { + m_key = std::move(value); + this->m_model.key = m_key ? &m_key->Model() : nullptr; + } + + void SetLineage(ModelDictionaryEntryVector, Alloc> value) + { + m_lineage = std::move(value); + this->m_model.lineage = m_lineage.empty() ? nullptr : m_lineage.data(); + this->m_model.lineageCount = static_cast(m_lineage.size()); + } + +private: + void SetModelPointers() + { + this->m_model.key = m_key ? &m_key->Model() : nullptr; + this->m_model.lineage = m_lineage.empty() ? nullptr : m_lineage.data(); + } + + std::optional> m_key; + ModelDictionaryEntryVector, Alloc> m_lineage; +}; + +template class Alloc = std::allocator> +class PFGroupsApplyToGroupResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsApplyToGroupResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsApplyToGroupResponseWrapper() = default; + + PFGroupsApplyToGroupResponseWrapper(const PFGroupsApplyToGroupResponse& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_group{ model.group ? std::optional>{ *model.group } : std::nullopt } + { + SetModelPointers(); + } + + PFGroupsApplyToGroupResponseWrapper(const PFGroupsApplyToGroupResponseWrapper& src) : + PFGroupsApplyToGroupResponseWrapper{ src.Model() } + { + } + + PFGroupsApplyToGroupResponseWrapper(PFGroupsApplyToGroupResponseWrapper&& src) : + PFGroupsApplyToGroupResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsApplyToGroupResponseWrapper& operator=(PFGroupsApplyToGroupResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsApplyToGroupResponseWrapper() = default; + + friend void swap(PFGroupsApplyToGroupResponseWrapper& lhs, PFGroupsApplyToGroupResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetExpires(time_t value) + { + this->m_model.expires = value; + } + + void SetGroup(std::optional> value) + { + m_group = std::move(value); + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + + std::optional> m_entity; + std::optional> m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsBlockEntityRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsBlockEntityRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsBlockEntityRequestWrapper() = default; + + PFGroupsBlockEntityRequestWrapper(const PFGroupsBlockEntityRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsBlockEntityRequestWrapper(const PFGroupsBlockEntityRequestWrapper& src) : + PFGroupsBlockEntityRequestWrapper{ src.Model() } + { + } + + PFGroupsBlockEntityRequestWrapper(PFGroupsBlockEntityRequestWrapper&& src) : + PFGroupsBlockEntityRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsBlockEntityRequestWrapper& operator=(PFGroupsBlockEntityRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsBlockEntityRequestWrapper() = default; + + friend void swap(PFGroupsBlockEntityRequestWrapper& lhs, PFGroupsBlockEntityRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsChangeMemberRoleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsChangeMemberRoleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsChangeMemberRoleRequestWrapper() = default; + + PFGroupsChangeMemberRoleRequestWrapper(const PFGroupsChangeMemberRoleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_destinationRoleId{ SafeString(model.destinationRoleId) }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_members{ model.members, model.members + model.membersCount }, + m_originRoleId{ SafeString(model.originRoleId) } + { + SetModelPointers(); + } + + PFGroupsChangeMemberRoleRequestWrapper(const PFGroupsChangeMemberRoleRequestWrapper& src) : + PFGroupsChangeMemberRoleRequestWrapper{ src.Model() } + { + } + + PFGroupsChangeMemberRoleRequestWrapper(PFGroupsChangeMemberRoleRequestWrapper&& src) : + PFGroupsChangeMemberRoleRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsChangeMemberRoleRequestWrapper& operator=(PFGroupsChangeMemberRoleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsChangeMemberRoleRequestWrapper() = default; + + friend void swap(PFGroupsChangeMemberRoleRequestWrapper& lhs, PFGroupsChangeMemberRoleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_destinationRoleId, rhs.m_destinationRoleId); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_members, rhs.m_members); + swap(lhs.m_originRoleId, rhs.m_originRoleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDestinationRoleId(String value) + { + m_destinationRoleId = std::move(value); + this->m_model.destinationRoleId = m_destinationRoleId.empty() ? nullptr : m_destinationRoleId.data(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetMembers(ModelVector, Alloc> value) + { + m_members = std::move(value); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.membersCount = static_cast(m_members.size()); + } + + void SetOriginRoleId(String value) + { + m_originRoleId = std::move(value); + this->m_model.originRoleId = m_originRoleId.empty() ? nullptr : m_originRoleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.destinationRoleId = m_destinationRoleId.empty() ? nullptr : m_destinationRoleId.data(); + this->m_model.group = &m_group.Model(); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.originRoleId = m_originRoleId.empty() ? nullptr : m_originRoleId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_destinationRoleId; + PFEntityKeyWrapper m_group; + ModelVector, Alloc> m_members; + String m_originRoleId; +}; + +template class Alloc = std::allocator> +class PFGroupsCreateGroupRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsCreateGroupRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsCreateGroupRequestWrapper() = default; + + PFGroupsCreateGroupRequestWrapper(const PFGroupsCreateGroupRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_groupName{ SafeString(model.groupName) } + { + SetModelPointers(); + } + + PFGroupsCreateGroupRequestWrapper(const PFGroupsCreateGroupRequestWrapper& src) : + PFGroupsCreateGroupRequestWrapper{ src.Model() } + { + } + + PFGroupsCreateGroupRequestWrapper(PFGroupsCreateGroupRequestWrapper&& src) : + PFGroupsCreateGroupRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsCreateGroupRequestWrapper& operator=(PFGroupsCreateGroupRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsCreateGroupRequestWrapper() = default; + + friend void swap(PFGroupsCreateGroupRequestWrapper& lhs, PFGroupsCreateGroupRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_groupName, rhs.m_groupName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetGroupName(String value) + { + m_groupName = std::move(value); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_groupName; +}; + +template class Alloc = std::allocator> +class PFGroupsCreateGroupResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsCreateGroupResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsCreateGroupResponseWrapper() = default; + + PFGroupsCreateGroupResponseWrapper(const PFGroupsCreateGroupResponse& model) : + ModelWrapper{ model }, + m_adminRoleId{ SafeString(model.adminRoleId) }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_groupName{ SafeString(model.groupName) }, + m_memberRoleId{ SafeString(model.memberRoleId) }, + m_roles{ model.roles, model.roles + model.rolesCount } + { + SetModelPointers(); + } + + PFGroupsCreateGroupResponseWrapper(const PFGroupsCreateGroupResponseWrapper& src) : + PFGroupsCreateGroupResponseWrapper{ src.Model() } + { + } + + PFGroupsCreateGroupResponseWrapper(PFGroupsCreateGroupResponseWrapper&& src) : + PFGroupsCreateGroupResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsCreateGroupResponseWrapper& operator=(PFGroupsCreateGroupResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsCreateGroupResponseWrapper() = default; + + friend void swap(PFGroupsCreateGroupResponseWrapper& lhs, PFGroupsCreateGroupResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_adminRoleId, rhs.m_adminRoleId); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_groupName, rhs.m_groupName); + swap(lhs.m_memberRoleId, rhs.m_memberRoleId); + swap(lhs.m_roles, rhs.m_roles); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdminRoleId(String value) + { + m_adminRoleId = std::move(value); + this->m_model.adminRoleId = m_adminRoleId.empty() ? nullptr : m_adminRoleId.data(); + } + + void SetCreated(time_t value) + { + this->m_model.created = value; + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetGroupName(String value) + { + m_groupName = std::move(value); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + + void SetMemberRoleId(String value) + { + m_memberRoleId = std::move(value); + this->m_model.memberRoleId = m_memberRoleId.empty() ? nullptr : m_memberRoleId.data(); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetRoles(StringDictionaryEntryVector value) + { + m_roles = std::move(value); + this->m_model.roles = m_roles.empty() ? nullptr : m_roles.data(); + this->m_model.rolesCount = static_cast(m_roles.size()); + } + +private: + void SetModelPointers() + { + this->m_model.adminRoleId = m_adminRoleId.empty() ? nullptr : m_adminRoleId.data(); + this->m_model.group = &m_group.Model(); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + this->m_model.memberRoleId = m_memberRoleId.empty() ? nullptr : m_memberRoleId.data(); + this->m_model.roles = m_roles.empty() ? nullptr : m_roles.data(); + } + + String m_adminRoleId; + PFEntityKeyWrapper m_group; + String m_groupName; + String m_memberRoleId; + StringDictionaryEntryVector m_roles; +}; + +template class Alloc = std::allocator> +class PFGroupsCreateGroupRoleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsCreateGroupRoleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsCreateGroupRoleRequestWrapper() = default; + + PFGroupsCreateGroupRoleRequestWrapper(const PFGroupsCreateGroupRoleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_roleId{ SafeString(model.roleId) }, + m_roleName{ SafeString(model.roleName) } + { + SetModelPointers(); + } + + PFGroupsCreateGroupRoleRequestWrapper(const PFGroupsCreateGroupRoleRequestWrapper& src) : + PFGroupsCreateGroupRoleRequestWrapper{ src.Model() } + { + } + + PFGroupsCreateGroupRoleRequestWrapper(PFGroupsCreateGroupRoleRequestWrapper&& src) : + PFGroupsCreateGroupRoleRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsCreateGroupRoleRequestWrapper& operator=(PFGroupsCreateGroupRoleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsCreateGroupRoleRequestWrapper() = default; + + friend void swap(PFGroupsCreateGroupRoleRequestWrapper& lhs, PFGroupsCreateGroupRoleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_roleId, rhs.m_roleId); + swap(lhs.m_roleName, rhs.m_roleName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + void SetRoleName(String value) + { + m_roleName = std::move(value); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; + String m_roleId; + String m_roleName; +}; + +template class Alloc = std::allocator> +class PFGroupsCreateGroupRoleResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsCreateGroupRoleResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsCreateGroupRoleResponseWrapper() = default; + + PFGroupsCreateGroupRoleResponseWrapper(const PFGroupsCreateGroupRoleResponse& model) : + ModelWrapper{ model }, + m_roleId{ SafeString(model.roleId) }, + m_roleName{ SafeString(model.roleName) } + { + SetModelPointers(); + } + + PFGroupsCreateGroupRoleResponseWrapper(const PFGroupsCreateGroupRoleResponseWrapper& src) : + PFGroupsCreateGroupRoleResponseWrapper{ src.Model() } + { + } + + PFGroupsCreateGroupRoleResponseWrapper(PFGroupsCreateGroupRoleResponseWrapper&& src) : + PFGroupsCreateGroupRoleResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsCreateGroupRoleResponseWrapper& operator=(PFGroupsCreateGroupRoleResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsCreateGroupRoleResponseWrapper() = default; + + friend void swap(PFGroupsCreateGroupRoleResponseWrapper& lhs, PFGroupsCreateGroupRoleResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_roleId, rhs.m_roleId); + swap(lhs.m_roleName, rhs.m_roleName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + void SetRoleName(String value) + { + m_roleName = std::move(value); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + + String m_roleId; + String m_roleName; +}; + +template class Alloc = std::allocator> +class PFGroupsDeleteGroupRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsDeleteGroupRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsDeleteGroupRequestWrapper() = default; + + PFGroupsDeleteGroupRequestWrapper(const PFGroupsDeleteGroupRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsDeleteGroupRequestWrapper(const PFGroupsDeleteGroupRequestWrapper& src) : + PFGroupsDeleteGroupRequestWrapper{ src.Model() } + { + } + + PFGroupsDeleteGroupRequestWrapper(PFGroupsDeleteGroupRequestWrapper&& src) : + PFGroupsDeleteGroupRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsDeleteGroupRequestWrapper& operator=(PFGroupsDeleteGroupRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsDeleteGroupRequestWrapper() = default; + + friend void swap(PFGroupsDeleteGroupRequestWrapper& lhs, PFGroupsDeleteGroupRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsDeleteRoleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsDeleteRoleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsDeleteRoleRequestWrapper() = default; + + PFGroupsDeleteRoleRequestWrapper(const PFGroupsDeleteRoleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_roleId{ SafeString(model.roleId) } + { + SetModelPointers(); + } + + PFGroupsDeleteRoleRequestWrapper(const PFGroupsDeleteRoleRequestWrapper& src) : + PFGroupsDeleteRoleRequestWrapper{ src.Model() } + { + } + + PFGroupsDeleteRoleRequestWrapper(PFGroupsDeleteRoleRequestWrapper&& src) : + PFGroupsDeleteRoleRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsDeleteRoleRequestWrapper& operator=(PFGroupsDeleteRoleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsDeleteRoleRequestWrapper() = default; + + friend void swap(PFGroupsDeleteRoleRequestWrapper& lhs, PFGroupsDeleteRoleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_roleId, rhs.m_roleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; + String m_roleId; +}; + +template class Alloc = std::allocator> +class PFGroupsGetGroupRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsGetGroupRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsGetGroupRequestWrapper() = default; + + PFGroupsGetGroupRequestWrapper(const PFGroupsGetGroupRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? std::optional>{ *model.group } : std::nullopt }, + m_groupName{ SafeString(model.groupName) } + { + SetModelPointers(); + } + + PFGroupsGetGroupRequestWrapper(const PFGroupsGetGroupRequestWrapper& src) : + PFGroupsGetGroupRequestWrapper{ src.Model() } + { + } + + PFGroupsGetGroupRequestWrapper(PFGroupsGetGroupRequestWrapper&& src) : + PFGroupsGetGroupRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsGetGroupRequestWrapper& operator=(PFGroupsGetGroupRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsGetGroupRequestWrapper() = default; + + friend void swap(PFGroupsGetGroupRequestWrapper& lhs, PFGroupsGetGroupRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_groupName, rhs.m_groupName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(std::optional> value) + { + m_group = std::move(value); + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + + void SetGroupName(String value) + { + m_groupName = std::move(value); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = m_group ? &m_group->Model() : nullptr; + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_group; + String m_groupName; +}; + +template class Alloc = std::allocator> +class PFGroupsGetGroupResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsGetGroupResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsGetGroupResponseWrapper() = default; + + PFGroupsGetGroupResponseWrapper(const PFGroupsGetGroupResponse& model) : + ModelWrapper{ model }, + m_adminRoleId{ SafeString(model.adminRoleId) }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_groupName{ SafeString(model.groupName) }, + m_memberRoleId{ SafeString(model.memberRoleId) }, + m_roles{ model.roles, model.roles + model.rolesCount } + { + SetModelPointers(); + } + + PFGroupsGetGroupResponseWrapper(const PFGroupsGetGroupResponseWrapper& src) : + PFGroupsGetGroupResponseWrapper{ src.Model() } + { + } + + PFGroupsGetGroupResponseWrapper(PFGroupsGetGroupResponseWrapper&& src) : + PFGroupsGetGroupResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsGetGroupResponseWrapper& operator=(PFGroupsGetGroupResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsGetGroupResponseWrapper() = default; + + friend void swap(PFGroupsGetGroupResponseWrapper& lhs, PFGroupsGetGroupResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_adminRoleId, rhs.m_adminRoleId); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_groupName, rhs.m_groupName); + swap(lhs.m_memberRoleId, rhs.m_memberRoleId); + swap(lhs.m_roles, rhs.m_roles); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdminRoleId(String value) + { + m_adminRoleId = std::move(value); + this->m_model.adminRoleId = m_adminRoleId.empty() ? nullptr : m_adminRoleId.data(); + } + + void SetCreated(time_t value) + { + this->m_model.created = value; + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetGroupName(String value) + { + m_groupName = std::move(value); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + + void SetMemberRoleId(String value) + { + m_memberRoleId = std::move(value); + this->m_model.memberRoleId = m_memberRoleId.empty() ? nullptr : m_memberRoleId.data(); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetRoles(StringDictionaryEntryVector value) + { + m_roles = std::move(value); + this->m_model.roles = m_roles.empty() ? nullptr : m_roles.data(); + this->m_model.rolesCount = static_cast(m_roles.size()); + } + +private: + void SetModelPointers() + { + this->m_model.adminRoleId = m_adminRoleId.empty() ? nullptr : m_adminRoleId.data(); + this->m_model.group = &m_group.Model(); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + this->m_model.memberRoleId = m_memberRoleId.empty() ? nullptr : m_memberRoleId.data(); + this->m_model.roles = m_roles.empty() ? nullptr : m_roles.data(); + } + + String m_adminRoleId; + PFEntityKeyWrapper m_group; + String m_groupName; + String m_memberRoleId; + StringDictionaryEntryVector m_roles; +}; + +template class Alloc = std::allocator> +class PFGroupsInviteToGroupRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsInviteToGroupRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsInviteToGroupRequestWrapper() = default; + + PFGroupsInviteToGroupRequestWrapper(const PFGroupsInviteToGroupRequest& model) : + ModelWrapper{ model }, + m_autoAcceptOutstandingApplication{ model.autoAcceptOutstandingApplication ? std::optional{ *model.autoAcceptOutstandingApplication } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_roleId{ SafeString(model.roleId) } + { + SetModelPointers(); + } + + PFGroupsInviteToGroupRequestWrapper(const PFGroupsInviteToGroupRequestWrapper& src) : + PFGroupsInviteToGroupRequestWrapper{ src.Model() } + { + } + + PFGroupsInviteToGroupRequestWrapper(PFGroupsInviteToGroupRequestWrapper&& src) : + PFGroupsInviteToGroupRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsInviteToGroupRequestWrapper& operator=(PFGroupsInviteToGroupRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsInviteToGroupRequestWrapper() = default; + + friend void swap(PFGroupsInviteToGroupRequestWrapper& lhs, PFGroupsInviteToGroupRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_autoAcceptOutstandingApplication, rhs.m_autoAcceptOutstandingApplication); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_roleId, rhs.m_roleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAutoAcceptOutstandingApplication(std::optional value) + { + m_autoAcceptOutstandingApplication = std::move(value); + this->m_model.autoAcceptOutstandingApplication = m_autoAcceptOutstandingApplication ? m_autoAcceptOutstandingApplication.operator->() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.autoAcceptOutstandingApplication = m_autoAcceptOutstandingApplication ? m_autoAcceptOutstandingApplication.operator->() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.group = &m_group.Model(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + std::optional m_autoAcceptOutstandingApplication; + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + PFEntityKeyWrapper m_group; + String m_roleId; +}; + +template class Alloc = std::allocator> +class PFGroupsInviteToGroupResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsInviteToGroupResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsInviteToGroupResponseWrapper() = default; + + PFGroupsInviteToGroupResponseWrapper(const PFGroupsInviteToGroupResponse& model) : + ModelWrapper{ model }, + m_group{ model.group ? std::optional>{ *model.group } : std::nullopt }, + m_invitedByEntity{ model.invitedByEntity ? std::optional>{ *model.invitedByEntity } : std::nullopt }, + m_invitedEntity{ model.invitedEntity ? std::optional>{ *model.invitedEntity } : std::nullopt }, + m_roleId{ SafeString(model.roleId) } + { + SetModelPointers(); + } + + PFGroupsInviteToGroupResponseWrapper(const PFGroupsInviteToGroupResponseWrapper& src) : + PFGroupsInviteToGroupResponseWrapper{ src.Model() } + { + } + + PFGroupsInviteToGroupResponseWrapper(PFGroupsInviteToGroupResponseWrapper&& src) : + PFGroupsInviteToGroupResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsInviteToGroupResponseWrapper& operator=(PFGroupsInviteToGroupResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsInviteToGroupResponseWrapper() = default; + + friend void swap(PFGroupsInviteToGroupResponseWrapper& lhs, PFGroupsInviteToGroupResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_invitedByEntity, rhs.m_invitedByEntity); + swap(lhs.m_invitedEntity, rhs.m_invitedEntity); + swap(lhs.m_roleId, rhs.m_roleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetExpires(time_t value) + { + this->m_model.expires = value; + } + + void SetGroup(std::optional> value) + { + m_group = std::move(value); + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + + void SetInvitedByEntity(std::optional> value) + { + m_invitedByEntity = std::move(value); + this->m_model.invitedByEntity = m_invitedByEntity ? &m_invitedByEntity->Model() : nullptr; + } + + void SetInvitedEntity(std::optional> value) + { + m_invitedEntity = std::move(value); + this->m_model.invitedEntity = m_invitedEntity ? &m_invitedEntity->Model() : nullptr; + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.group = m_group ? &m_group->Model() : nullptr; + this->m_model.invitedByEntity = m_invitedByEntity ? &m_invitedByEntity->Model() : nullptr; + this->m_model.invitedEntity = m_invitedEntity ? &m_invitedEntity->Model() : nullptr; + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + std::optional> m_group; + std::optional> m_invitedByEntity; + std::optional> m_invitedEntity; + String m_roleId; +}; + +template class Alloc = std::allocator> +class PFGroupsIsMemberRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsIsMemberRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsIsMemberRequestWrapper() = default; + + PFGroupsIsMemberRequestWrapper(const PFGroupsIsMemberRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_roleId{ SafeString(model.roleId) } + { + SetModelPointers(); + } + + PFGroupsIsMemberRequestWrapper(const PFGroupsIsMemberRequestWrapper& src) : + PFGroupsIsMemberRequestWrapper{ src.Model() } + { + } + + PFGroupsIsMemberRequestWrapper(PFGroupsIsMemberRequestWrapper&& src) : + PFGroupsIsMemberRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsIsMemberRequestWrapper& operator=(PFGroupsIsMemberRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsIsMemberRequestWrapper() = default; + + friend void swap(PFGroupsIsMemberRequestWrapper& lhs, PFGroupsIsMemberRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_roleId, rhs.m_roleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.group = &m_group.Model(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + PFEntityKeyWrapper m_group; + String m_roleId; +}; + +template class Alloc = std::allocator> +class PFGroupsIsMemberResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsIsMemberResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetIsMember(bool value) + { + this->m_model.isMember = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupApplicationsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupApplicationsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupApplicationsRequestWrapper() = default; + + PFGroupsListGroupApplicationsRequestWrapper(const PFGroupsListGroupApplicationsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsListGroupApplicationsRequestWrapper(const PFGroupsListGroupApplicationsRequestWrapper& src) : + PFGroupsListGroupApplicationsRequestWrapper{ src.Model() } + { + } + + PFGroupsListGroupApplicationsRequestWrapper(PFGroupsListGroupApplicationsRequestWrapper&& src) : + PFGroupsListGroupApplicationsRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupApplicationsRequestWrapper& operator=(PFGroupsListGroupApplicationsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupApplicationsRequestWrapper() = default; + + friend void swap(PFGroupsListGroupApplicationsRequestWrapper& lhs, PFGroupsListGroupApplicationsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsGroupApplicationWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsGroupApplication; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsGroupApplicationWrapper() = default; + + PFGroupsGroupApplicationWrapper(const PFGroupsGroupApplication& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_group{ model.group ? std::optional>{ *model.group } : std::nullopt } + { + SetModelPointers(); + } + + PFGroupsGroupApplicationWrapper(const PFGroupsGroupApplicationWrapper& src) : + PFGroupsGroupApplicationWrapper{ src.Model() } + { + } + + PFGroupsGroupApplicationWrapper(PFGroupsGroupApplicationWrapper&& src) : + PFGroupsGroupApplicationWrapper{} + { + swap(*this, src); + } + + PFGroupsGroupApplicationWrapper& operator=(PFGroupsGroupApplicationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsGroupApplicationWrapper() = default; + + friend void swap(PFGroupsGroupApplicationWrapper& lhs, PFGroupsGroupApplicationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetExpires(time_t value) + { + this->m_model.expires = value; + } + + void SetGroup(std::optional> value) + { + m_group = std::move(value); + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + + std::optional> m_entity; + std::optional> m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupApplicationsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupApplicationsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupApplicationsResponseWrapper() = default; + + PFGroupsListGroupApplicationsResponseWrapper(const PFGroupsListGroupApplicationsResponse& model) : + ModelWrapper{ model }, + m_applications{ model.applications, model.applications + model.applicationsCount } + { + SetModelPointers(); + } + + PFGroupsListGroupApplicationsResponseWrapper(const PFGroupsListGroupApplicationsResponseWrapper& src) : + PFGroupsListGroupApplicationsResponseWrapper{ src.Model() } + { + } + + PFGroupsListGroupApplicationsResponseWrapper(PFGroupsListGroupApplicationsResponseWrapper&& src) : + PFGroupsListGroupApplicationsResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupApplicationsResponseWrapper& operator=(PFGroupsListGroupApplicationsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupApplicationsResponseWrapper() = default; + + friend void swap(PFGroupsListGroupApplicationsResponseWrapper& lhs, PFGroupsListGroupApplicationsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_applications, rhs.m_applications); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetApplications(ModelVector, Alloc> value) + { + m_applications = std::move(value); + this->m_model.applications = m_applications.empty() ? nullptr : m_applications.data(); + this->m_model.applicationsCount = static_cast(m_applications.size()); + } + +private: + void SetModelPointers() + { + this->m_model.applications = m_applications.empty() ? nullptr : m_applications.data(); + } + + ModelVector, Alloc> m_applications; +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupBlocksRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupBlocksRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupBlocksRequestWrapper() = default; + + PFGroupsListGroupBlocksRequestWrapper(const PFGroupsListGroupBlocksRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsListGroupBlocksRequestWrapper(const PFGroupsListGroupBlocksRequestWrapper& src) : + PFGroupsListGroupBlocksRequestWrapper{ src.Model() } + { + } + + PFGroupsListGroupBlocksRequestWrapper(PFGroupsListGroupBlocksRequestWrapper&& src) : + PFGroupsListGroupBlocksRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupBlocksRequestWrapper& operator=(PFGroupsListGroupBlocksRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupBlocksRequestWrapper() = default; + + friend void swap(PFGroupsListGroupBlocksRequestWrapper& lhs, PFGroupsListGroupBlocksRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsGroupBlockWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsGroupBlock; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsGroupBlockWrapper() = default; + + PFGroupsGroupBlockWrapper(const PFGroupsGroupBlock& model) : + ModelWrapper{ model }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsGroupBlockWrapper(const PFGroupsGroupBlockWrapper& src) : + PFGroupsGroupBlockWrapper{ src.Model() } + { + } + + PFGroupsGroupBlockWrapper(PFGroupsGroupBlockWrapper&& src) : + PFGroupsGroupBlockWrapper{} + { + swap(*this, src); + } + + PFGroupsGroupBlockWrapper& operator=(PFGroupsGroupBlockWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsGroupBlockWrapper() = default; + + friend void swap(PFGroupsGroupBlockWrapper& lhs, PFGroupsGroupBlockWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.group = &m_group.Model(); + } + + std::optional> m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupBlocksResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupBlocksResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupBlocksResponseWrapper() = default; + + PFGroupsListGroupBlocksResponseWrapper(const PFGroupsListGroupBlocksResponse& model) : + ModelWrapper{ model }, + m_blockedEntities{ model.blockedEntities, model.blockedEntities + model.blockedEntitiesCount } + { + SetModelPointers(); + } + + PFGroupsListGroupBlocksResponseWrapper(const PFGroupsListGroupBlocksResponseWrapper& src) : + PFGroupsListGroupBlocksResponseWrapper{ src.Model() } + { + } + + PFGroupsListGroupBlocksResponseWrapper(PFGroupsListGroupBlocksResponseWrapper&& src) : + PFGroupsListGroupBlocksResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupBlocksResponseWrapper& operator=(PFGroupsListGroupBlocksResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupBlocksResponseWrapper() = default; + + friend void swap(PFGroupsListGroupBlocksResponseWrapper& lhs, PFGroupsListGroupBlocksResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_blockedEntities, rhs.m_blockedEntities); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBlockedEntities(ModelVector, Alloc> value) + { + m_blockedEntities = std::move(value); + this->m_model.blockedEntities = m_blockedEntities.empty() ? nullptr : m_blockedEntities.data(); + this->m_model.blockedEntitiesCount = static_cast(m_blockedEntities.size()); + } + +private: + void SetModelPointers() + { + this->m_model.blockedEntities = m_blockedEntities.empty() ? nullptr : m_blockedEntities.data(); + } + + ModelVector, Alloc> m_blockedEntities; +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupInvitationsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupInvitationsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupInvitationsRequestWrapper() = default; + + PFGroupsListGroupInvitationsRequestWrapper(const PFGroupsListGroupInvitationsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsListGroupInvitationsRequestWrapper(const PFGroupsListGroupInvitationsRequestWrapper& src) : + PFGroupsListGroupInvitationsRequestWrapper{ src.Model() } + { + } + + PFGroupsListGroupInvitationsRequestWrapper(PFGroupsListGroupInvitationsRequestWrapper&& src) : + PFGroupsListGroupInvitationsRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupInvitationsRequestWrapper& operator=(PFGroupsListGroupInvitationsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupInvitationsRequestWrapper() = default; + + friend void swap(PFGroupsListGroupInvitationsRequestWrapper& lhs, PFGroupsListGroupInvitationsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsGroupInvitationWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsGroupInvitation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsGroupInvitationWrapper() = default; + + PFGroupsGroupInvitationWrapper(const PFGroupsGroupInvitation& model) : + ModelWrapper{ model }, + m_group{ model.group ? std::optional>{ *model.group } : std::nullopt }, + m_invitedByEntity{ model.invitedByEntity ? std::optional>{ *model.invitedByEntity } : std::nullopt }, + m_invitedEntity{ model.invitedEntity ? std::optional>{ *model.invitedEntity } : std::nullopt }, + m_roleId{ SafeString(model.roleId) } + { + SetModelPointers(); + } + + PFGroupsGroupInvitationWrapper(const PFGroupsGroupInvitationWrapper& src) : + PFGroupsGroupInvitationWrapper{ src.Model() } + { + } + + PFGroupsGroupInvitationWrapper(PFGroupsGroupInvitationWrapper&& src) : + PFGroupsGroupInvitationWrapper{} + { + swap(*this, src); + } + + PFGroupsGroupInvitationWrapper& operator=(PFGroupsGroupInvitationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsGroupInvitationWrapper() = default; + + friend void swap(PFGroupsGroupInvitationWrapper& lhs, PFGroupsGroupInvitationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_invitedByEntity, rhs.m_invitedByEntity); + swap(lhs.m_invitedEntity, rhs.m_invitedEntity); + swap(lhs.m_roleId, rhs.m_roleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetExpires(time_t value) + { + this->m_model.expires = value; + } + + void SetGroup(std::optional> value) + { + m_group = std::move(value); + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + + void SetInvitedByEntity(std::optional> value) + { + m_invitedByEntity = std::move(value); + this->m_model.invitedByEntity = m_invitedByEntity ? &m_invitedByEntity->Model() : nullptr; + } + + void SetInvitedEntity(std::optional> value) + { + m_invitedEntity = std::move(value); + this->m_model.invitedEntity = m_invitedEntity ? &m_invitedEntity->Model() : nullptr; + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.group = m_group ? &m_group->Model() : nullptr; + this->m_model.invitedByEntity = m_invitedByEntity ? &m_invitedByEntity->Model() : nullptr; + this->m_model.invitedEntity = m_invitedEntity ? &m_invitedEntity->Model() : nullptr; + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + std::optional> m_group; + std::optional> m_invitedByEntity; + std::optional> m_invitedEntity; + String m_roleId; +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupInvitationsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupInvitationsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupInvitationsResponseWrapper() = default; + + PFGroupsListGroupInvitationsResponseWrapper(const PFGroupsListGroupInvitationsResponse& model) : + ModelWrapper{ model }, + m_invitations{ model.invitations, model.invitations + model.invitationsCount } + { + SetModelPointers(); + } + + PFGroupsListGroupInvitationsResponseWrapper(const PFGroupsListGroupInvitationsResponseWrapper& src) : + PFGroupsListGroupInvitationsResponseWrapper{ src.Model() } + { + } + + PFGroupsListGroupInvitationsResponseWrapper(PFGroupsListGroupInvitationsResponseWrapper&& src) : + PFGroupsListGroupInvitationsResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupInvitationsResponseWrapper& operator=(PFGroupsListGroupInvitationsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupInvitationsResponseWrapper() = default; + + friend void swap(PFGroupsListGroupInvitationsResponseWrapper& lhs, PFGroupsListGroupInvitationsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_invitations, rhs.m_invitations); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetInvitations(ModelVector, Alloc> value) + { + m_invitations = std::move(value); + this->m_model.invitations = m_invitations.empty() ? nullptr : m_invitations.data(); + this->m_model.invitationsCount = static_cast(m_invitations.size()); + } + +private: + void SetModelPointers() + { + this->m_model.invitations = m_invitations.empty() ? nullptr : m_invitations.data(); + } + + ModelVector, Alloc> m_invitations; +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupMembersRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupMembersRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupMembersRequestWrapper() = default; + + PFGroupsListGroupMembersRequestWrapper(const PFGroupsListGroupMembersRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsListGroupMembersRequestWrapper(const PFGroupsListGroupMembersRequestWrapper& src) : + PFGroupsListGroupMembersRequestWrapper{ src.Model() } + { + } + + PFGroupsListGroupMembersRequestWrapper(PFGroupsListGroupMembersRequestWrapper&& src) : + PFGroupsListGroupMembersRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupMembersRequestWrapper& operator=(PFGroupsListGroupMembersRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupMembersRequestWrapper() = default; + + friend void swap(PFGroupsListGroupMembersRequestWrapper& lhs, PFGroupsListGroupMembersRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsEntityMemberRoleWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsEntityMemberRole; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsEntityMemberRoleWrapper() = default; + + PFGroupsEntityMemberRoleWrapper(const PFGroupsEntityMemberRole& model) : + ModelWrapper{ model }, + m_members{ model.members, model.members + model.membersCount }, + m_roleId{ SafeString(model.roleId) }, + m_roleName{ SafeString(model.roleName) } + { + SetModelPointers(); + } + + PFGroupsEntityMemberRoleWrapper(const PFGroupsEntityMemberRoleWrapper& src) : + PFGroupsEntityMemberRoleWrapper{ src.Model() } + { + } + + PFGroupsEntityMemberRoleWrapper(PFGroupsEntityMemberRoleWrapper&& src) : + PFGroupsEntityMemberRoleWrapper{} + { + swap(*this, src); + } + + PFGroupsEntityMemberRoleWrapper& operator=(PFGroupsEntityMemberRoleWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsEntityMemberRoleWrapper() = default; + + friend void swap(PFGroupsEntityMemberRoleWrapper& lhs, PFGroupsEntityMemberRoleWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_members, rhs.m_members); + swap(lhs.m_roleId, rhs.m_roleId); + swap(lhs.m_roleName, rhs.m_roleName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetMembers(ModelVector, Alloc> value) + { + m_members = std::move(value); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.membersCount = static_cast(m_members.size()); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + void SetRoleName(String value) + { + m_roleName = std::move(value); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + + ModelVector, Alloc> m_members; + String m_roleId; + String m_roleName; +}; + +template class Alloc = std::allocator> +class PFGroupsListGroupMembersResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListGroupMembersResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListGroupMembersResponseWrapper() = default; + + PFGroupsListGroupMembersResponseWrapper(const PFGroupsListGroupMembersResponse& model) : + ModelWrapper{ model }, + m_members{ model.members, model.members + model.membersCount } + { + SetModelPointers(); + } + + PFGroupsListGroupMembersResponseWrapper(const PFGroupsListGroupMembersResponseWrapper& src) : + PFGroupsListGroupMembersResponseWrapper{ src.Model() } + { + } + + PFGroupsListGroupMembersResponseWrapper(PFGroupsListGroupMembersResponseWrapper&& src) : + PFGroupsListGroupMembersResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsListGroupMembersResponseWrapper& operator=(PFGroupsListGroupMembersResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListGroupMembersResponseWrapper() = default; + + friend void swap(PFGroupsListGroupMembersResponseWrapper& lhs, PFGroupsListGroupMembersResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_members, rhs.m_members); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetMembers(ModelVector, Alloc> value) + { + m_members = std::move(value); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.membersCount = static_cast(m_members.size()); + } + +private: + void SetModelPointers() + { + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + } + + ModelVector, Alloc> m_members; +}; + +template class Alloc = std::allocator> +class PFGroupsListMembershipRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListMembershipRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListMembershipRequestWrapper() = default; + + PFGroupsListMembershipRequestWrapper(const PFGroupsListMembershipRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFGroupsListMembershipRequestWrapper(const PFGroupsListMembershipRequestWrapper& src) : + PFGroupsListMembershipRequestWrapper{ src.Model() } + { + } + + PFGroupsListMembershipRequestWrapper(PFGroupsListMembershipRequestWrapper&& src) : + PFGroupsListMembershipRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsListMembershipRequestWrapper& operator=(PFGroupsListMembershipRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListMembershipRequestWrapper() = default; + + friend void swap(PFGroupsListMembershipRequestWrapper& lhs, PFGroupsListMembershipRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFGroupsGroupRoleWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsGroupRole; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsGroupRoleWrapper() = default; + + PFGroupsGroupRoleWrapper(const PFGroupsGroupRole& model) : + ModelWrapper{ model }, + m_roleId{ SafeString(model.roleId) }, + m_roleName{ SafeString(model.roleName) } + { + SetModelPointers(); + } + + PFGroupsGroupRoleWrapper(const PFGroupsGroupRoleWrapper& src) : + PFGroupsGroupRoleWrapper{ src.Model() } + { + } + + PFGroupsGroupRoleWrapper(PFGroupsGroupRoleWrapper&& src) : + PFGroupsGroupRoleWrapper{} + { + swap(*this, src); + } + + PFGroupsGroupRoleWrapper& operator=(PFGroupsGroupRoleWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsGroupRoleWrapper() = default; + + friend void swap(PFGroupsGroupRoleWrapper& lhs, PFGroupsGroupRoleWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_roleId, rhs.m_roleId); + swap(lhs.m_roleName, rhs.m_roleName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + void SetRoleName(String value) + { + m_roleName = std::move(value); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + + String m_roleId; + String m_roleName; +}; + +template class Alloc = std::allocator> +class PFGroupsGroupWithRolesWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsGroupWithRoles; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsGroupWithRolesWrapper() = default; + + PFGroupsGroupWithRolesWrapper(const PFGroupsGroupWithRoles& model) : + ModelWrapper{ model }, + m_group{ model.group ? std::optional>{ *model.group } : std::nullopt }, + m_groupName{ SafeString(model.groupName) }, + m_roles{ model.roles, model.roles + model.rolesCount } + { + SetModelPointers(); + } + + PFGroupsGroupWithRolesWrapper(const PFGroupsGroupWithRolesWrapper& src) : + PFGroupsGroupWithRolesWrapper{ src.Model() } + { + } + + PFGroupsGroupWithRolesWrapper(PFGroupsGroupWithRolesWrapper&& src) : + PFGroupsGroupWithRolesWrapper{} + { + swap(*this, src); + } + + PFGroupsGroupWithRolesWrapper& operator=(PFGroupsGroupWithRolesWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsGroupWithRolesWrapper() = default; + + friend void swap(PFGroupsGroupWithRolesWrapper& lhs, PFGroupsGroupWithRolesWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_groupName, rhs.m_groupName); + swap(lhs.m_roles, rhs.m_roles); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGroup(std::optional> value) + { + m_group = std::move(value); + this->m_model.group = m_group ? &m_group->Model() : nullptr; + } + + void SetGroupName(String value) + { + m_groupName = std::move(value); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetRoles(ModelVector, Alloc> value) + { + m_roles = std::move(value); + this->m_model.roles = m_roles.empty() ? nullptr : m_roles.data(); + this->m_model.rolesCount = static_cast(m_roles.size()); + } + +private: + void SetModelPointers() + { + this->m_model.group = m_group ? &m_group->Model() : nullptr; + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + this->m_model.roles = m_roles.empty() ? nullptr : m_roles.data(); + } + + std::optional> m_group; + String m_groupName; + ModelVector, Alloc> m_roles; +}; + +template class Alloc = std::allocator> +class PFGroupsListMembershipResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListMembershipResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListMembershipResponseWrapper() = default; + + PFGroupsListMembershipResponseWrapper(const PFGroupsListMembershipResponse& model) : + ModelWrapper{ model }, + m_groups{ model.groups, model.groups + model.groupsCount } + { + SetModelPointers(); + } + + PFGroupsListMembershipResponseWrapper(const PFGroupsListMembershipResponseWrapper& src) : + PFGroupsListMembershipResponseWrapper{ src.Model() } + { + } + + PFGroupsListMembershipResponseWrapper(PFGroupsListMembershipResponseWrapper&& src) : + PFGroupsListMembershipResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsListMembershipResponseWrapper& operator=(PFGroupsListMembershipResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListMembershipResponseWrapper() = default; + + friend void swap(PFGroupsListMembershipResponseWrapper& lhs, PFGroupsListMembershipResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_groups, rhs.m_groups); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGroups(ModelVector, Alloc> value) + { + m_groups = std::move(value); + this->m_model.groups = m_groups.empty() ? nullptr : m_groups.data(); + this->m_model.groupsCount = static_cast(m_groups.size()); + } + +private: + void SetModelPointers() + { + this->m_model.groups = m_groups.empty() ? nullptr : m_groups.data(); + } + + ModelVector, Alloc> m_groups; +}; + +template class Alloc = std::allocator> +class PFGroupsListMembershipOpportunitiesRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListMembershipOpportunitiesRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListMembershipOpportunitiesRequestWrapper() = default; + + PFGroupsListMembershipOpportunitiesRequestWrapper(const PFGroupsListMembershipOpportunitiesRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFGroupsListMembershipOpportunitiesRequestWrapper(const PFGroupsListMembershipOpportunitiesRequestWrapper& src) : + PFGroupsListMembershipOpportunitiesRequestWrapper{ src.Model() } + { + } + + PFGroupsListMembershipOpportunitiesRequestWrapper(PFGroupsListMembershipOpportunitiesRequestWrapper&& src) : + PFGroupsListMembershipOpportunitiesRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsListMembershipOpportunitiesRequestWrapper& operator=(PFGroupsListMembershipOpportunitiesRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListMembershipOpportunitiesRequestWrapper() = default; + + friend void swap(PFGroupsListMembershipOpportunitiesRequestWrapper& lhs, PFGroupsListMembershipOpportunitiesRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFGroupsListMembershipOpportunitiesResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsListMembershipOpportunitiesResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsListMembershipOpportunitiesResponseWrapper() = default; + + PFGroupsListMembershipOpportunitiesResponseWrapper(const PFGroupsListMembershipOpportunitiesResponse& model) : + ModelWrapper{ model }, + m_applications{ model.applications, model.applications + model.applicationsCount }, + m_invitations{ model.invitations, model.invitations + model.invitationsCount } + { + SetModelPointers(); + } + + PFGroupsListMembershipOpportunitiesResponseWrapper(const PFGroupsListMembershipOpportunitiesResponseWrapper& src) : + PFGroupsListMembershipOpportunitiesResponseWrapper{ src.Model() } + { + } + + PFGroupsListMembershipOpportunitiesResponseWrapper(PFGroupsListMembershipOpportunitiesResponseWrapper&& src) : + PFGroupsListMembershipOpportunitiesResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsListMembershipOpportunitiesResponseWrapper& operator=(PFGroupsListMembershipOpportunitiesResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsListMembershipOpportunitiesResponseWrapper() = default; + + friend void swap(PFGroupsListMembershipOpportunitiesResponseWrapper& lhs, PFGroupsListMembershipOpportunitiesResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_applications, rhs.m_applications); + swap(lhs.m_invitations, rhs.m_invitations); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetApplications(ModelVector, Alloc> value) + { + m_applications = std::move(value); + this->m_model.applications = m_applications.empty() ? nullptr : m_applications.data(); + this->m_model.applicationsCount = static_cast(m_applications.size()); + } + + void SetInvitations(ModelVector, Alloc> value) + { + m_invitations = std::move(value); + this->m_model.invitations = m_invitations.empty() ? nullptr : m_invitations.data(); + this->m_model.invitationsCount = static_cast(m_invitations.size()); + } + +private: + void SetModelPointers() + { + this->m_model.applications = m_applications.empty() ? nullptr : m_applications.data(); + this->m_model.invitations = m_invitations.empty() ? nullptr : m_invitations.data(); + } + + ModelVector, Alloc> m_applications; + ModelVector, Alloc> m_invitations; +}; + +template class Alloc = std::allocator> +class PFGroupsRemoveGroupApplicationRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsRemoveGroupApplicationRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsRemoveGroupApplicationRequestWrapper() = default; + + PFGroupsRemoveGroupApplicationRequestWrapper(const PFGroupsRemoveGroupApplicationRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsRemoveGroupApplicationRequestWrapper(const PFGroupsRemoveGroupApplicationRequestWrapper& src) : + PFGroupsRemoveGroupApplicationRequestWrapper{ src.Model() } + { + } + + PFGroupsRemoveGroupApplicationRequestWrapper(PFGroupsRemoveGroupApplicationRequestWrapper&& src) : + PFGroupsRemoveGroupApplicationRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsRemoveGroupApplicationRequestWrapper& operator=(PFGroupsRemoveGroupApplicationRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsRemoveGroupApplicationRequestWrapper() = default; + + friend void swap(PFGroupsRemoveGroupApplicationRequestWrapper& lhs, PFGroupsRemoveGroupApplicationRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsRemoveGroupInvitationRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsRemoveGroupInvitationRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsRemoveGroupInvitationRequestWrapper() = default; + + PFGroupsRemoveGroupInvitationRequestWrapper(const PFGroupsRemoveGroupInvitationRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsRemoveGroupInvitationRequestWrapper(const PFGroupsRemoveGroupInvitationRequestWrapper& src) : + PFGroupsRemoveGroupInvitationRequestWrapper{ src.Model() } + { + } + + PFGroupsRemoveGroupInvitationRequestWrapper(PFGroupsRemoveGroupInvitationRequestWrapper&& src) : + PFGroupsRemoveGroupInvitationRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsRemoveGroupInvitationRequestWrapper& operator=(PFGroupsRemoveGroupInvitationRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsRemoveGroupInvitationRequestWrapper() = default; + + friend void swap(PFGroupsRemoveGroupInvitationRequestWrapper& lhs, PFGroupsRemoveGroupInvitationRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsRemoveMembersRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsRemoveMembersRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsRemoveMembersRequestWrapper() = default; + + PFGroupsRemoveMembersRequestWrapper(const PFGroupsRemoveMembersRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_members{ model.members, model.members + model.membersCount }, + m_roleId{ SafeString(model.roleId) } + { + SetModelPointers(); + } + + PFGroupsRemoveMembersRequestWrapper(const PFGroupsRemoveMembersRequestWrapper& src) : + PFGroupsRemoveMembersRequestWrapper{ src.Model() } + { + } + + PFGroupsRemoveMembersRequestWrapper(PFGroupsRemoveMembersRequestWrapper&& src) : + PFGroupsRemoveMembersRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsRemoveMembersRequestWrapper& operator=(PFGroupsRemoveMembersRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsRemoveMembersRequestWrapper() = default; + + friend void swap(PFGroupsRemoveMembersRequestWrapper& lhs, PFGroupsRemoveMembersRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_members, rhs.m_members); + swap(lhs.m_roleId, rhs.m_roleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetMembers(ModelVector, Alloc> value) + { + m_members = std::move(value); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.membersCount = static_cast(m_members.size()); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.group = &m_group.Model(); + this->m_model.members = m_members.empty() ? nullptr : m_members.data(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_group; + ModelVector, Alloc> m_members; + String m_roleId; +}; + +template class Alloc = std::allocator> +class PFGroupsUnblockEntityRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsUnblockEntityRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsUnblockEntityRequestWrapper() = default; + + PFGroupsUnblockEntityRequestWrapper(const PFGroupsUnblockEntityRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_group{ model.group ? *model.group : decltype(*model.group){} } + { + SetModelPointers(); + } + + PFGroupsUnblockEntityRequestWrapper(const PFGroupsUnblockEntityRequestWrapper& src) : + PFGroupsUnblockEntityRequestWrapper{ src.Model() } + { + } + + PFGroupsUnblockEntityRequestWrapper(PFGroupsUnblockEntityRequestWrapper&& src) : + PFGroupsUnblockEntityRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsUnblockEntityRequestWrapper& operator=(PFGroupsUnblockEntityRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsUnblockEntityRequestWrapper() = default; + + friend void swap(PFGroupsUnblockEntityRequestWrapper& lhs, PFGroupsUnblockEntityRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_group, rhs.m_group); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.group = &m_group.Model(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + PFEntityKeyWrapper m_group; +}; + +template class Alloc = std::allocator> +class PFGroupsUpdateGroupRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsUpdateGroupRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsUpdateGroupRequestWrapper() = default; + + PFGroupsUpdateGroupRequestWrapper(const PFGroupsUpdateGroupRequest& model) : + ModelWrapper{ model }, + m_adminRoleId{ SafeString(model.adminRoleId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_expectedProfileVersion{ model.expectedProfileVersion ? std::optional{ *model.expectedProfileVersion } : std::nullopt }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_groupName{ SafeString(model.groupName) }, + m_memberRoleId{ SafeString(model.memberRoleId) } + { + SetModelPointers(); + } + + PFGroupsUpdateGroupRequestWrapper(const PFGroupsUpdateGroupRequestWrapper& src) : + PFGroupsUpdateGroupRequestWrapper{ src.Model() } + { + } + + PFGroupsUpdateGroupRequestWrapper(PFGroupsUpdateGroupRequestWrapper&& src) : + PFGroupsUpdateGroupRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsUpdateGroupRequestWrapper& operator=(PFGroupsUpdateGroupRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsUpdateGroupRequestWrapper() = default; + + friend void swap(PFGroupsUpdateGroupRequestWrapper& lhs, PFGroupsUpdateGroupRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_adminRoleId, rhs.m_adminRoleId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_expectedProfileVersion, rhs.m_expectedProfileVersion); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_groupName, rhs.m_groupName); + swap(lhs.m_memberRoleId, rhs.m_memberRoleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdminRoleId(String value) + { + m_adminRoleId = std::move(value); + this->m_model.adminRoleId = m_adminRoleId.empty() ? nullptr : m_adminRoleId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetExpectedProfileVersion(std::optional value) + { + m_expectedProfileVersion = std::move(value); + this->m_model.expectedProfileVersion = m_expectedProfileVersion ? m_expectedProfileVersion.operator->() : nullptr; + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetGroupName(String value) + { + m_groupName = std::move(value); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + } + + void SetMemberRoleId(String value) + { + m_memberRoleId = std::move(value); + this->m_model.memberRoleId = m_memberRoleId.empty() ? nullptr : m_memberRoleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.adminRoleId = m_adminRoleId.empty() ? nullptr : m_adminRoleId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.expectedProfileVersion = m_expectedProfileVersion ? m_expectedProfileVersion.operator->() : nullptr; + this->m_model.group = &m_group.Model(); + this->m_model.groupName = m_groupName.empty() ? nullptr : m_groupName.data(); + this->m_model.memberRoleId = m_memberRoleId.empty() ? nullptr : m_memberRoleId.data(); + } + + String m_adminRoleId; + StringDictionaryEntryVector m_customTags; + std::optional m_expectedProfileVersion; + PFEntityKeyWrapper m_group; + String m_groupName; + String m_memberRoleId; +}; + +template class Alloc = std::allocator> +class PFGroupsUpdateGroupResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsUpdateGroupResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsUpdateGroupResponseWrapper() = default; + + PFGroupsUpdateGroupResponseWrapper(const PFGroupsUpdateGroupResponse& model) : + ModelWrapper{ model }, + m_operationReason{ SafeString(model.operationReason) }, + m_setResult{ model.setResult ? std::optional{ *model.setResult } : std::nullopt } + { + SetModelPointers(); + } + + PFGroupsUpdateGroupResponseWrapper(const PFGroupsUpdateGroupResponseWrapper& src) : + PFGroupsUpdateGroupResponseWrapper{ src.Model() } + { + } + + PFGroupsUpdateGroupResponseWrapper(PFGroupsUpdateGroupResponseWrapper&& src) : + PFGroupsUpdateGroupResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsUpdateGroupResponseWrapper& operator=(PFGroupsUpdateGroupResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsUpdateGroupResponseWrapper() = default; + + friend void swap(PFGroupsUpdateGroupResponseWrapper& lhs, PFGroupsUpdateGroupResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_operationReason, rhs.m_operationReason); + swap(lhs.m_setResult, rhs.m_setResult); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetOperationReason(String value) + { + m_operationReason = std::move(value); + this->m_model.operationReason = m_operationReason.empty() ? nullptr : m_operationReason.data(); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetSetResult(std::optional value) + { + m_setResult = std::move(value); + this->m_model.setResult = m_setResult ? m_setResult.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.operationReason = m_operationReason.empty() ? nullptr : m_operationReason.data(); + this->m_model.setResult = m_setResult ? m_setResult.operator->() : nullptr; + } + + String m_operationReason; + std::optional m_setResult; +}; + +template class Alloc = std::allocator> +class PFGroupsUpdateGroupRoleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsUpdateGroupRoleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsUpdateGroupRoleRequestWrapper() = default; + + PFGroupsUpdateGroupRoleRequestWrapper(const PFGroupsUpdateGroupRoleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_expectedProfileVersion{ model.expectedProfileVersion ? std::optional{ *model.expectedProfileVersion } : std::nullopt }, + m_group{ model.group ? *model.group : decltype(*model.group){} }, + m_roleId{ SafeString(model.roleId) }, + m_roleName{ SafeString(model.roleName) } + { + SetModelPointers(); + } + + PFGroupsUpdateGroupRoleRequestWrapper(const PFGroupsUpdateGroupRoleRequestWrapper& src) : + PFGroupsUpdateGroupRoleRequestWrapper{ src.Model() } + { + } + + PFGroupsUpdateGroupRoleRequestWrapper(PFGroupsUpdateGroupRoleRequestWrapper&& src) : + PFGroupsUpdateGroupRoleRequestWrapper{} + { + swap(*this, src); + } + + PFGroupsUpdateGroupRoleRequestWrapper& operator=(PFGroupsUpdateGroupRoleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsUpdateGroupRoleRequestWrapper() = default; + + friend void swap(PFGroupsUpdateGroupRoleRequestWrapper& lhs, PFGroupsUpdateGroupRoleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_expectedProfileVersion, rhs.m_expectedProfileVersion); + swap(lhs.m_group, rhs.m_group); + swap(lhs.m_roleId, rhs.m_roleId); + swap(lhs.m_roleName, rhs.m_roleName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetExpectedProfileVersion(std::optional value) + { + m_expectedProfileVersion = std::move(value); + this->m_model.expectedProfileVersion = m_expectedProfileVersion ? m_expectedProfileVersion.operator->() : nullptr; + } + + void SetGroup(PFEntityKeyWrapper value) + { + m_group = std::move(value); + this->m_model.group = &m_group.Model(); + } + + void SetRoleId(String value) + { + m_roleId = std::move(value); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + } + + void SetRoleName(String value) + { + m_roleName = std::move(value); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.expectedProfileVersion = m_expectedProfileVersion ? m_expectedProfileVersion.operator->() : nullptr; + this->m_model.group = &m_group.Model(); + this->m_model.roleId = m_roleId.empty() ? nullptr : m_roleId.data(); + this->m_model.roleName = m_roleName.empty() ? nullptr : m_roleName.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_expectedProfileVersion; + PFEntityKeyWrapper m_group; + String m_roleId; + String m_roleName; +}; + +template class Alloc = std::allocator> +class PFGroupsUpdateGroupRoleResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFGroupsUpdateGroupRoleResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFGroupsUpdateGroupRoleResponseWrapper() = default; + + PFGroupsUpdateGroupRoleResponseWrapper(const PFGroupsUpdateGroupRoleResponse& model) : + ModelWrapper{ model }, + m_operationReason{ SafeString(model.operationReason) }, + m_setResult{ model.setResult ? std::optional{ *model.setResult } : std::nullopt } + { + SetModelPointers(); + } + + PFGroupsUpdateGroupRoleResponseWrapper(const PFGroupsUpdateGroupRoleResponseWrapper& src) : + PFGroupsUpdateGroupRoleResponseWrapper{ src.Model() } + { + } + + PFGroupsUpdateGroupRoleResponseWrapper(PFGroupsUpdateGroupRoleResponseWrapper&& src) : + PFGroupsUpdateGroupRoleResponseWrapper{} + { + swap(*this, src); + } + + PFGroupsUpdateGroupRoleResponseWrapper& operator=(PFGroupsUpdateGroupRoleResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFGroupsUpdateGroupRoleResponseWrapper() = default; + + friend void swap(PFGroupsUpdateGroupRoleResponseWrapper& lhs, PFGroupsUpdateGroupRoleResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_operationReason, rhs.m_operationReason); + swap(lhs.m_setResult, rhs.m_setResult); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetOperationReason(String value) + { + m_operationReason = std::move(value); + this->m_model.operationReason = m_operationReason.empty() ? nullptr : m_operationReason.data(); + } + + void SetProfileVersion(int32_t value) + { + this->m_model.profileVersion = value; + } + + void SetSetResult(std::optional value) + { + m_setResult = std::move(value); + this->m_model.setResult = m_setResult ? m_setResult.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.operationReason = m_operationReason.empty() ? nullptr : m_operationReason.data(); + this->m_model.setResult = m_setResult ? m_setResult.operator->() : nullptr; + } + + String m_operationReason; + std::optional m_setResult; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/InventoryTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/InventoryTypeWrappers.h new file mode 100644 index 0000000..cf5b8db --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/InventoryTypeWrappers.h @@ -0,0 +1,5113 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include +#if HC_PLATFORM == HC_PLATFORM_GDK +#include +#endif + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFInventoryAlternateIdWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryAlternateId; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryAlternateIdWrapper() = default; + + PFInventoryAlternateIdWrapper(const PFInventoryAlternateId& model) : + ModelWrapper{ model }, + m_type{ SafeString(model.type) }, + m_value{ SafeString(model.value) } + { + SetModelPointers(); + } + + PFInventoryAlternateIdWrapper(const PFInventoryAlternateIdWrapper& src) : + PFInventoryAlternateIdWrapper{ src.Model() } + { + } + + PFInventoryAlternateIdWrapper(PFInventoryAlternateIdWrapper&& src) : + PFInventoryAlternateIdWrapper{} + { + swap(*this, src); + } + + PFInventoryAlternateIdWrapper& operator=(PFInventoryAlternateIdWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryAlternateIdWrapper() = default; + + friend void swap(PFInventoryAlternateIdWrapper& lhs, PFInventoryAlternateIdWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_type, rhs.m_type); + swap(lhs.m_value, rhs.m_value); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + void SetValue(String value) + { + m_value = std::move(value); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + +private: + void SetModelPointers() + { + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + + String m_type; + String m_value; +}; + +template class Alloc = std::allocator> +class PFInventoryInventoryItemReferenceWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryInventoryItemReference; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryInventoryItemReferenceWrapper() = default; + + PFInventoryInventoryItemReferenceWrapper(const PFInventoryInventoryItemReference& model) : + ModelWrapper{ model }, + m_alternateId{ model.alternateId ? std::optional>{ *model.alternateId } : std::nullopt }, + m_id{ SafeString(model.id) }, + m_stackId{ SafeString(model.stackId) } + { + SetModelPointers(); + } + + PFInventoryInventoryItemReferenceWrapper(const PFInventoryInventoryItemReferenceWrapper& src) : + PFInventoryInventoryItemReferenceWrapper{ src.Model() } + { + } + + PFInventoryInventoryItemReferenceWrapper(PFInventoryInventoryItemReferenceWrapper&& src) : + PFInventoryInventoryItemReferenceWrapper{} + { + swap(*this, src); + } + + PFInventoryInventoryItemReferenceWrapper& operator=(PFInventoryInventoryItemReferenceWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryInventoryItemReferenceWrapper() = default; + + friend void swap(PFInventoryInventoryItemReferenceWrapper& lhs, PFInventoryInventoryItemReferenceWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_alternateId, rhs.m_alternateId); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_stackId, rhs.m_stackId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAlternateId(std::optional> value) + { + m_alternateId = std::move(value); + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetStackId(String value) + { + m_stackId = std::move(value); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.alternateId = m_alternateId ? &m_alternateId->Model() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + } + + std::optional> m_alternateId; + String m_id; + String m_stackId; +}; + +template class Alloc = std::allocator> +class PFInventoryInitialValuesWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryInitialValues; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryInitialValuesWrapper() = default; + + PFInventoryInitialValuesWrapper(const PFInventoryInitialValues& model) : + ModelWrapper{ model }, + m_displayProperties{ model.displayProperties } + { + SetModelPointers(); + } + + PFInventoryInitialValuesWrapper(const PFInventoryInitialValuesWrapper& src) : + PFInventoryInitialValuesWrapper{ src.Model() } + { + } + + PFInventoryInitialValuesWrapper(PFInventoryInitialValuesWrapper&& src) : + PFInventoryInitialValuesWrapper{} + { + swap(*this, src); + } + + PFInventoryInitialValuesWrapper& operator=(PFInventoryInitialValuesWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryInitialValuesWrapper() = default; + + friend void swap(PFInventoryInitialValuesWrapper& lhs, PFInventoryInitialValuesWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_displayProperties, rhs.m_displayProperties); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDisplayProperties(JsonObject value) + { + m_displayProperties = std::move(value); + this->m_model.displayProperties.stringValue = m_displayProperties.stringValue.empty() ? nullptr : m_displayProperties.stringValue.data(); + } + +private: + void SetModelPointers() + { + this->m_model.displayProperties.stringValue = m_displayProperties.stringValue.empty() ? nullptr : m_displayProperties.stringValue.data(); + } + + JsonObject m_displayProperties; +}; + +template class Alloc = std::allocator> +class PFInventoryAddInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryAddInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryAddInventoryItemsRequestWrapper() = default; + + PFInventoryAddInventoryItemsRequestWrapper(const PFInventoryAddInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_durationInSeconds{ model.durationInSeconds ? std::optional{ *model.durationInSeconds } : std::nullopt }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt }, + m_newStackValues{ model.newStackValues ? std::optional>{ *model.newStackValues } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryAddInventoryItemsRequestWrapper(const PFInventoryAddInventoryItemsRequestWrapper& src) : + PFInventoryAddInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryAddInventoryItemsRequestWrapper(PFInventoryAddInventoryItemsRequestWrapper&& src) : + PFInventoryAddInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryAddInventoryItemsRequestWrapper& operator=(PFInventoryAddInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryAddInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryAddInventoryItemsRequestWrapper& lhs, PFInventoryAddInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_durationInSeconds, rhs.m_durationInSeconds); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_item, rhs.m_item); + swap(lhs.m_newStackValues, rhs.m_newStackValues); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDurationInSeconds(std::optional value) + { + m_durationInSeconds = std::move(value); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + void SetNewStackValues(std::optional> value) + { + m_newStackValues = std::move(value); + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + + std::optional m_amount; + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional m_durationInSeconds; + std::optional> m_entity; + String m_eTag; + String m_idempotencyId; + std::optional> m_item; + std::optional> m_newStackValues; +}; + +template class Alloc = std::allocator> +class PFInventoryAddInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryAddInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryAddInventoryItemsResponseWrapper() = default; + + PFInventoryAddInventoryItemsResponseWrapper(const PFInventoryAddInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryAddInventoryItemsResponseWrapper(const PFInventoryAddInventoryItemsResponseWrapper& src) : + PFInventoryAddInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryAddInventoryItemsResponseWrapper(PFInventoryAddInventoryItemsResponseWrapper&& src) : + PFInventoryAddInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryAddInventoryItemsResponseWrapper& operator=(PFInventoryAddInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryAddInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryAddInventoryItemsResponseWrapper& lhs, PFInventoryAddInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + String m_eTag; + String m_idempotencyId; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryDeleteInventoryCollectionRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryDeleteInventoryCollectionRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryDeleteInventoryCollectionRequestWrapper() = default; + + PFInventoryDeleteInventoryCollectionRequestWrapper(const PFInventoryDeleteInventoryCollectionRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) } + { + SetModelPointers(); + } + + PFInventoryDeleteInventoryCollectionRequestWrapper(const PFInventoryDeleteInventoryCollectionRequestWrapper& src) : + PFInventoryDeleteInventoryCollectionRequestWrapper{ src.Model() } + { + } + + PFInventoryDeleteInventoryCollectionRequestWrapper(PFInventoryDeleteInventoryCollectionRequestWrapper&& src) : + PFInventoryDeleteInventoryCollectionRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryDeleteInventoryCollectionRequestWrapper& operator=(PFInventoryDeleteInventoryCollectionRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryDeleteInventoryCollectionRequestWrapper() = default; + + friend void swap(PFInventoryDeleteInventoryCollectionRequestWrapper& lhs, PFInventoryDeleteInventoryCollectionRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_eTag; +}; + +template class Alloc = std::allocator> +class PFInventoryDeleteInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryDeleteInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryDeleteInventoryItemsRequestWrapper() = default; + + PFInventoryDeleteInventoryItemsRequestWrapper(const PFInventoryDeleteInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryDeleteInventoryItemsRequestWrapper(const PFInventoryDeleteInventoryItemsRequestWrapper& src) : + PFInventoryDeleteInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryDeleteInventoryItemsRequestWrapper(PFInventoryDeleteInventoryItemsRequestWrapper&& src) : + PFInventoryDeleteInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryDeleteInventoryItemsRequestWrapper& operator=(PFInventoryDeleteInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryDeleteInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryDeleteInventoryItemsRequestWrapper& lhs, PFInventoryDeleteInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_eTag; + String m_idempotencyId; + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFInventoryDeleteInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryDeleteInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryDeleteInventoryItemsResponseWrapper() = default; + + PFInventoryDeleteInventoryItemsResponseWrapper(const PFInventoryDeleteInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryDeleteInventoryItemsResponseWrapper(const PFInventoryDeleteInventoryItemsResponseWrapper& src) : + PFInventoryDeleteInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryDeleteInventoryItemsResponseWrapper(PFInventoryDeleteInventoryItemsResponseWrapper&& src) : + PFInventoryDeleteInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryDeleteInventoryItemsResponseWrapper& operator=(PFInventoryDeleteInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryDeleteInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryDeleteInventoryItemsResponseWrapper& lhs, PFInventoryDeleteInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + String m_eTag; + String m_idempotencyId; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryAddInventoryItemsOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryAddInventoryItemsOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryAddInventoryItemsOperationWrapper() = default; + + PFInventoryAddInventoryItemsOperationWrapper(const PFInventoryAddInventoryItemsOperation& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_durationInSeconds{ model.durationInSeconds ? std::optional{ *model.durationInSeconds } : std::nullopt }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt }, + m_newStackValues{ model.newStackValues ? std::optional>{ *model.newStackValues } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryAddInventoryItemsOperationWrapper(const PFInventoryAddInventoryItemsOperationWrapper& src) : + PFInventoryAddInventoryItemsOperationWrapper{ src.Model() } + { + } + + PFInventoryAddInventoryItemsOperationWrapper(PFInventoryAddInventoryItemsOperationWrapper&& src) : + PFInventoryAddInventoryItemsOperationWrapper{} + { + swap(*this, src); + } + + PFInventoryAddInventoryItemsOperationWrapper& operator=(PFInventoryAddInventoryItemsOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryAddInventoryItemsOperationWrapper() = default; + + friend void swap(PFInventoryAddInventoryItemsOperationWrapper& lhs, PFInventoryAddInventoryItemsOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_durationInSeconds, rhs.m_durationInSeconds); + swap(lhs.m_item, rhs.m_item); + swap(lhs.m_newStackValues, rhs.m_newStackValues); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetDurationInSeconds(std::optional value) + { + m_durationInSeconds = std::move(value); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + void SetNewStackValues(std::optional> value) + { + m_newStackValues = std::move(value); + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + this->m_model.item = m_item ? &m_item->Model() : nullptr; + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + + std::optional m_amount; + std::optional m_durationInSeconds; + std::optional> m_item; + std::optional> m_newStackValues; +}; + +template class Alloc = std::allocator> +class PFInventoryDeleteInventoryItemsOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryDeleteInventoryItemsOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryDeleteInventoryItemsOperationWrapper() = default; + + PFInventoryDeleteInventoryItemsOperationWrapper(const PFInventoryDeleteInventoryItemsOperation& model) : + ModelWrapper{ model }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryDeleteInventoryItemsOperationWrapper(const PFInventoryDeleteInventoryItemsOperationWrapper& src) : + PFInventoryDeleteInventoryItemsOperationWrapper{ src.Model() } + { + } + + PFInventoryDeleteInventoryItemsOperationWrapper(PFInventoryDeleteInventoryItemsOperationWrapper&& src) : + PFInventoryDeleteInventoryItemsOperationWrapper{} + { + swap(*this, src); + } + + PFInventoryDeleteInventoryItemsOperationWrapper& operator=(PFInventoryDeleteInventoryItemsOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryDeleteInventoryItemsOperationWrapper() = default; + + friend void swap(PFInventoryDeleteInventoryItemsOperationWrapper& lhs, PFInventoryDeleteInventoryItemsOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFInventoryPurchasePriceAmountWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryPurchasePriceAmount; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryPurchasePriceAmountWrapper() = default; + + PFInventoryPurchasePriceAmountWrapper(const PFInventoryPurchasePriceAmount& model) : + ModelWrapper{ model }, + m_itemId{ SafeString(model.itemId) }, + m_stackId{ SafeString(model.stackId) } + { + SetModelPointers(); + } + + PFInventoryPurchasePriceAmountWrapper(const PFInventoryPurchasePriceAmountWrapper& src) : + PFInventoryPurchasePriceAmountWrapper{ src.Model() } + { + } + + PFInventoryPurchasePriceAmountWrapper(PFInventoryPurchasePriceAmountWrapper&& src) : + PFInventoryPurchasePriceAmountWrapper{} + { + swap(*this, src); + } + + PFInventoryPurchasePriceAmountWrapper& operator=(PFInventoryPurchasePriceAmountWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryPurchasePriceAmountWrapper() = default; + + friend void swap(PFInventoryPurchasePriceAmountWrapper& lhs, PFInventoryPurchasePriceAmountWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_stackId, rhs.m_stackId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(int32_t value) + { + this->m_model.amount = value; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetStackId(String value) + { + m_stackId = std::move(value); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + } + + String m_itemId; + String m_stackId; +}; + +template class Alloc = std::allocator> +class PFInventoryPurchaseInventoryItemsOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryPurchaseInventoryItemsOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryPurchaseInventoryItemsOperationWrapper() = default; + + PFInventoryPurchaseInventoryItemsOperationWrapper(const PFInventoryPurchaseInventoryItemsOperation& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_durationInSeconds{ model.durationInSeconds ? std::optional{ *model.durationInSeconds } : std::nullopt }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt }, + m_newStackValues{ model.newStackValues ? std::optional>{ *model.newStackValues } : std::nullopt }, + m_priceAmounts{ model.priceAmounts, model.priceAmounts + model.priceAmountsCount }, + m_storeId{ SafeString(model.storeId) } + { + SetModelPointers(); + } + + PFInventoryPurchaseInventoryItemsOperationWrapper(const PFInventoryPurchaseInventoryItemsOperationWrapper& src) : + PFInventoryPurchaseInventoryItemsOperationWrapper{ src.Model() } + { + } + + PFInventoryPurchaseInventoryItemsOperationWrapper(PFInventoryPurchaseInventoryItemsOperationWrapper&& src) : + PFInventoryPurchaseInventoryItemsOperationWrapper{} + { + swap(*this, src); + } + + PFInventoryPurchaseInventoryItemsOperationWrapper& operator=(PFInventoryPurchaseInventoryItemsOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryPurchaseInventoryItemsOperationWrapper() = default; + + friend void swap(PFInventoryPurchaseInventoryItemsOperationWrapper& lhs, PFInventoryPurchaseInventoryItemsOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_durationInSeconds, rhs.m_durationInSeconds); + swap(lhs.m_item, rhs.m_item); + swap(lhs.m_newStackValues, rhs.m_newStackValues); + swap(lhs.m_priceAmounts, rhs.m_priceAmounts); + swap(lhs.m_storeId, rhs.m_storeId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetDeleteEmptyStacks(bool value) + { + this->m_model.deleteEmptyStacks = value; + } + + void SetDurationInSeconds(std::optional value) + { + m_durationInSeconds = std::move(value); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + void SetNewStackValues(std::optional> value) + { + m_newStackValues = std::move(value); + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + + void SetPriceAmounts(ModelVector, Alloc> value) + { + m_priceAmounts = std::move(value); + this->m_model.priceAmounts = m_priceAmounts.empty() ? nullptr : m_priceAmounts.data(); + this->m_model.priceAmountsCount = static_cast(m_priceAmounts.size()); + } + + void SetStoreId(String value) + { + m_storeId = std::move(value); + this->m_model.storeId = m_storeId.empty() ? nullptr : m_storeId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + this->m_model.item = m_item ? &m_item->Model() : nullptr; + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + this->m_model.priceAmounts = m_priceAmounts.empty() ? nullptr : m_priceAmounts.data(); + this->m_model.storeId = m_storeId.empty() ? nullptr : m_storeId.data(); + } + + std::optional m_amount; + std::optional m_durationInSeconds; + std::optional> m_item; + std::optional> m_newStackValues; + ModelVector, Alloc> m_priceAmounts; + String m_storeId; +}; + +template class Alloc = std::allocator> +class PFInventorySubtractInventoryItemsOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventorySubtractInventoryItemsOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventorySubtractInventoryItemsOperationWrapper() = default; + + PFInventorySubtractInventoryItemsOperationWrapper(const PFInventorySubtractInventoryItemsOperation& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_durationInSeconds{ model.durationInSeconds ? std::optional{ *model.durationInSeconds } : std::nullopt }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFInventorySubtractInventoryItemsOperationWrapper(const PFInventorySubtractInventoryItemsOperationWrapper& src) : + PFInventorySubtractInventoryItemsOperationWrapper{ src.Model() } + { + } + + PFInventorySubtractInventoryItemsOperationWrapper(PFInventorySubtractInventoryItemsOperationWrapper&& src) : + PFInventorySubtractInventoryItemsOperationWrapper{} + { + swap(*this, src); + } + + PFInventorySubtractInventoryItemsOperationWrapper& operator=(PFInventorySubtractInventoryItemsOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventorySubtractInventoryItemsOperationWrapper() = default; + + friend void swap(PFInventorySubtractInventoryItemsOperationWrapper& lhs, PFInventorySubtractInventoryItemsOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_durationInSeconds, rhs.m_durationInSeconds); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetDeleteEmptyStacks(bool value) + { + this->m_model.deleteEmptyStacks = value; + } + + void SetDurationInSeconds(std::optional value) + { + m_durationInSeconds = std::move(value); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional m_amount; + std::optional m_durationInSeconds; + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFInventoryTransferInventoryItemsOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransferInventoryItemsOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransferInventoryItemsOperationWrapper() = default; + + PFInventoryTransferInventoryItemsOperationWrapper(const PFInventoryTransferInventoryItemsOperation& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_givingItem{ model.givingItem ? std::optional>{ *model.givingItem } : std::nullopt }, + m_newStackValues{ model.newStackValues ? std::optional>{ *model.newStackValues } : std::nullopt }, + m_receivingItem{ model.receivingItem ? std::optional>{ *model.receivingItem } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryTransferInventoryItemsOperationWrapper(const PFInventoryTransferInventoryItemsOperationWrapper& src) : + PFInventoryTransferInventoryItemsOperationWrapper{ src.Model() } + { + } + + PFInventoryTransferInventoryItemsOperationWrapper(PFInventoryTransferInventoryItemsOperationWrapper&& src) : + PFInventoryTransferInventoryItemsOperationWrapper{} + { + swap(*this, src); + } + + PFInventoryTransferInventoryItemsOperationWrapper& operator=(PFInventoryTransferInventoryItemsOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransferInventoryItemsOperationWrapper() = default; + + friend void swap(PFInventoryTransferInventoryItemsOperationWrapper& lhs, PFInventoryTransferInventoryItemsOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_givingItem, rhs.m_givingItem); + swap(lhs.m_newStackValues, rhs.m_newStackValues); + swap(lhs.m_receivingItem, rhs.m_receivingItem); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetDeleteEmptyStacks(bool value) + { + this->m_model.deleteEmptyStacks = value; + } + + void SetGivingItem(std::optional> value) + { + m_givingItem = std::move(value); + this->m_model.givingItem = m_givingItem ? &m_givingItem->Model() : nullptr; + } + + void SetNewStackValues(std::optional> value) + { + m_newStackValues = std::move(value); + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + + void SetReceivingItem(std::optional> value) + { + m_receivingItem = std::move(value); + this->m_model.receivingItem = m_receivingItem ? &m_receivingItem->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.givingItem = m_givingItem ? &m_givingItem->Model() : nullptr; + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + this->m_model.receivingItem = m_receivingItem ? &m_receivingItem->Model() : nullptr; + } + + std::optional m_amount; + std::optional> m_givingItem; + std::optional> m_newStackValues; + std::optional> m_receivingItem; +}; + +template class Alloc = std::allocator> +class PFInventoryInventoryItemWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryInventoryItem; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryInventoryItemWrapper() = default; + + PFInventoryInventoryItemWrapper(const PFInventoryInventoryItem& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_displayProperties{ model.displayProperties }, + m_expirationDate{ model.expirationDate ? std::optional{ *model.expirationDate } : std::nullopt }, + m_id{ SafeString(model.id) }, + m_stackId{ SafeString(model.stackId) }, + m_type{ SafeString(model.type) } + { + SetModelPointers(); + } + + PFInventoryInventoryItemWrapper(const PFInventoryInventoryItemWrapper& src) : + PFInventoryInventoryItemWrapper{ src.Model() } + { + } + + PFInventoryInventoryItemWrapper(PFInventoryInventoryItemWrapper&& src) : + PFInventoryInventoryItemWrapper{} + { + swap(*this, src); + } + + PFInventoryInventoryItemWrapper& operator=(PFInventoryInventoryItemWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryInventoryItemWrapper() = default; + + friend void swap(PFInventoryInventoryItemWrapper& lhs, PFInventoryInventoryItemWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_displayProperties, rhs.m_displayProperties); + swap(lhs.m_expirationDate, rhs.m_expirationDate); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_stackId, rhs.m_stackId); + swap(lhs.m_type, rhs.m_type); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetDisplayProperties(JsonObject value) + { + m_displayProperties = std::move(value); + this->m_model.displayProperties.stringValue = m_displayProperties.stringValue.empty() ? nullptr : m_displayProperties.stringValue.data(); + } + + void SetExpirationDate(std::optional value) + { + m_expirationDate = std::move(value); + this->m_model.expirationDate = m_expirationDate ? m_expirationDate.operator->() : nullptr; + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetStackId(String value) + { + m_stackId = std::move(value); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.displayProperties.stringValue = m_displayProperties.stringValue.empty() ? nullptr : m_displayProperties.stringValue.data(); + this->m_model.expirationDate = m_expirationDate ? m_expirationDate.operator->() : nullptr; + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + std::optional m_amount; + JsonObject m_displayProperties; + std::optional m_expirationDate; + String m_id; + String m_stackId; + String m_type; +}; + +template class Alloc = std::allocator> +class PFInventoryUpdateInventoryItemsOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryUpdateInventoryItemsOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryUpdateInventoryItemsOperationWrapper() = default; + + PFInventoryUpdateInventoryItemsOperationWrapper(const PFInventoryUpdateInventoryItemsOperation& model) : + ModelWrapper{ model }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryUpdateInventoryItemsOperationWrapper(const PFInventoryUpdateInventoryItemsOperationWrapper& src) : + PFInventoryUpdateInventoryItemsOperationWrapper{ src.Model() } + { + } + + PFInventoryUpdateInventoryItemsOperationWrapper(PFInventoryUpdateInventoryItemsOperationWrapper&& src) : + PFInventoryUpdateInventoryItemsOperationWrapper{} + { + swap(*this, src); + } + + PFInventoryUpdateInventoryItemsOperationWrapper& operator=(PFInventoryUpdateInventoryItemsOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryUpdateInventoryItemsOperationWrapper() = default; + + friend void swap(PFInventoryUpdateInventoryItemsOperationWrapper& lhs, PFInventoryUpdateInventoryItemsOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFInventoryInventoryOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryInventoryOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryInventoryOperationWrapper() = default; + + PFInventoryInventoryOperationWrapper(const PFInventoryInventoryOperation& model) : + ModelWrapper{ model }, + m_add{ model.add ? std::optional>{ *model.add } : std::nullopt }, + m_deleteOp{ model.deleteOp ? std::optional>{ *model.deleteOp } : std::nullopt }, + m_purchase{ model.purchase ? std::optional>{ *model.purchase } : std::nullopt }, + m_subtract{ model.subtract ? std::optional>{ *model.subtract } : std::nullopt }, + m_transfer{ model.transfer ? std::optional>{ *model.transfer } : std::nullopt }, + m_update{ model.update ? std::optional>{ *model.update } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryInventoryOperationWrapper(const PFInventoryInventoryOperationWrapper& src) : + PFInventoryInventoryOperationWrapper{ src.Model() } + { + } + + PFInventoryInventoryOperationWrapper(PFInventoryInventoryOperationWrapper&& src) : + PFInventoryInventoryOperationWrapper{} + { + swap(*this, src); + } + + PFInventoryInventoryOperationWrapper& operator=(PFInventoryInventoryOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryInventoryOperationWrapper() = default; + + friend void swap(PFInventoryInventoryOperationWrapper& lhs, PFInventoryInventoryOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_add, rhs.m_add); + swap(lhs.m_deleteOp, rhs.m_deleteOp); + swap(lhs.m_purchase, rhs.m_purchase); + swap(lhs.m_subtract, rhs.m_subtract); + swap(lhs.m_transfer, rhs.m_transfer); + swap(lhs.m_update, rhs.m_update); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdd(std::optional> value) + { + m_add = std::move(value); + this->m_model.add = m_add ? &m_add->Model() : nullptr; + } + + void SetDeleteOp(std::optional> value) + { + m_deleteOp = std::move(value); + this->m_model.deleteOp = m_deleteOp ? &m_deleteOp->Model() : nullptr; + } + + void SetPurchase(std::optional> value) + { + m_purchase = std::move(value); + this->m_model.purchase = m_purchase ? &m_purchase->Model() : nullptr; + } + + void SetSubtract(std::optional> value) + { + m_subtract = std::move(value); + this->m_model.subtract = m_subtract ? &m_subtract->Model() : nullptr; + } + + void SetTransfer(std::optional> value) + { + m_transfer = std::move(value); + this->m_model.transfer = m_transfer ? &m_transfer->Model() : nullptr; + } + + void SetUpdate(std::optional> value) + { + m_update = std::move(value); + this->m_model.update = m_update ? &m_update->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.add = m_add ? &m_add->Model() : nullptr; + this->m_model.deleteOp = m_deleteOp ? &m_deleteOp->Model() : nullptr; + this->m_model.purchase = m_purchase ? &m_purchase->Model() : nullptr; + this->m_model.subtract = m_subtract ? &m_subtract->Model() : nullptr; + this->m_model.transfer = m_transfer ? &m_transfer->Model() : nullptr; + this->m_model.update = m_update ? &m_update->Model() : nullptr; + } + + std::optional> m_add; + std::optional> m_deleteOp; + std::optional> m_purchase; + std::optional> m_subtract; + std::optional> m_transfer; + std::optional> m_update; +}; + +template class Alloc = std::allocator> +class PFInventoryExecuteInventoryOperationsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryExecuteInventoryOperationsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryExecuteInventoryOperationsRequestWrapper() = default; + + PFInventoryExecuteInventoryOperationsRequestWrapper(const PFInventoryExecuteInventoryOperationsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_operations{ model.operations, model.operations + model.operationsCount } + { + SetModelPointers(); + } + + PFInventoryExecuteInventoryOperationsRequestWrapper(const PFInventoryExecuteInventoryOperationsRequestWrapper& src) : + PFInventoryExecuteInventoryOperationsRequestWrapper{ src.Model() } + { + } + + PFInventoryExecuteInventoryOperationsRequestWrapper(PFInventoryExecuteInventoryOperationsRequestWrapper&& src) : + PFInventoryExecuteInventoryOperationsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryExecuteInventoryOperationsRequestWrapper& operator=(PFInventoryExecuteInventoryOperationsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryExecuteInventoryOperationsRequestWrapper() = default; + + friend void swap(PFInventoryExecuteInventoryOperationsRequestWrapper& lhs, PFInventoryExecuteInventoryOperationsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_operations, rhs.m_operations); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetOperations(ModelVector, Alloc> value) + { + m_operations = std::move(value); + this->m_model.operations = m_operations.empty() ? nullptr : m_operations.data(); + this->m_model.operationsCount = static_cast(m_operations.size()); + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.operations = m_operations.empty() ? nullptr : m_operations.data(); + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_eTag; + String m_idempotencyId; + ModelVector, Alloc> m_operations; +}; + +template class Alloc = std::allocator> +class PFInventoryExecuteInventoryOperationsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryExecuteInventoryOperationsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryExecuteInventoryOperationsResponseWrapper() = default; + + PFInventoryExecuteInventoryOperationsResponseWrapper(const PFInventoryExecuteInventoryOperationsResponse& model) : + ModelWrapper{ model }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryExecuteInventoryOperationsResponseWrapper(const PFInventoryExecuteInventoryOperationsResponseWrapper& src) : + PFInventoryExecuteInventoryOperationsResponseWrapper{ src.Model() } + { + } + + PFInventoryExecuteInventoryOperationsResponseWrapper(PFInventoryExecuteInventoryOperationsResponseWrapper&& src) : + PFInventoryExecuteInventoryOperationsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryExecuteInventoryOperationsResponseWrapper& operator=(PFInventoryExecuteInventoryOperationsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryExecuteInventoryOperationsResponseWrapper() = default; + + friend void swap(PFInventoryExecuteInventoryOperationsResponseWrapper& lhs, PFInventoryExecuteInventoryOperationsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + String m_eTag; + String m_idempotencyId; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryGetInventoryCollectionIdsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetInventoryCollectionIdsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetInventoryCollectionIdsRequestWrapper() = default; + + PFInventoryGetInventoryCollectionIdsRequestWrapper(const PFInventoryGetInventoryCollectionIdsRequest& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryGetInventoryCollectionIdsRequestWrapper(const PFInventoryGetInventoryCollectionIdsRequestWrapper& src) : + PFInventoryGetInventoryCollectionIdsRequestWrapper{ src.Model() } + { + } + + PFInventoryGetInventoryCollectionIdsRequestWrapper(PFInventoryGetInventoryCollectionIdsRequestWrapper&& src) : + PFInventoryGetInventoryCollectionIdsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryGetInventoryCollectionIdsRequestWrapper& operator=(PFInventoryGetInventoryCollectionIdsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetInventoryCollectionIdsRequestWrapper() = default; + + friend void swap(PFInventoryGetInventoryCollectionIdsRequestWrapper& lhs, PFInventoryGetInventoryCollectionIdsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCount(int32_t value) + { + this->m_model.count = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFInventoryGetInventoryCollectionIdsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetInventoryCollectionIdsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetInventoryCollectionIdsResponseWrapper() = default; + + PFInventoryGetInventoryCollectionIdsResponseWrapper(const PFInventoryGetInventoryCollectionIdsResponse& model) : + ModelWrapper{ model }, + m_collectionIds{ model.collectionIds, model.collectionIds + model.collectionIdsCount }, + m_continuationToken{ SafeString(model.continuationToken) } + { + SetModelPointers(); + } + + PFInventoryGetInventoryCollectionIdsResponseWrapper(const PFInventoryGetInventoryCollectionIdsResponseWrapper& src) : + PFInventoryGetInventoryCollectionIdsResponseWrapper{ src.Model() } + { + } + + PFInventoryGetInventoryCollectionIdsResponseWrapper(PFInventoryGetInventoryCollectionIdsResponseWrapper&& src) : + PFInventoryGetInventoryCollectionIdsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryGetInventoryCollectionIdsResponseWrapper& operator=(PFInventoryGetInventoryCollectionIdsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetInventoryCollectionIdsResponseWrapper() = default; + + friend void swap(PFInventoryGetInventoryCollectionIdsResponseWrapper& lhs, PFInventoryGetInventoryCollectionIdsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionIds, rhs.m_collectionIds); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionIds(CStringVector value) + { + m_collectionIds = std::move(value); + this->m_model.collectionIds = m_collectionIds.empty() ? nullptr : m_collectionIds.data(); + this->m_model.collectionIdsCount = static_cast(m_collectionIds.size()); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.collectionIds = m_collectionIds.empty() ? nullptr : m_collectionIds.data(); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + CStringVector m_collectionIds; + String m_continuationToken; +}; + +template class Alloc = std::allocator> +class PFInventoryGetInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetInventoryItemsRequestWrapper() = default; + + PFInventoryGetInventoryItemsRequestWrapper(const PFInventoryGetInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_filter{ SafeString(model.filter) } + { + SetModelPointers(); + } + + PFInventoryGetInventoryItemsRequestWrapper(const PFInventoryGetInventoryItemsRequestWrapper& src) : + PFInventoryGetInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryGetInventoryItemsRequestWrapper(PFInventoryGetInventoryItemsRequestWrapper&& src) : + PFInventoryGetInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryGetInventoryItemsRequestWrapper& operator=(PFInventoryGetInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryGetInventoryItemsRequestWrapper& lhs, PFInventoryGetInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_filter, rhs.m_filter); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCount(int32_t value) + { + this->m_model.count = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetFilter(String value) + { + m_filter = std::move(value); + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + + String m_collectionId; + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_filter; +}; + +template class Alloc = std::allocator> +class PFInventoryGetInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetInventoryItemsResponseWrapper() = default; + + PFInventoryGetInventoryItemsResponseWrapper(const PFInventoryGetInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_eTag{ SafeString(model.eTag) }, + m_items{ model.items, model.items + model.itemsCount } + { + SetModelPointers(); + } + + PFInventoryGetInventoryItemsResponseWrapper(const PFInventoryGetInventoryItemsResponseWrapper& src) : + PFInventoryGetInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryGetInventoryItemsResponseWrapper(PFInventoryGetInventoryItemsResponseWrapper&& src) : + PFInventoryGetInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryGetInventoryItemsResponseWrapper& operator=(PFInventoryGetInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryGetInventoryItemsResponseWrapper& lhs, PFInventoryGetInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_items, rhs.m_items); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetItems(ModelVector, Alloc> value) + { + m_items = std::move(value); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + this->m_model.itemsCount = static_cast(m_items.size()); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.items = m_items.empty() ? nullptr : m_items.data(); + } + + String m_continuationToken; + String m_eTag; + ModelVector, Alloc> m_items; +}; + +template class Alloc = std::allocator> +class PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetMicrosoftStoreAccessTokensRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper() = default; + + PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper(const PFInventoryGetMicrosoftStoreAccessTokensRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper(const PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper& src) : + PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper{ src.Model() } + { + } + + PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper(PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper&& src) : + PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper& operator=(PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper() = default; + + friend void swap(PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper& lhs, PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetMicrosoftStoreAccessTokensResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper() = default; + + PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper(const PFInventoryGetMicrosoftStoreAccessTokensResponse& model) : + ModelWrapper{ model }, + m_collectionsAccessToken{ SafeString(model.collectionsAccessToken) } + { + SetModelPointers(); + } + + PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper(const PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper& src) : + PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper{ src.Model() } + { + } + + PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper(PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper&& src) : + PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper& operator=(PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper() = default; + + friend void swap(PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper& lhs, PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionsAccessToken, rhs.m_collectionsAccessToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionsAccessToken(String value) + { + m_collectionsAccessToken = std::move(value); + this->m_model.collectionsAccessToken = m_collectionsAccessToken.empty() ? nullptr : m_collectionsAccessToken.data(); + } + + void SetCollectionsAccessTokenExpirationDate(time_t value) + { + this->m_model.collectionsAccessTokenExpirationDate = value; + } + +private: + void SetModelPointers() + { + this->m_model.collectionsAccessToken = m_collectionsAccessToken.empty() ? nullptr : m_collectionsAccessToken.data(); + } + + String m_collectionsAccessToken; +}; + +template class Alloc = std::allocator> +class PFInventoryGetTransactionHistoryRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetTransactionHistoryRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetTransactionHistoryRequestWrapper() = default; + + PFInventoryGetTransactionHistoryRequestWrapper(const PFInventoryGetTransactionHistoryRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_filter{ SafeString(model.filter) } + { + SetModelPointers(); + } + + PFInventoryGetTransactionHistoryRequestWrapper(const PFInventoryGetTransactionHistoryRequestWrapper& src) : + PFInventoryGetTransactionHistoryRequestWrapper{ src.Model() } + { + } + + PFInventoryGetTransactionHistoryRequestWrapper(PFInventoryGetTransactionHistoryRequestWrapper&& src) : + PFInventoryGetTransactionHistoryRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryGetTransactionHistoryRequestWrapper& operator=(PFInventoryGetTransactionHistoryRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetTransactionHistoryRequestWrapper() = default; + + friend void swap(PFInventoryGetTransactionHistoryRequestWrapper& lhs, PFInventoryGetTransactionHistoryRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_filter, rhs.m_filter); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCount(int32_t value) + { + this->m_model.count = value; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetFilter(String value) + { + m_filter = std::move(value); + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.filter = m_filter.empty() ? nullptr : m_filter.data(); + } + + String m_collectionId; + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_filter; +}; + +template class Alloc = std::allocator> +class PFInventoryTransactionOperationWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransactionOperation; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransactionOperationWrapper() = default; + + PFInventoryTransactionOperationWrapper(const PFInventoryTransactionOperation& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_durationInSeconds{ model.durationInSeconds ? std::optional{ *model.durationInSeconds } : std::nullopt }, + m_itemId{ SafeString(model.itemId) }, + m_itemType{ SafeString(model.itemType) }, + m_stackId{ SafeString(model.stackId) }, + m_type{ SafeString(model.type) } + { + SetModelPointers(); + } + + PFInventoryTransactionOperationWrapper(const PFInventoryTransactionOperationWrapper& src) : + PFInventoryTransactionOperationWrapper{ src.Model() } + { + } + + PFInventoryTransactionOperationWrapper(PFInventoryTransactionOperationWrapper&& src) : + PFInventoryTransactionOperationWrapper{} + { + swap(*this, src); + } + + PFInventoryTransactionOperationWrapper& operator=(PFInventoryTransactionOperationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransactionOperationWrapper() = default; + + friend void swap(PFInventoryTransactionOperationWrapper& lhs, PFInventoryTransactionOperationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_durationInSeconds, rhs.m_durationInSeconds); + swap(lhs.m_itemId, rhs.m_itemId); + swap(lhs.m_itemType, rhs.m_itemType); + swap(lhs.m_stackId, rhs.m_stackId); + swap(lhs.m_type, rhs.m_type); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetDurationInSeconds(std::optional value) + { + m_durationInSeconds = std::move(value); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + } + + void SetItemId(String value) + { + m_itemId = std::move(value); + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + } + + void SetItemType(String value) + { + m_itemType = std::move(value); + this->m_model.itemType = m_itemType.empty() ? nullptr : m_itemType.data(); + } + + void SetStackId(String value) + { + m_stackId = std::move(value); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + } + + void SetType(String value) + { + m_type = std::move(value); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + this->m_model.itemId = m_itemId.empty() ? nullptr : m_itemId.data(); + this->m_model.itemType = m_itemType.empty() ? nullptr : m_itemType.data(); + this->m_model.stackId = m_stackId.empty() ? nullptr : m_stackId.data(); + this->m_model.type = m_type.empty() ? nullptr : m_type.data(); + } + + std::optional m_amount; + std::optional m_durationInSeconds; + String m_itemId; + String m_itemType; + String m_stackId; + String m_type; +}; + +template class Alloc = std::allocator> +class PFInventoryTransactionPurchaseDetailsWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransactionPurchaseDetails; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransactionPurchaseDetailsWrapper() = default; + + PFInventoryTransactionPurchaseDetailsWrapper(const PFInventoryTransactionPurchaseDetails& model) : + ModelWrapper{ model }, + m_storeId{ SafeString(model.storeId) } + { + SetModelPointers(); + } + + PFInventoryTransactionPurchaseDetailsWrapper(const PFInventoryTransactionPurchaseDetailsWrapper& src) : + PFInventoryTransactionPurchaseDetailsWrapper{ src.Model() } + { + } + + PFInventoryTransactionPurchaseDetailsWrapper(PFInventoryTransactionPurchaseDetailsWrapper&& src) : + PFInventoryTransactionPurchaseDetailsWrapper{} + { + swap(*this, src); + } + + PFInventoryTransactionPurchaseDetailsWrapper& operator=(PFInventoryTransactionPurchaseDetailsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransactionPurchaseDetailsWrapper() = default; + + friend void swap(PFInventoryTransactionPurchaseDetailsWrapper& lhs, PFInventoryTransactionPurchaseDetailsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_storeId, rhs.m_storeId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetStoreId(String value) + { + m_storeId = std::move(value); + this->m_model.storeId = m_storeId.empty() ? nullptr : m_storeId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.storeId = m_storeId.empty() ? nullptr : m_storeId.data(); + } + + String m_storeId; +}; + +template class Alloc = std::allocator> +class PFInventoryTransactionRedeemDetailsWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransactionRedeemDetails; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransactionRedeemDetailsWrapper() = default; + + PFInventoryTransactionRedeemDetailsWrapper(const PFInventoryTransactionRedeemDetails& model) : + ModelWrapper{ model }, + m_marketplace{ SafeString(model.marketplace) }, + m_marketplaceTransactionId{ SafeString(model.marketplaceTransactionId) }, + m_offerId{ SafeString(model.offerId) } + { + SetModelPointers(); + } + + PFInventoryTransactionRedeemDetailsWrapper(const PFInventoryTransactionRedeemDetailsWrapper& src) : + PFInventoryTransactionRedeemDetailsWrapper{ src.Model() } + { + } + + PFInventoryTransactionRedeemDetailsWrapper(PFInventoryTransactionRedeemDetailsWrapper&& src) : + PFInventoryTransactionRedeemDetailsWrapper{} + { + swap(*this, src); + } + + PFInventoryTransactionRedeemDetailsWrapper& operator=(PFInventoryTransactionRedeemDetailsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransactionRedeemDetailsWrapper() = default; + + friend void swap(PFInventoryTransactionRedeemDetailsWrapper& lhs, PFInventoryTransactionRedeemDetailsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_marketplace, rhs.m_marketplace); + swap(lhs.m_marketplaceTransactionId, rhs.m_marketplaceTransactionId); + swap(lhs.m_offerId, rhs.m_offerId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetMarketplace(String value) + { + m_marketplace = std::move(value); + this->m_model.marketplace = m_marketplace.empty() ? nullptr : m_marketplace.data(); + } + + void SetMarketplaceTransactionId(String value) + { + m_marketplaceTransactionId = std::move(value); + this->m_model.marketplaceTransactionId = m_marketplaceTransactionId.empty() ? nullptr : m_marketplaceTransactionId.data(); + } + + void SetOfferId(String value) + { + m_offerId = std::move(value); + this->m_model.offerId = m_offerId.empty() ? nullptr : m_offerId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.marketplace = m_marketplace.empty() ? nullptr : m_marketplace.data(); + this->m_model.marketplaceTransactionId = m_marketplaceTransactionId.empty() ? nullptr : m_marketplaceTransactionId.data(); + this->m_model.offerId = m_offerId.empty() ? nullptr : m_offerId.data(); + } + + String m_marketplace; + String m_marketplaceTransactionId; + String m_offerId; +}; + +template class Alloc = std::allocator> +class PFInventoryTransactionTransferDetailsWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransactionTransferDetails; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransactionTransferDetailsWrapper() = default; + + PFInventoryTransactionTransferDetailsWrapper(const PFInventoryTransactionTransferDetails& model) : + ModelWrapper{ model }, + m_givingCollectionId{ SafeString(model.givingCollectionId) }, + m_givingEntity{ model.givingEntity ? std::optional>{ *model.givingEntity } : std::nullopt }, + m_receivingCollectionId{ SafeString(model.receivingCollectionId) }, + m_receivingEntity{ model.receivingEntity ? std::optional>{ *model.receivingEntity } : std::nullopt }, + m_transferId{ SafeString(model.transferId) } + { + SetModelPointers(); + } + + PFInventoryTransactionTransferDetailsWrapper(const PFInventoryTransactionTransferDetailsWrapper& src) : + PFInventoryTransactionTransferDetailsWrapper{ src.Model() } + { + } + + PFInventoryTransactionTransferDetailsWrapper(PFInventoryTransactionTransferDetailsWrapper&& src) : + PFInventoryTransactionTransferDetailsWrapper{} + { + swap(*this, src); + } + + PFInventoryTransactionTransferDetailsWrapper& operator=(PFInventoryTransactionTransferDetailsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransactionTransferDetailsWrapper() = default; + + friend void swap(PFInventoryTransactionTransferDetailsWrapper& lhs, PFInventoryTransactionTransferDetailsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_givingCollectionId, rhs.m_givingCollectionId); + swap(lhs.m_givingEntity, rhs.m_givingEntity); + swap(lhs.m_receivingCollectionId, rhs.m_receivingCollectionId); + swap(lhs.m_receivingEntity, rhs.m_receivingEntity); + swap(lhs.m_transferId, rhs.m_transferId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGivingCollectionId(String value) + { + m_givingCollectionId = std::move(value); + this->m_model.givingCollectionId = m_givingCollectionId.empty() ? nullptr : m_givingCollectionId.data(); + } + + void SetGivingEntity(std::optional> value) + { + m_givingEntity = std::move(value); + this->m_model.givingEntity = m_givingEntity ? &m_givingEntity->Model() : nullptr; + } + + void SetReceivingCollectionId(String value) + { + m_receivingCollectionId = std::move(value); + this->m_model.receivingCollectionId = m_receivingCollectionId.empty() ? nullptr : m_receivingCollectionId.data(); + } + + void SetReceivingEntity(std::optional> value) + { + m_receivingEntity = std::move(value); + this->m_model.receivingEntity = m_receivingEntity ? &m_receivingEntity->Model() : nullptr; + } + + void SetTransferId(String value) + { + m_transferId = std::move(value); + this->m_model.transferId = m_transferId.empty() ? nullptr : m_transferId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.givingCollectionId = m_givingCollectionId.empty() ? nullptr : m_givingCollectionId.data(); + this->m_model.givingEntity = m_givingEntity ? &m_givingEntity->Model() : nullptr; + this->m_model.receivingCollectionId = m_receivingCollectionId.empty() ? nullptr : m_receivingCollectionId.data(); + this->m_model.receivingEntity = m_receivingEntity ? &m_receivingEntity->Model() : nullptr; + this->m_model.transferId = m_transferId.empty() ? nullptr : m_transferId.data(); + } + + String m_givingCollectionId; + std::optional> m_givingEntity; + String m_receivingCollectionId; + std::optional> m_receivingEntity; + String m_transferId; +}; + +template class Alloc = std::allocator> +class PFInventoryTransactionWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransaction; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransactionWrapper() = default; + + PFInventoryTransactionWrapper(const PFInventoryTransaction& model) : + ModelWrapper{ model }, + m_apiName{ SafeString(model.apiName) }, + m_itemType{ SafeString(model.itemType) }, + m_operations{ model.operations, model.operations + model.operationsCount }, + m_operationType{ SafeString(model.operationType) }, + m_purchaseDetails{ model.purchaseDetails ? std::optional>{ *model.purchaseDetails } : std::nullopt }, + m_redeemDetails{ model.redeemDetails ? std::optional>{ *model.redeemDetails } : std::nullopt }, + m_transactionId{ SafeString(model.transactionId) }, + m_transferDetails{ model.transferDetails ? std::optional>{ *model.transferDetails } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryTransactionWrapper(const PFInventoryTransactionWrapper& src) : + PFInventoryTransactionWrapper{ src.Model() } + { + } + + PFInventoryTransactionWrapper(PFInventoryTransactionWrapper&& src) : + PFInventoryTransactionWrapper{} + { + swap(*this, src); + } + + PFInventoryTransactionWrapper& operator=(PFInventoryTransactionWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransactionWrapper() = default; + + friend void swap(PFInventoryTransactionWrapper& lhs, PFInventoryTransactionWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_apiName, rhs.m_apiName); + swap(lhs.m_itemType, rhs.m_itemType); + swap(lhs.m_operations, rhs.m_operations); + swap(lhs.m_operationType, rhs.m_operationType); + swap(lhs.m_purchaseDetails, rhs.m_purchaseDetails); + swap(lhs.m_redeemDetails, rhs.m_redeemDetails); + swap(lhs.m_transactionId, rhs.m_transactionId); + swap(lhs.m_transferDetails, rhs.m_transferDetails); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetApiName(String value) + { + m_apiName = std::move(value); + this->m_model.apiName = m_apiName.empty() ? nullptr : m_apiName.data(); + } + + void SetItemType(String value) + { + m_itemType = std::move(value); + this->m_model.itemType = m_itemType.empty() ? nullptr : m_itemType.data(); + } + + void SetOperations(ModelVector, Alloc> value) + { + m_operations = std::move(value); + this->m_model.operations = m_operations.empty() ? nullptr : m_operations.data(); + this->m_model.operationsCount = static_cast(m_operations.size()); + } + + void SetOperationType(String value) + { + m_operationType = std::move(value); + this->m_model.operationType = m_operationType.empty() ? nullptr : m_operationType.data(); + } + + void SetPurchaseDetails(std::optional> value) + { + m_purchaseDetails = std::move(value); + this->m_model.purchaseDetails = m_purchaseDetails ? &m_purchaseDetails->Model() : nullptr; + } + + void SetRedeemDetails(std::optional> value) + { + m_redeemDetails = std::move(value); + this->m_model.redeemDetails = m_redeemDetails ? &m_redeemDetails->Model() : nullptr; + } + + void SetTimestamp(time_t value) + { + this->m_model.timestamp = value; + } + + void SetTransactionId(String value) + { + m_transactionId = std::move(value); + this->m_model.transactionId = m_transactionId.empty() ? nullptr : m_transactionId.data(); + } + + void SetTransferDetails(std::optional> value) + { + m_transferDetails = std::move(value); + this->m_model.transferDetails = m_transferDetails ? &m_transferDetails->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.apiName = m_apiName.empty() ? nullptr : m_apiName.data(); + this->m_model.itemType = m_itemType.empty() ? nullptr : m_itemType.data(); + this->m_model.operations = m_operations.empty() ? nullptr : m_operations.data(); + this->m_model.operationType = m_operationType.empty() ? nullptr : m_operationType.data(); + this->m_model.purchaseDetails = m_purchaseDetails ? &m_purchaseDetails->Model() : nullptr; + this->m_model.redeemDetails = m_redeemDetails ? &m_redeemDetails->Model() : nullptr; + this->m_model.transactionId = m_transactionId.empty() ? nullptr : m_transactionId.data(); + this->m_model.transferDetails = m_transferDetails ? &m_transferDetails->Model() : nullptr; + } + + String m_apiName; + String m_itemType; + ModelVector, Alloc> m_operations; + String m_operationType; + std::optional> m_purchaseDetails; + std::optional> m_redeemDetails; + String m_transactionId; + std::optional> m_transferDetails; +}; + +template class Alloc = std::allocator> +class PFInventoryGetTransactionHistoryResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGetTransactionHistoryResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGetTransactionHistoryResponseWrapper() = default; + + PFInventoryGetTransactionHistoryResponseWrapper(const PFInventoryGetTransactionHistoryResponse& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_transactions{ model.transactions, model.transactions + model.transactionsCount } + { + SetModelPointers(); + } + + PFInventoryGetTransactionHistoryResponseWrapper(const PFInventoryGetTransactionHistoryResponseWrapper& src) : + PFInventoryGetTransactionHistoryResponseWrapper{ src.Model() } + { + } + + PFInventoryGetTransactionHistoryResponseWrapper(PFInventoryGetTransactionHistoryResponseWrapper&& src) : + PFInventoryGetTransactionHistoryResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryGetTransactionHistoryResponseWrapper& operator=(PFInventoryGetTransactionHistoryResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGetTransactionHistoryResponseWrapper() = default; + + friend void swap(PFInventoryGetTransactionHistoryResponseWrapper& lhs, PFInventoryGetTransactionHistoryResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_transactions, rhs.m_transactions); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetTransactions(ModelVector, Alloc> value) + { + m_transactions = std::move(value); + this->m_model.transactions = m_transactions.empty() ? nullptr : m_transactions.data(); + this->m_model.transactionsCount = static_cast(m_transactions.size()); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.transactions = m_transactions.empty() ? nullptr : m_transactions.data(); + } + + String m_continuationToken; + ModelVector, Alloc> m_transactions; +}; + +template class Alloc = std::allocator> +class PFInventoryPurchaseInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryPurchaseInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryPurchaseInventoryItemsRequestWrapper() = default; + + PFInventoryPurchaseInventoryItemsRequestWrapper(const PFInventoryPurchaseInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_durationInSeconds{ model.durationInSeconds ? std::optional{ *model.durationInSeconds } : std::nullopt }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt }, + m_newStackValues{ model.newStackValues ? std::optional>{ *model.newStackValues } : std::nullopt }, + m_priceAmounts{ model.priceAmounts, model.priceAmounts + model.priceAmountsCount }, + m_storeId{ SafeString(model.storeId) } + { + SetModelPointers(); + } + + PFInventoryPurchaseInventoryItemsRequestWrapper(const PFInventoryPurchaseInventoryItemsRequestWrapper& src) : + PFInventoryPurchaseInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryPurchaseInventoryItemsRequestWrapper(PFInventoryPurchaseInventoryItemsRequestWrapper&& src) : + PFInventoryPurchaseInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryPurchaseInventoryItemsRequestWrapper& operator=(PFInventoryPurchaseInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryPurchaseInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryPurchaseInventoryItemsRequestWrapper& lhs, PFInventoryPurchaseInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_durationInSeconds, rhs.m_durationInSeconds); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_item, rhs.m_item); + swap(lhs.m_newStackValues, rhs.m_newStackValues); + swap(lhs.m_priceAmounts, rhs.m_priceAmounts); + swap(lhs.m_storeId, rhs.m_storeId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDeleteEmptyStacks(bool value) + { + this->m_model.deleteEmptyStacks = value; + } + + void SetDurationInSeconds(std::optional value) + { + m_durationInSeconds = std::move(value); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + void SetNewStackValues(std::optional> value) + { + m_newStackValues = std::move(value); + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + + void SetPriceAmounts(ModelVector, Alloc> value) + { + m_priceAmounts = std::move(value); + this->m_model.priceAmounts = m_priceAmounts.empty() ? nullptr : m_priceAmounts.data(); + this->m_model.priceAmountsCount = static_cast(m_priceAmounts.size()); + } + + void SetStoreId(String value) + { + m_storeId = std::move(value); + this->m_model.storeId = m_storeId.empty() ? nullptr : m_storeId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + this->m_model.priceAmounts = m_priceAmounts.empty() ? nullptr : m_priceAmounts.data(); + this->m_model.storeId = m_storeId.empty() ? nullptr : m_storeId.data(); + } + + std::optional m_amount; + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional m_durationInSeconds; + std::optional> m_entity; + String m_eTag; + String m_idempotencyId; + std::optional> m_item; + std::optional> m_newStackValues; + ModelVector, Alloc> m_priceAmounts; + String m_storeId; +}; + +template class Alloc = std::allocator> +class PFInventoryPurchaseInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryPurchaseInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryPurchaseInventoryItemsResponseWrapper() = default; + + PFInventoryPurchaseInventoryItemsResponseWrapper(const PFInventoryPurchaseInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryPurchaseInventoryItemsResponseWrapper(const PFInventoryPurchaseInventoryItemsResponseWrapper& src) : + PFInventoryPurchaseInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryPurchaseInventoryItemsResponseWrapper(PFInventoryPurchaseInventoryItemsResponseWrapper&& src) : + PFInventoryPurchaseInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryPurchaseInventoryItemsResponseWrapper& operator=(PFInventoryPurchaseInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryPurchaseInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryPurchaseInventoryItemsResponseWrapper& lhs, PFInventoryPurchaseInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + String m_eTag; + String m_idempotencyId; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemAppleAppStoreInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper() = default; + + PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper(const PFInventoryRedeemAppleAppStoreInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_receipt{ SafeString(model.receipt) } + { + SetModelPointers(); + } + + PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper(const PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper& src) : + PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper(PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper&& src) : + PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper& operator=(PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper& lhs, PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_receipt, rhs.m_receipt); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetReceipt(String value) + { + m_receipt = std::move(value); + this->m_model.receipt = m_receipt.empty() ? nullptr : m_receipt.data(); + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.receipt = m_receipt.empty() ? nullptr : m_receipt.data(); + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_receipt; +}; + +template class Alloc = std::allocator> +class PFInventoryRedemptionFailureWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedemptionFailure; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedemptionFailureWrapper() = default; + + PFInventoryRedemptionFailureWrapper(const PFInventoryRedemptionFailure& model) : + ModelWrapper{ model }, + m_failureCode{ SafeString(model.failureCode) }, + m_failureDetails{ SafeString(model.failureDetails) }, + m_marketplaceTransactionId{ SafeString(model.marketplaceTransactionId) }, + m_offerId{ SafeString(model.offerId) } + { + SetModelPointers(); + } + + PFInventoryRedemptionFailureWrapper(const PFInventoryRedemptionFailureWrapper& src) : + PFInventoryRedemptionFailureWrapper{ src.Model() } + { + } + + PFInventoryRedemptionFailureWrapper(PFInventoryRedemptionFailureWrapper&& src) : + PFInventoryRedemptionFailureWrapper{} + { + swap(*this, src); + } + + PFInventoryRedemptionFailureWrapper& operator=(PFInventoryRedemptionFailureWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedemptionFailureWrapper() = default; + + friend void swap(PFInventoryRedemptionFailureWrapper& lhs, PFInventoryRedemptionFailureWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_failureCode, rhs.m_failureCode); + swap(lhs.m_failureDetails, rhs.m_failureDetails); + swap(lhs.m_marketplaceTransactionId, rhs.m_marketplaceTransactionId); + swap(lhs.m_offerId, rhs.m_offerId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFailureCode(String value) + { + m_failureCode = std::move(value); + this->m_model.failureCode = m_failureCode.empty() ? nullptr : m_failureCode.data(); + } + + void SetFailureDetails(String value) + { + m_failureDetails = std::move(value); + this->m_model.failureDetails = m_failureDetails.empty() ? nullptr : m_failureDetails.data(); + } + + void SetMarketplaceTransactionId(String value) + { + m_marketplaceTransactionId = std::move(value); + this->m_model.marketplaceTransactionId = m_marketplaceTransactionId.empty() ? nullptr : m_marketplaceTransactionId.data(); + } + + void SetOfferId(String value) + { + m_offerId = std::move(value); + this->m_model.offerId = m_offerId.empty() ? nullptr : m_offerId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.failureCode = m_failureCode.empty() ? nullptr : m_failureCode.data(); + this->m_model.failureDetails = m_failureDetails.empty() ? nullptr : m_failureDetails.data(); + this->m_model.marketplaceTransactionId = m_marketplaceTransactionId.empty() ? nullptr : m_marketplaceTransactionId.data(); + this->m_model.offerId = m_offerId.empty() ? nullptr : m_offerId.data(); + } + + String m_failureCode; + String m_failureDetails; + String m_marketplaceTransactionId; + String m_offerId; +}; + +template class Alloc = std::allocator> +class PFInventoryRedemptionSuccessWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedemptionSuccess; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedemptionSuccessWrapper() = default; + + PFInventoryRedemptionSuccessWrapper(const PFInventoryRedemptionSuccess& model) : + ModelWrapper{ model }, + m_marketplaceTransactionId{ SafeString(model.marketplaceTransactionId) }, + m_offerId{ SafeString(model.offerId) } + { + SetModelPointers(); + } + + PFInventoryRedemptionSuccessWrapper(const PFInventoryRedemptionSuccessWrapper& src) : + PFInventoryRedemptionSuccessWrapper{ src.Model() } + { + } + + PFInventoryRedemptionSuccessWrapper(PFInventoryRedemptionSuccessWrapper&& src) : + PFInventoryRedemptionSuccessWrapper{} + { + swap(*this, src); + } + + PFInventoryRedemptionSuccessWrapper& operator=(PFInventoryRedemptionSuccessWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedemptionSuccessWrapper() = default; + + friend void swap(PFInventoryRedemptionSuccessWrapper& lhs, PFInventoryRedemptionSuccessWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_marketplaceTransactionId, rhs.m_marketplaceTransactionId); + swap(lhs.m_offerId, rhs.m_offerId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetMarketplaceTransactionId(String value) + { + m_marketplaceTransactionId = std::move(value); + this->m_model.marketplaceTransactionId = m_marketplaceTransactionId.empty() ? nullptr : m_marketplaceTransactionId.data(); + } + + void SetOfferId(String value) + { + m_offerId = std::move(value); + this->m_model.offerId = m_offerId.empty() ? nullptr : m_offerId.data(); + } + + void SetSuccessTimestamp(time_t value) + { + this->m_model.successTimestamp = value; + } + +private: + void SetModelPointers() + { + this->m_model.marketplaceTransactionId = m_marketplaceTransactionId.empty() ? nullptr : m_marketplaceTransactionId.data(); + this->m_model.offerId = m_offerId.empty() ? nullptr : m_offerId.data(); + } + + String m_marketplaceTransactionId; + String m_offerId; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemAppleAppStoreInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper() = default; + + PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper(const PFInventoryRedeemAppleAppStoreInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_failed{ model.failed, model.failed + model.failedCount }, + m_succeeded{ model.succeeded, model.succeeded + model.succeededCount }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper(const PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper& src) : + PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper(PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper&& src) : + PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper& operator=(PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper& lhs, PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_failed, rhs.m_failed); + swap(lhs.m_succeeded, rhs.m_succeeded); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFailed(ModelVector, Alloc> value) + { + m_failed = std::move(value); + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.failedCount = static_cast(m_failed.size()); + } + + void SetSucceeded(ModelVector, Alloc> value) + { + m_succeeded = std::move(value); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.succeededCount = static_cast(m_succeeded.size()); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + ModelVector, Alloc> m_failed; + ModelVector, Alloc> m_succeeded; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryGooglePlayProductPurchaseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryGooglePlayProductPurchase; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryGooglePlayProductPurchaseWrapper() = default; + + PFInventoryGooglePlayProductPurchaseWrapper(const PFInventoryGooglePlayProductPurchase& model) : + ModelWrapper{ model }, + m_productId{ SafeString(model.productId) }, + m_token{ SafeString(model.token) } + { + SetModelPointers(); + } + + PFInventoryGooglePlayProductPurchaseWrapper(const PFInventoryGooglePlayProductPurchaseWrapper& src) : + PFInventoryGooglePlayProductPurchaseWrapper{ src.Model() } + { + } + + PFInventoryGooglePlayProductPurchaseWrapper(PFInventoryGooglePlayProductPurchaseWrapper&& src) : + PFInventoryGooglePlayProductPurchaseWrapper{} + { + swap(*this, src); + } + + PFInventoryGooglePlayProductPurchaseWrapper& operator=(PFInventoryGooglePlayProductPurchaseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryGooglePlayProductPurchaseWrapper() = default; + + friend void swap(PFInventoryGooglePlayProductPurchaseWrapper& lhs, PFInventoryGooglePlayProductPurchaseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_productId, rhs.m_productId); + swap(lhs.m_token, rhs.m_token); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetProductId(String value) + { + m_productId = std::move(value); + this->m_model.productId = m_productId.empty() ? nullptr : m_productId.data(); + } + + void SetToken(String value) + { + m_token = std::move(value); + this->m_model.token = m_token.empty() ? nullptr : m_token.data(); + } + +private: + void SetModelPointers() + { + this->m_model.productId = m_productId.empty() ? nullptr : m_productId.data(); + this->m_model.token = m_token.empty() ? nullptr : m_token.data(); + } + + String m_productId; + String m_token; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemGooglePlayInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper() = default; + + PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper(const PFInventoryRedeemGooglePlayInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_purchases{ model.purchases, model.purchases + model.purchasesCount } + { + SetModelPointers(); + } + + PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper(const PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper& src) : + PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper(PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper&& src) : + PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper& operator=(PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper& lhs, PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_purchases, rhs.m_purchases); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetPurchases(ModelVector, Alloc> value) + { + m_purchases = std::move(value); + this->m_model.purchases = m_purchases.empty() ? nullptr : m_purchases.data(); + this->m_model.purchasesCount = static_cast(m_purchases.size()); + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.purchases = m_purchases.empty() ? nullptr : m_purchases.data(); + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + ModelVector, Alloc> m_purchases; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemGooglePlayInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper() = default; + + PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper(const PFInventoryRedeemGooglePlayInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_failed{ model.failed, model.failed + model.failedCount }, + m_succeeded{ model.succeeded, model.succeeded + model.succeededCount }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper(const PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper& src) : + PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper(PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper&& src) : + PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper& operator=(PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper& lhs, PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_failed, rhs.m_failed); + swap(lhs.m_succeeded, rhs.m_succeeded); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFailed(ModelVector, Alloc> value) + { + m_failed = std::move(value); + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.failedCount = static_cast(m_failed.size()); + } + + void SetSucceeded(ModelVector, Alloc> value) + { + m_succeeded = std::move(value); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.succeededCount = static_cast(m_succeeded.size()); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + ModelVector, Alloc> m_failed; + ModelVector, Alloc> m_succeeded; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemMicrosoftStoreInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + +#if HC_PLATFORM == HC_PLATFORM_GDK + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper(XUser user) + : m_user{ std::move(user) } + { + SetModelPointers(); + } +#else + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper() = default; +#endif + + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper(const PFInventoryRedeemMicrosoftStoreInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_collectionsIdKey{ SafeString(model.collectionsIdKey) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, +#if HC_PLATFORM == HC_PLATFORM_GDK + m_user{ XUser::Duplicate(model.user) } +#else + m_xboxToken{ SafeString(model.xboxToken) } +#endif + { + SetModelPointers(); + } + + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper(const PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper& src) : + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper(PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper&& src) : +#if HC_PLATFORM == HC_PLATFORM_GDK + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper{ XUser::Wrap(nullptr) } +#else + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper{} +#endif + { + swap(*this, src); + } + + PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper& operator=(PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper& lhs, PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_collectionsIdKey, rhs.m_collectionsIdKey); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); +#if HC_PLATFORM == HC_PLATFORM_GDK + swap(lhs.m_user, rhs.m_user); +#endif + swap(lhs.m_xboxToken, rhs.m_xboxToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCollectionsIdKey(String value) + { + m_collectionsIdKey = std::move(value); + this->m_model.collectionsIdKey = m_collectionsIdKey.empty() ? nullptr : m_collectionsIdKey.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +#if HC_PLATFORM == HC_PLATFORM_GDK + void SetUser(XUser value) + { + m_user = std::move(value); + this->m_model.user = m_user.Handle(); + } +#else + void SetXboxToken(String value) + { + m_xboxToken = std::move(value); + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); + } +#endif + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.collectionsIdKey = m_collectionsIdKey.empty() ? nullptr : m_collectionsIdKey.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; +#if HC_PLATFORM == HC_PLATFORM_GDK + this->m_model.user = m_user.Handle(); +#else + this->m_model.xboxToken = m_xboxToken.empty() ? nullptr : m_xboxToken.data(); +#endif + } + + String m_collectionId; + String m_collectionsIdKey; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +#if HC_PLATFORM == HC_PLATFORM_GDK + XUser m_user; +#endif + String m_xboxToken; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemMicrosoftStoreInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper() = default; + + PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper(const PFInventoryRedeemMicrosoftStoreInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_failed{ model.failed, model.failed + model.failedCount }, + m_succeeded{ model.succeeded, model.succeeded + model.succeededCount }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper(const PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper& src) : + PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper(PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper&& src) : + PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper& operator=(PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper& lhs, PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_failed, rhs.m_failed); + swap(lhs.m_succeeded, rhs.m_succeeded); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFailed(ModelVector, Alloc> value) + { + m_failed = std::move(value); + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.failedCount = static_cast(m_failed.size()); + } + + void SetSucceeded(ModelVector, Alloc> value) + { + m_succeeded = std::move(value); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.succeededCount = static_cast(m_succeeded.size()); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + ModelVector, Alloc> m_failed; + ModelVector, Alloc> m_succeeded; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemNintendoEShopInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper() = default; + + PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper(const PFInventoryRedeemNintendoEShopInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_nintendoServiceAccountIdToken{ SafeString(model.nintendoServiceAccountIdToken) } + { + SetModelPointers(); + } + + PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper(const PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper& src) : + PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper(PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper&& src) : + PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper& operator=(PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper& lhs, PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_nintendoServiceAccountIdToken, rhs.m_nintendoServiceAccountIdToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetNintendoServiceAccountIdToken(String value) + { + m_nintendoServiceAccountIdToken = std::move(value); + this->m_model.nintendoServiceAccountIdToken = m_nintendoServiceAccountIdToken.empty() ? nullptr : m_nintendoServiceAccountIdToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.nintendoServiceAccountIdToken = m_nintendoServiceAccountIdToken.empty() ? nullptr : m_nintendoServiceAccountIdToken.data(); + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_nintendoServiceAccountIdToken; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemNintendoEShopInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper() = default; + + PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper(const PFInventoryRedeemNintendoEShopInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_failed{ model.failed, model.failed + model.failedCount }, + m_succeeded{ model.succeeded, model.succeeded + model.succeededCount }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper(const PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper& src) : + PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper(PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper&& src) : + PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper& operator=(PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper& lhs, PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_failed, rhs.m_failed); + swap(lhs.m_succeeded, rhs.m_succeeded); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFailed(ModelVector, Alloc> value) + { + m_failed = std::move(value); + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.failedCount = static_cast(m_failed.size()); + } + + void SetSucceeded(ModelVector, Alloc> value) + { + m_succeeded = std::move(value); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.succeededCount = static_cast(m_succeeded.size()); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + ModelVector, Alloc> m_failed; + ModelVector, Alloc> m_succeeded; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemPlayStationStoreInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper() = default; + + PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper(const PFInventoryRedeemPlayStationStoreInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_authorizationCode{ SafeString(model.authorizationCode) }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_redirectUri{ SafeString(model.redirectUri) }, + m_serviceLabel{ SafeString(model.serviceLabel) } + { + SetModelPointers(); + } + + PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper(const PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper& src) : + PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper(PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper&& src) : + PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper& operator=(PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper& lhs, PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_authorizationCode, rhs.m_authorizationCode); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_redirectUri, rhs.m_redirectUri); + swap(lhs.m_serviceLabel, rhs.m_serviceLabel); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAuthorizationCode(String value) + { + m_authorizationCode = std::move(value); + this->m_model.authorizationCode = m_authorizationCode.empty() ? nullptr : m_authorizationCode.data(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetRedirectUri(String value) + { + m_redirectUri = std::move(value); + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + + void SetServiceLabel(String value) + { + m_serviceLabel = std::move(value); + this->m_model.serviceLabel = m_serviceLabel.empty() ? nullptr : m_serviceLabel.data(); + } + +private: + void SetModelPointers() + { + this->m_model.authorizationCode = m_authorizationCode.empty() ? nullptr : m_authorizationCode.data(); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + this->m_model.serviceLabel = m_serviceLabel.empty() ? nullptr : m_serviceLabel.data(); + } + + String m_authorizationCode; + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_redirectUri; + String m_serviceLabel; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemPlayStationStoreInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper() = default; + + PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper(const PFInventoryRedeemPlayStationStoreInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_failed{ model.failed, model.failed + model.failedCount }, + m_succeeded{ model.succeeded, model.succeeded + model.succeededCount }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper(const PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper& src) : + PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper(PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper&& src) : + PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper& operator=(PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper& lhs, PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_failed, rhs.m_failed); + swap(lhs.m_succeeded, rhs.m_succeeded); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFailed(ModelVector, Alloc> value) + { + m_failed = std::move(value); + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.failedCount = static_cast(m_failed.size()); + } + + void SetSucceeded(ModelVector, Alloc> value) + { + m_succeeded = std::move(value); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.succeededCount = static_cast(m_succeeded.size()); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + ModelVector, Alloc> m_failed; + ModelVector, Alloc> m_succeeded; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemSteamInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemSteamInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemSteamInventoryItemsRequestWrapper() = default; + + PFInventoryRedeemSteamInventoryItemsRequestWrapper(const PFInventoryRedeemSteamInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryRedeemSteamInventoryItemsRequestWrapper(const PFInventoryRedeemSteamInventoryItemsRequestWrapper& src) : + PFInventoryRedeemSteamInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryRedeemSteamInventoryItemsRequestWrapper(PFInventoryRedeemSteamInventoryItemsRequestWrapper&& src) : + PFInventoryRedeemSteamInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemSteamInventoryItemsRequestWrapper& operator=(PFInventoryRedeemSteamInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemSteamInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryRedeemSteamInventoryItemsRequestWrapper& lhs, PFInventoryRedeemSteamInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFInventoryRedeemSteamInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryRedeemSteamInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryRedeemSteamInventoryItemsResponseWrapper() = default; + + PFInventoryRedeemSteamInventoryItemsResponseWrapper(const PFInventoryRedeemSteamInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_failed{ model.failed, model.failed + model.failedCount }, + m_succeeded{ model.succeeded, model.succeeded + model.succeededCount }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryRedeemSteamInventoryItemsResponseWrapper(const PFInventoryRedeemSteamInventoryItemsResponseWrapper& src) : + PFInventoryRedeemSteamInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryRedeemSteamInventoryItemsResponseWrapper(PFInventoryRedeemSteamInventoryItemsResponseWrapper&& src) : + PFInventoryRedeemSteamInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryRedeemSteamInventoryItemsResponseWrapper& operator=(PFInventoryRedeemSteamInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryRedeemSteamInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryRedeemSteamInventoryItemsResponseWrapper& lhs, PFInventoryRedeemSteamInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_failed, rhs.m_failed); + swap(lhs.m_succeeded, rhs.m_succeeded); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFailed(ModelVector, Alloc> value) + { + m_failed = std::move(value); + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.failedCount = static_cast(m_failed.size()); + } + + void SetSucceeded(ModelVector, Alloc> value) + { + m_succeeded = std::move(value); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.succeededCount = static_cast(m_succeeded.size()); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.failed = m_failed.empty() ? nullptr : m_failed.data(); + this->m_model.succeeded = m_succeeded.empty() ? nullptr : m_succeeded.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + ModelVector, Alloc> m_failed; + ModelVector, Alloc> m_succeeded; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventorySubtractInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventorySubtractInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventorySubtractInventoryItemsRequestWrapper() = default; + + PFInventorySubtractInventoryItemsRequestWrapper(const PFInventorySubtractInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_durationInSeconds{ model.durationInSeconds ? std::optional{ *model.durationInSeconds } : std::nullopt }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFInventorySubtractInventoryItemsRequestWrapper(const PFInventorySubtractInventoryItemsRequestWrapper& src) : + PFInventorySubtractInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventorySubtractInventoryItemsRequestWrapper(PFInventorySubtractInventoryItemsRequestWrapper&& src) : + PFInventorySubtractInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventorySubtractInventoryItemsRequestWrapper& operator=(PFInventorySubtractInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventorySubtractInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventorySubtractInventoryItemsRequestWrapper& lhs, PFInventorySubtractInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_durationInSeconds, rhs.m_durationInSeconds); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDeleteEmptyStacks(bool value) + { + this->m_model.deleteEmptyStacks = value; + } + + void SetDurationInSeconds(std::optional value) + { + m_durationInSeconds = std::move(value); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.durationInSeconds = m_durationInSeconds ? m_durationInSeconds.operator->() : nullptr; + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + std::optional m_amount; + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional m_durationInSeconds; + std::optional> m_entity; + String m_eTag; + String m_idempotencyId; + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFInventorySubtractInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventorySubtractInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventorySubtractInventoryItemsResponseWrapper() = default; + + PFInventorySubtractInventoryItemsResponseWrapper(const PFInventorySubtractInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventorySubtractInventoryItemsResponseWrapper(const PFInventorySubtractInventoryItemsResponseWrapper& src) : + PFInventorySubtractInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventorySubtractInventoryItemsResponseWrapper(PFInventorySubtractInventoryItemsResponseWrapper&& src) : + PFInventorySubtractInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventorySubtractInventoryItemsResponseWrapper& operator=(PFInventorySubtractInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventorySubtractInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventorySubtractInventoryItemsResponseWrapper& lhs, PFInventorySubtractInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + String m_eTag; + String m_idempotencyId; + CStringVector m_transactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryTransferInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransferInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransferInventoryItemsRequestWrapper() = default; + + PFInventoryTransferInventoryItemsRequestWrapper(const PFInventoryTransferInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_amount{ model.amount ? std::optional{ *model.amount } : std::nullopt }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_givingCollectionId{ SafeString(model.givingCollectionId) }, + m_givingEntity{ model.givingEntity ? std::optional>{ *model.givingEntity } : std::nullopt }, + m_givingETag{ SafeString(model.givingETag) }, + m_givingItem{ model.givingItem ? std::optional>{ *model.givingItem } : std::nullopt }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_newStackValues{ model.newStackValues ? std::optional>{ *model.newStackValues } : std::nullopt }, + m_receivingCollectionId{ SafeString(model.receivingCollectionId) }, + m_receivingEntity{ model.receivingEntity ? std::optional>{ *model.receivingEntity } : std::nullopt }, + m_receivingItem{ model.receivingItem ? std::optional>{ *model.receivingItem } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryTransferInventoryItemsRequestWrapper(const PFInventoryTransferInventoryItemsRequestWrapper& src) : + PFInventoryTransferInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryTransferInventoryItemsRequestWrapper(PFInventoryTransferInventoryItemsRequestWrapper&& src) : + PFInventoryTransferInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryTransferInventoryItemsRequestWrapper& operator=(PFInventoryTransferInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransferInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryTransferInventoryItemsRequestWrapper& lhs, PFInventoryTransferInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_amount, rhs.m_amount); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_givingCollectionId, rhs.m_givingCollectionId); + swap(lhs.m_givingEntity, rhs.m_givingEntity); + swap(lhs.m_givingETag, rhs.m_givingETag); + swap(lhs.m_givingItem, rhs.m_givingItem); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_newStackValues, rhs.m_newStackValues); + swap(lhs.m_receivingCollectionId, rhs.m_receivingCollectionId); + swap(lhs.m_receivingEntity, rhs.m_receivingEntity); + swap(lhs.m_receivingItem, rhs.m_receivingItem); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAmount(std::optional value) + { + m_amount = std::move(value); + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDeleteEmptyStacks(bool value) + { + this->m_model.deleteEmptyStacks = value; + } + + void SetGivingCollectionId(String value) + { + m_givingCollectionId = std::move(value); + this->m_model.givingCollectionId = m_givingCollectionId.empty() ? nullptr : m_givingCollectionId.data(); + } + + void SetGivingEntity(std::optional> value) + { + m_givingEntity = std::move(value); + this->m_model.givingEntity = m_givingEntity ? &m_givingEntity->Model() : nullptr; + } + + void SetGivingETag(String value) + { + m_givingETag = std::move(value); + this->m_model.givingETag = m_givingETag.empty() ? nullptr : m_givingETag.data(); + } + + void SetGivingItem(std::optional> value) + { + m_givingItem = std::move(value); + this->m_model.givingItem = m_givingItem ? &m_givingItem->Model() : nullptr; + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetNewStackValues(std::optional> value) + { + m_newStackValues = std::move(value); + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + } + + void SetReceivingCollectionId(String value) + { + m_receivingCollectionId = std::move(value); + this->m_model.receivingCollectionId = m_receivingCollectionId.empty() ? nullptr : m_receivingCollectionId.data(); + } + + void SetReceivingEntity(std::optional> value) + { + m_receivingEntity = std::move(value); + this->m_model.receivingEntity = m_receivingEntity ? &m_receivingEntity->Model() : nullptr; + } + + void SetReceivingItem(std::optional> value) + { + m_receivingItem = std::move(value); + this->m_model.receivingItem = m_receivingItem ? &m_receivingItem->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.amount = m_amount ? m_amount.operator->() : nullptr; + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.givingCollectionId = m_givingCollectionId.empty() ? nullptr : m_givingCollectionId.data(); + this->m_model.givingEntity = m_givingEntity ? &m_givingEntity->Model() : nullptr; + this->m_model.givingETag = m_givingETag.empty() ? nullptr : m_givingETag.data(); + this->m_model.givingItem = m_givingItem ? &m_givingItem->Model() : nullptr; + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.newStackValues = m_newStackValues ? &m_newStackValues->Model() : nullptr; + this->m_model.receivingCollectionId = m_receivingCollectionId.empty() ? nullptr : m_receivingCollectionId.data(); + this->m_model.receivingEntity = m_receivingEntity ? &m_receivingEntity->Model() : nullptr; + this->m_model.receivingItem = m_receivingItem ? &m_receivingItem->Model() : nullptr; + } + + std::optional m_amount; + StringDictionaryEntryVector m_customTags; + String m_givingCollectionId; + std::optional> m_givingEntity; + String m_givingETag; + std::optional> m_givingItem; + String m_idempotencyId; + std::optional> m_newStackValues; + String m_receivingCollectionId; + std::optional> m_receivingEntity; + std::optional> m_receivingItem; +}; + +template class Alloc = std::allocator> +class PFInventoryTransferInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryTransferInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryTransferInventoryItemsResponseWrapper() = default; + + PFInventoryTransferInventoryItemsResponseWrapper(const PFInventoryTransferInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_givingETag{ SafeString(model.givingETag) }, + m_givingTransactionIds{ model.givingTransactionIds, model.givingTransactionIds + model.givingTransactionIdsCount }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_receivingTransactionIds{ model.receivingTransactionIds, model.receivingTransactionIds + model.receivingTransactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryTransferInventoryItemsResponseWrapper(const PFInventoryTransferInventoryItemsResponseWrapper& src) : + PFInventoryTransferInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryTransferInventoryItemsResponseWrapper(PFInventoryTransferInventoryItemsResponseWrapper&& src) : + PFInventoryTransferInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryTransferInventoryItemsResponseWrapper& operator=(PFInventoryTransferInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryTransferInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryTransferInventoryItemsResponseWrapper& lhs, PFInventoryTransferInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_givingETag, rhs.m_givingETag); + swap(lhs.m_givingTransactionIds, rhs.m_givingTransactionIds); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_receivingTransactionIds, rhs.m_receivingTransactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGivingETag(String value) + { + m_givingETag = std::move(value); + this->m_model.givingETag = m_givingETag.empty() ? nullptr : m_givingETag.data(); + } + + void SetGivingTransactionIds(CStringVector value) + { + m_givingTransactionIds = std::move(value); + this->m_model.givingTransactionIds = m_givingTransactionIds.empty() ? nullptr : m_givingTransactionIds.data(); + this->m_model.givingTransactionIdsCount = static_cast(m_givingTransactionIds.size()); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetReceivingTransactionIds(CStringVector value) + { + m_receivingTransactionIds = std::move(value); + this->m_model.receivingTransactionIds = m_receivingTransactionIds.empty() ? nullptr : m_receivingTransactionIds.data(); + this->m_model.receivingTransactionIdsCount = static_cast(m_receivingTransactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.givingETag = m_givingETag.empty() ? nullptr : m_givingETag.data(); + this->m_model.givingTransactionIds = m_givingTransactionIds.empty() ? nullptr : m_givingTransactionIds.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.receivingTransactionIds = m_receivingTransactionIds.empty() ? nullptr : m_receivingTransactionIds.data(); + } + + String m_givingETag; + CStringVector m_givingTransactionIds; + String m_idempotencyId; + CStringVector m_receivingTransactionIds; +}; + +template class Alloc = std::allocator> +class PFInventoryUpdateInventoryItemsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryUpdateInventoryItemsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryUpdateInventoryItemsRequestWrapper() = default; + + PFInventoryUpdateInventoryItemsRequestWrapper(const PFInventoryUpdateInventoryItemsRequest& model) : + ModelWrapper{ model }, + m_collectionId{ SafeString(model.collectionId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_item{ model.item ? std::optional>{ *model.item } : std::nullopt } + { + SetModelPointers(); + } + + PFInventoryUpdateInventoryItemsRequestWrapper(const PFInventoryUpdateInventoryItemsRequestWrapper& src) : + PFInventoryUpdateInventoryItemsRequestWrapper{ src.Model() } + { + } + + PFInventoryUpdateInventoryItemsRequestWrapper(PFInventoryUpdateInventoryItemsRequestWrapper&& src) : + PFInventoryUpdateInventoryItemsRequestWrapper{} + { + swap(*this, src); + } + + PFInventoryUpdateInventoryItemsRequestWrapper& operator=(PFInventoryUpdateInventoryItemsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryUpdateInventoryItemsRequestWrapper() = default; + + friend void swap(PFInventoryUpdateInventoryItemsRequestWrapper& lhs, PFInventoryUpdateInventoryItemsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_collectionId, rhs.m_collectionId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_item, rhs.m_item); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCollectionId(String value) + { + m_collectionId = std::move(value); + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetItem(std::optional> value) + { + m_item = std::move(value); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.collectionId = m_collectionId.empty() ? nullptr : m_collectionId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.item = m_item ? &m_item->Model() : nullptr; + } + + String m_collectionId; + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + String m_eTag; + String m_idempotencyId; + std::optional> m_item; +}; + +template class Alloc = std::allocator> +class PFInventoryUpdateInventoryItemsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFInventoryUpdateInventoryItemsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFInventoryUpdateInventoryItemsResponseWrapper() = default; + + PFInventoryUpdateInventoryItemsResponseWrapper(const PFInventoryUpdateInventoryItemsResponse& model) : + ModelWrapper{ model }, + m_eTag{ SafeString(model.eTag) }, + m_idempotencyId{ SafeString(model.idempotencyId) }, + m_transactionIds{ model.transactionIds, model.transactionIds + model.transactionIdsCount } + { + SetModelPointers(); + } + + PFInventoryUpdateInventoryItemsResponseWrapper(const PFInventoryUpdateInventoryItemsResponseWrapper& src) : + PFInventoryUpdateInventoryItemsResponseWrapper{ src.Model() } + { + } + + PFInventoryUpdateInventoryItemsResponseWrapper(PFInventoryUpdateInventoryItemsResponseWrapper&& src) : + PFInventoryUpdateInventoryItemsResponseWrapper{} + { + swap(*this, src); + } + + PFInventoryUpdateInventoryItemsResponseWrapper& operator=(PFInventoryUpdateInventoryItemsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFInventoryUpdateInventoryItemsResponseWrapper() = default; + + friend void swap(PFInventoryUpdateInventoryItemsResponseWrapper& lhs, PFInventoryUpdateInventoryItemsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_eTag, rhs.m_eTag); + swap(lhs.m_idempotencyId, rhs.m_idempotencyId); + swap(lhs.m_transactionIds, rhs.m_transactionIds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetETag(String value) + { + m_eTag = std::move(value); + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + } + + void SetIdempotencyId(String value) + { + m_idempotencyId = std::move(value); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + } + + void SetTransactionIds(CStringVector value) + { + m_transactionIds = std::move(value); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + this->m_model.transactionIdsCount = static_cast(m_transactionIds.size()); + } + +private: + void SetModelPointers() + { + this->m_model.eTag = m_eTag.empty() ? nullptr : m_eTag.data(); + this->m_model.idempotencyId = m_idempotencyId.empty() ? nullptr : m_idempotencyId.data(); + this->m_model.transactionIds = m_transactionIds.empty() ? nullptr : m_transactionIds.data(); + } + + String m_eTag; + String m_idempotencyId; + CStringVector m_transactionIds; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/LocalizationTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/LocalizationTypeWrappers.h new file mode 100644 index 0000000..69aa0f5 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/LocalizationTypeWrappers.h @@ -0,0 +1,141 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFLocalizationGetLanguageListRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFLocalizationGetLanguageListRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFLocalizationGetLanguageListRequestWrapper() = default; + + PFLocalizationGetLanguageListRequestWrapper(const PFLocalizationGetLanguageListRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount } + { + SetModelPointers(); + } + + PFLocalizationGetLanguageListRequestWrapper(const PFLocalizationGetLanguageListRequestWrapper& src) : + PFLocalizationGetLanguageListRequestWrapper{ src.Model() } + { + } + + PFLocalizationGetLanguageListRequestWrapper(PFLocalizationGetLanguageListRequestWrapper&& src) : + PFLocalizationGetLanguageListRequestWrapper{} + { + swap(*this, src); + } + + PFLocalizationGetLanguageListRequestWrapper& operator=(PFLocalizationGetLanguageListRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFLocalizationGetLanguageListRequestWrapper() = default; + + friend void swap(PFLocalizationGetLanguageListRequestWrapper& lhs, PFLocalizationGetLanguageListRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + } + + StringDictionaryEntryVector m_customTags; +}; + +template class Alloc = std::allocator> +class PFLocalizationGetLanguageListResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFLocalizationGetLanguageListResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFLocalizationGetLanguageListResponseWrapper() = default; + + PFLocalizationGetLanguageListResponseWrapper(const PFLocalizationGetLanguageListResponse& model) : + ModelWrapper{ model }, + m_languageList{ model.languageList, model.languageList + model.languageListCount } + { + SetModelPointers(); + } + + PFLocalizationGetLanguageListResponseWrapper(const PFLocalizationGetLanguageListResponseWrapper& src) : + PFLocalizationGetLanguageListResponseWrapper{ src.Model() } + { + } + + PFLocalizationGetLanguageListResponseWrapper(PFLocalizationGetLanguageListResponseWrapper&& src) : + PFLocalizationGetLanguageListResponseWrapper{} + { + swap(*this, src); + } + + PFLocalizationGetLanguageListResponseWrapper& operator=(PFLocalizationGetLanguageListResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFLocalizationGetLanguageListResponseWrapper() = default; + + friend void swap(PFLocalizationGetLanguageListResponseWrapper& lhs, PFLocalizationGetLanguageListResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_languageList, rhs.m_languageList); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetLanguageList(CStringVector value) + { + m_languageList = std::move(value); + this->m_model.languageList = m_languageList.empty() ? nullptr : m_languageList.data(); + this->m_model.languageListCount = static_cast(m_languageList.size()); + } + +private: + void SetModelPointers() + { + this->m_model.languageList = m_languageList.empty() ? nullptr : m_languageList.data(); + } + + CStringVector m_languageList; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/MultiplayerServerTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/MultiplayerServerTypeWrappers.h new file mode 100644 index 0000000..f278286 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/MultiplayerServerTypeWrappers.h @@ -0,0 +1,1778 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFMultiplayerServerListBuildAliasesRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerListBuildAliasesRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerListBuildAliasesRequestWrapper() = default; + + PFMultiplayerServerListBuildAliasesRequestWrapper(const PFMultiplayerServerListBuildAliasesRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_pageSize{ model.pageSize ? std::optional{ *model.pageSize } : std::nullopt }, + m_skipToken{ SafeString(model.skipToken) } + { + SetModelPointers(); + } + + PFMultiplayerServerListBuildAliasesRequestWrapper(const PFMultiplayerServerListBuildAliasesRequestWrapper& src) : + PFMultiplayerServerListBuildAliasesRequestWrapper{ src.Model() } + { + } + + PFMultiplayerServerListBuildAliasesRequestWrapper(PFMultiplayerServerListBuildAliasesRequestWrapper&& src) : + PFMultiplayerServerListBuildAliasesRequestWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerListBuildAliasesRequestWrapper& operator=(PFMultiplayerServerListBuildAliasesRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerListBuildAliasesRequestWrapper() = default; + + friend void swap(PFMultiplayerServerListBuildAliasesRequestWrapper& lhs, PFMultiplayerServerListBuildAliasesRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_pageSize, rhs.m_pageSize); + swap(lhs.m_skipToken, rhs.m_skipToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPageSize(std::optional value) + { + m_pageSize = std::move(value); + this->m_model.pageSize = m_pageSize ? m_pageSize.operator->() : nullptr; + } + + void SetSkipToken(String value) + { + m_skipToken = std::move(value); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.pageSize = m_pageSize ? m_pageSize.operator->() : nullptr; + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_pageSize; + String m_skipToken; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerBuildSelectionCriterionWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerBuildSelectionCriterion; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerBuildSelectionCriterionWrapper() = default; + + PFMultiplayerServerBuildSelectionCriterionWrapper(const PFMultiplayerServerBuildSelectionCriterion& model) : + ModelWrapper{ model }, + m_buildWeightDistribution{ model.buildWeightDistribution, model.buildWeightDistribution + model.buildWeightDistributionCount } + { + SetModelPointers(); + } + + PFMultiplayerServerBuildSelectionCriterionWrapper(const PFMultiplayerServerBuildSelectionCriterionWrapper& src) : + PFMultiplayerServerBuildSelectionCriterionWrapper{ src.Model() } + { + } + + PFMultiplayerServerBuildSelectionCriterionWrapper(PFMultiplayerServerBuildSelectionCriterionWrapper&& src) : + PFMultiplayerServerBuildSelectionCriterionWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerBuildSelectionCriterionWrapper& operator=(PFMultiplayerServerBuildSelectionCriterionWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerBuildSelectionCriterionWrapper() = default; + + friend void swap(PFMultiplayerServerBuildSelectionCriterionWrapper& lhs, PFMultiplayerServerBuildSelectionCriterionWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_buildWeightDistribution, rhs.m_buildWeightDistribution); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBuildWeightDistribution(DictionaryEntryVector value) + { + m_buildWeightDistribution = std::move(value); + this->m_model.buildWeightDistribution = m_buildWeightDistribution.empty() ? nullptr : m_buildWeightDistribution.data(); + this->m_model.buildWeightDistributionCount = static_cast(m_buildWeightDistribution.size()); + } + +private: + void SetModelPointers() + { + this->m_model.buildWeightDistribution = m_buildWeightDistribution.empty() ? nullptr : m_buildWeightDistribution.data(); + } + + DictionaryEntryVector m_buildWeightDistribution; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerBuildAliasDetailsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerBuildAliasDetailsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerBuildAliasDetailsResponseWrapper() = default; + + PFMultiplayerServerBuildAliasDetailsResponseWrapper(const PFMultiplayerServerBuildAliasDetailsResponse& model) : + ModelWrapper{ model }, + m_aliasId{ SafeString(model.aliasId) }, + m_aliasName{ SafeString(model.aliasName) }, + m_buildSelectionCriteria{ model.buildSelectionCriteria, model.buildSelectionCriteria + model.buildSelectionCriteriaCount } + { + SetModelPointers(); + } + + PFMultiplayerServerBuildAliasDetailsResponseWrapper(const PFMultiplayerServerBuildAliasDetailsResponseWrapper& src) : + PFMultiplayerServerBuildAliasDetailsResponseWrapper{ src.Model() } + { + } + + PFMultiplayerServerBuildAliasDetailsResponseWrapper(PFMultiplayerServerBuildAliasDetailsResponseWrapper&& src) : + PFMultiplayerServerBuildAliasDetailsResponseWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerBuildAliasDetailsResponseWrapper& operator=(PFMultiplayerServerBuildAliasDetailsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerBuildAliasDetailsResponseWrapper() = default; + + friend void swap(PFMultiplayerServerBuildAliasDetailsResponseWrapper& lhs, PFMultiplayerServerBuildAliasDetailsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_aliasId, rhs.m_aliasId); + swap(lhs.m_aliasName, rhs.m_aliasName); + swap(lhs.m_buildSelectionCriteria, rhs.m_buildSelectionCriteria); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAliasId(String value) + { + m_aliasId = std::move(value); + this->m_model.aliasId = m_aliasId.empty() ? nullptr : m_aliasId.data(); + } + + void SetAliasName(String value) + { + m_aliasName = std::move(value); + this->m_model.aliasName = m_aliasName.empty() ? nullptr : m_aliasName.data(); + } + + void SetBuildSelectionCriteria(ModelVector, Alloc> value) + { + m_buildSelectionCriteria = std::move(value); + this->m_model.buildSelectionCriteria = m_buildSelectionCriteria.empty() ? nullptr : m_buildSelectionCriteria.data(); + this->m_model.buildSelectionCriteriaCount = static_cast(m_buildSelectionCriteria.size()); + } + +private: + void SetModelPointers() + { + this->m_model.aliasId = m_aliasId.empty() ? nullptr : m_aliasId.data(); + this->m_model.aliasName = m_aliasName.empty() ? nullptr : m_aliasName.data(); + this->m_model.buildSelectionCriteria = m_buildSelectionCriteria.empty() ? nullptr : m_buildSelectionCriteria.data(); + } + + String m_aliasId; + String m_aliasName; + ModelVector, Alloc> m_buildSelectionCriteria; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerListBuildAliasesResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerListBuildAliasesResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerListBuildAliasesResponseWrapper() = default; + + PFMultiplayerServerListBuildAliasesResponseWrapper(const PFMultiplayerServerListBuildAliasesResponse& model) : + ModelWrapper{ model }, + m_buildAliases{ model.buildAliases, model.buildAliases + model.buildAliasesCount }, + m_skipToken{ SafeString(model.skipToken) } + { + SetModelPointers(); + } + + PFMultiplayerServerListBuildAliasesResponseWrapper(const PFMultiplayerServerListBuildAliasesResponseWrapper& src) : + PFMultiplayerServerListBuildAliasesResponseWrapper{ src.Model() } + { + } + + PFMultiplayerServerListBuildAliasesResponseWrapper(PFMultiplayerServerListBuildAliasesResponseWrapper&& src) : + PFMultiplayerServerListBuildAliasesResponseWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerListBuildAliasesResponseWrapper& operator=(PFMultiplayerServerListBuildAliasesResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerListBuildAliasesResponseWrapper() = default; + + friend void swap(PFMultiplayerServerListBuildAliasesResponseWrapper& lhs, PFMultiplayerServerListBuildAliasesResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_buildAliases, rhs.m_buildAliases); + swap(lhs.m_skipToken, rhs.m_skipToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBuildAliases(ModelVector, Alloc> value) + { + m_buildAliases = std::move(value); + this->m_model.buildAliases = m_buildAliases.empty() ? nullptr : m_buildAliases.data(); + this->m_model.buildAliasesCount = static_cast(m_buildAliases.size()); + } + + void SetPageSize(int32_t value) + { + this->m_model.pageSize = value; + } + + void SetSkipToken(String value) + { + m_skipToken = std::move(value); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.buildAliases = m_buildAliases.empty() ? nullptr : m_buildAliases.data(); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + + ModelVector, Alloc> m_buildAliases; + String m_skipToken; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerListBuildSummariesRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerListBuildSummariesRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerListBuildSummariesRequestWrapper() = default; + + PFMultiplayerServerListBuildSummariesRequestWrapper(const PFMultiplayerServerListBuildSummariesRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_pageSize{ model.pageSize ? std::optional{ *model.pageSize } : std::nullopt }, + m_skipToken{ SafeString(model.skipToken) } + { + SetModelPointers(); + } + + PFMultiplayerServerListBuildSummariesRequestWrapper(const PFMultiplayerServerListBuildSummariesRequestWrapper& src) : + PFMultiplayerServerListBuildSummariesRequestWrapper{ src.Model() } + { + } + + PFMultiplayerServerListBuildSummariesRequestWrapper(PFMultiplayerServerListBuildSummariesRequestWrapper&& src) : + PFMultiplayerServerListBuildSummariesRequestWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerListBuildSummariesRequestWrapper& operator=(PFMultiplayerServerListBuildSummariesRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerListBuildSummariesRequestWrapper() = default; + + friend void swap(PFMultiplayerServerListBuildSummariesRequestWrapper& lhs, PFMultiplayerServerListBuildSummariesRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_pageSize, rhs.m_pageSize); + swap(lhs.m_skipToken, rhs.m_skipToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPageSize(std::optional value) + { + m_pageSize = std::move(value); + this->m_model.pageSize = m_pageSize ? m_pageSize.operator->() : nullptr; + } + + void SetSkipToken(String value) + { + m_skipToken = std::move(value); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.pageSize = m_pageSize ? m_pageSize.operator->() : nullptr; + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_pageSize; + String m_skipToken; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerCurrentServerStatsWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerCurrentServerStats; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetActive(int32_t value) + { + this->m_model.active = value; + } + + void SetPropping(int32_t value) + { + this->m_model.propping = value; + } + + void SetStandingBy(int32_t value) + { + this->m_model.standingBy = value; + } + + void SetTotal(int32_t value) + { + this->m_model.total = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerDynamicStandbyThresholdWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerDynamicStandbyThreshold; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetMultiplier(double value) + { + this->m_model.multiplier = value; + } + + void SetTriggerThresholdPercentage(double value) + { + this->m_model.triggerThresholdPercentage = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerDynamicStandbySettingsWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerDynamicStandbySettings; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerDynamicStandbySettingsWrapper() = default; + + PFMultiplayerServerDynamicStandbySettingsWrapper(const PFMultiplayerServerDynamicStandbySettings& model) : + ModelWrapper{ model }, + m_dynamicFloorMultiplierThresholds{ model.dynamicFloorMultiplierThresholds, model.dynamicFloorMultiplierThresholds + model.dynamicFloorMultiplierThresholdsCount }, + m_rampDownSeconds{ model.rampDownSeconds ? std::optional{ *model.rampDownSeconds } : std::nullopt } + { + SetModelPointers(); + } + + PFMultiplayerServerDynamicStandbySettingsWrapper(const PFMultiplayerServerDynamicStandbySettingsWrapper& src) : + PFMultiplayerServerDynamicStandbySettingsWrapper{ src.Model() } + { + } + + PFMultiplayerServerDynamicStandbySettingsWrapper(PFMultiplayerServerDynamicStandbySettingsWrapper&& src) : + PFMultiplayerServerDynamicStandbySettingsWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerDynamicStandbySettingsWrapper& operator=(PFMultiplayerServerDynamicStandbySettingsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerDynamicStandbySettingsWrapper() = default; + + friend void swap(PFMultiplayerServerDynamicStandbySettingsWrapper& lhs, PFMultiplayerServerDynamicStandbySettingsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_dynamicFloorMultiplierThresholds, rhs.m_dynamicFloorMultiplierThresholds); + swap(lhs.m_rampDownSeconds, rhs.m_rampDownSeconds); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDynamicFloorMultiplierThresholds(ModelVector, Alloc> value) + { + m_dynamicFloorMultiplierThresholds = std::move(value); + this->m_model.dynamicFloorMultiplierThresholds = m_dynamicFloorMultiplierThresholds.empty() ? nullptr : m_dynamicFloorMultiplierThresholds.data(); + this->m_model.dynamicFloorMultiplierThresholdsCount = static_cast(m_dynamicFloorMultiplierThresholds.size()); + } + + void SetIsEnabled(bool value) + { + this->m_model.isEnabled = value; + } + + void SetRampDownSeconds(std::optional value) + { + m_rampDownSeconds = std::move(value); + this->m_model.rampDownSeconds = m_rampDownSeconds ? m_rampDownSeconds.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.dynamicFloorMultiplierThresholds = m_dynamicFloorMultiplierThresholds.empty() ? nullptr : m_dynamicFloorMultiplierThresholds.data(); + this->m_model.rampDownSeconds = m_rampDownSeconds ? m_rampDownSeconds.operator->() : nullptr; + } + + ModelVector, Alloc> m_dynamicFloorMultiplierThresholds; + std::optional m_rampDownSeconds; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerScheduleWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerSchedule; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerScheduleWrapper() = default; + + PFMultiplayerServerScheduleWrapper(const PFMultiplayerServerSchedule& model) : + ModelWrapper{ model }, + m_description{ SafeString(model.description) } + { + SetModelPointers(); + } + + PFMultiplayerServerScheduleWrapper(const PFMultiplayerServerScheduleWrapper& src) : + PFMultiplayerServerScheduleWrapper{ src.Model() } + { + } + + PFMultiplayerServerScheduleWrapper(PFMultiplayerServerScheduleWrapper&& src) : + PFMultiplayerServerScheduleWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerScheduleWrapper& operator=(PFMultiplayerServerScheduleWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerScheduleWrapper() = default; + + friend void swap(PFMultiplayerServerScheduleWrapper& lhs, PFMultiplayerServerScheduleWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_description, rhs.m_description); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDescription(String value) + { + m_description = std::move(value); + this->m_model.description = m_description.empty() ? nullptr : m_description.data(); + } + + void SetEndTime(time_t value) + { + this->m_model.endTime = value; + } + + void SetIsDisabled(bool value) + { + this->m_model.isDisabled = value; + } + + void SetIsRecurringWeekly(bool value) + { + this->m_model.isRecurringWeekly = value; + } + + void SetStartTime(time_t value) + { + this->m_model.startTime = value; + } + + void SetTargetStandby(int32_t value) + { + this->m_model.targetStandby = value; + } + +private: + void SetModelPointers() + { + this->m_model.description = m_description.empty() ? nullptr : m_description.data(); + } + + String m_description; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerScheduledStandbySettingsWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerScheduledStandbySettings; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerScheduledStandbySettingsWrapper() = default; + + PFMultiplayerServerScheduledStandbySettingsWrapper(const PFMultiplayerServerScheduledStandbySettings& model) : + ModelWrapper{ model }, + m_scheduleList{ model.scheduleList, model.scheduleList + model.scheduleListCount } + { + SetModelPointers(); + } + + PFMultiplayerServerScheduledStandbySettingsWrapper(const PFMultiplayerServerScheduledStandbySettingsWrapper& src) : + PFMultiplayerServerScheduledStandbySettingsWrapper{ src.Model() } + { + } + + PFMultiplayerServerScheduledStandbySettingsWrapper(PFMultiplayerServerScheduledStandbySettingsWrapper&& src) : + PFMultiplayerServerScheduledStandbySettingsWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerScheduledStandbySettingsWrapper& operator=(PFMultiplayerServerScheduledStandbySettingsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerScheduledStandbySettingsWrapper() = default; + + friend void swap(PFMultiplayerServerScheduledStandbySettingsWrapper& lhs, PFMultiplayerServerScheduledStandbySettingsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_scheduleList, rhs.m_scheduleList); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetIsEnabled(bool value) + { + this->m_model.isEnabled = value; + } + + void SetScheduleList(ModelVector, Alloc> value) + { + m_scheduleList = std::move(value); + this->m_model.scheduleList = m_scheduleList.empty() ? nullptr : m_scheduleList.data(); + this->m_model.scheduleListCount = static_cast(m_scheduleList.size()); + } + +private: + void SetModelPointers() + { + this->m_model.scheduleList = m_scheduleList.empty() ? nullptr : m_scheduleList.data(); + } + + ModelVector, Alloc> m_scheduleList; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerBuildRegionWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerBuildRegion; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerBuildRegionWrapper() = default; + + PFMultiplayerServerBuildRegionWrapper(const PFMultiplayerServerBuildRegion& model) : + ModelWrapper{ model }, + m_currentServerStats{ model.currentServerStats ? std::optional>{ *model.currentServerStats } : std::nullopt }, + m_dynamicStandbySettings{ model.dynamicStandbySettings ? std::optional>{ *model.dynamicStandbySettings } : std::nullopt }, + m_multiplayerServerCountPerVm{ model.multiplayerServerCountPerVm ? std::optional{ *model.multiplayerServerCountPerVm } : std::nullopt }, + m_region{ SafeString(model.region) }, + m_scheduledStandbySettings{ model.scheduledStandbySettings ? std::optional>{ *model.scheduledStandbySettings } : std::nullopt }, + m_status{ SafeString(model.status) }, + m_vmSize{ model.vmSize ? std::optional{ *model.vmSize } : std::nullopt } + { + SetModelPointers(); + } + + PFMultiplayerServerBuildRegionWrapper(const PFMultiplayerServerBuildRegionWrapper& src) : + PFMultiplayerServerBuildRegionWrapper{ src.Model() } + { + } + + PFMultiplayerServerBuildRegionWrapper(PFMultiplayerServerBuildRegionWrapper&& src) : + PFMultiplayerServerBuildRegionWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerBuildRegionWrapper& operator=(PFMultiplayerServerBuildRegionWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerBuildRegionWrapper() = default; + + friend void swap(PFMultiplayerServerBuildRegionWrapper& lhs, PFMultiplayerServerBuildRegionWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_currentServerStats, rhs.m_currentServerStats); + swap(lhs.m_dynamicStandbySettings, rhs.m_dynamicStandbySettings); + swap(lhs.m_multiplayerServerCountPerVm, rhs.m_multiplayerServerCountPerVm); + swap(lhs.m_region, rhs.m_region); + swap(lhs.m_scheduledStandbySettings, rhs.m_scheduledStandbySettings); + swap(lhs.m_status, rhs.m_status); + swap(lhs.m_vmSize, rhs.m_vmSize); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCurrentServerStats(std::optional> value) + { + m_currentServerStats = std::move(value); + this->m_model.currentServerStats = m_currentServerStats ? &m_currentServerStats->Model() : nullptr; + } + + void SetDynamicStandbySettings(std::optional> value) + { + m_dynamicStandbySettings = std::move(value); + this->m_model.dynamicStandbySettings = m_dynamicStandbySettings ? &m_dynamicStandbySettings->Model() : nullptr; + } + + void SetIsAssetReplicationComplete(bool value) + { + this->m_model.isAssetReplicationComplete = value; + } + + void SetMaxServers(int32_t value) + { + this->m_model.maxServers = value; + } + + void SetMultiplayerServerCountPerVm(std::optional value) + { + m_multiplayerServerCountPerVm = std::move(value); + this->m_model.multiplayerServerCountPerVm = m_multiplayerServerCountPerVm ? m_multiplayerServerCountPerVm.operator->() : nullptr; + } + + void SetRegion(String value) + { + m_region = std::move(value); + this->m_model.region = m_region.empty() ? nullptr : m_region.data(); + } + + void SetScheduledStandbySettings(std::optional> value) + { + m_scheduledStandbySettings = std::move(value); + this->m_model.scheduledStandbySettings = m_scheduledStandbySettings ? &m_scheduledStandbySettings->Model() : nullptr; + } + + void SetStandbyServers(int32_t value) + { + this->m_model.standbyServers = value; + } + + void SetStatus(String value) + { + m_status = std::move(value); + this->m_model.status = m_status.empty() ? nullptr : m_status.data(); + } + + void SetVmSize(std::optional value) + { + m_vmSize = std::move(value); + this->m_model.vmSize = m_vmSize ? m_vmSize.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.currentServerStats = m_currentServerStats ? &m_currentServerStats->Model() : nullptr; + this->m_model.dynamicStandbySettings = m_dynamicStandbySettings ? &m_dynamicStandbySettings->Model() : nullptr; + this->m_model.multiplayerServerCountPerVm = m_multiplayerServerCountPerVm ? m_multiplayerServerCountPerVm.operator->() : nullptr; + this->m_model.region = m_region.empty() ? nullptr : m_region.data(); + this->m_model.scheduledStandbySettings = m_scheduledStandbySettings ? &m_scheduledStandbySettings->Model() : nullptr; + this->m_model.status = m_status.empty() ? nullptr : m_status.data(); + this->m_model.vmSize = m_vmSize ? m_vmSize.operator->() : nullptr; + } + + std::optional> m_currentServerStats; + std::optional> m_dynamicStandbySettings; + std::optional m_multiplayerServerCountPerVm; + String m_region; + std::optional> m_scheduledStandbySettings; + String m_status; + std::optional m_vmSize; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerBuildSummaryWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerBuildSummary; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerBuildSummaryWrapper() = default; + + PFMultiplayerServerBuildSummaryWrapper(const PFMultiplayerServerBuildSummary& model) : + ModelWrapper{ model }, + m_buildId{ SafeString(model.buildId) }, + m_buildName{ SafeString(model.buildName) }, + m_creationTime{ model.creationTime ? std::optional{ *model.creationTime } : std::nullopt }, + m_metadata{ model.metadata, model.metadata + model.metadataCount }, + m_regionConfigurations{ model.regionConfigurations, model.regionConfigurations + model.regionConfigurationsCount } + { + SetModelPointers(); + } + + PFMultiplayerServerBuildSummaryWrapper(const PFMultiplayerServerBuildSummaryWrapper& src) : + PFMultiplayerServerBuildSummaryWrapper{ src.Model() } + { + } + + PFMultiplayerServerBuildSummaryWrapper(PFMultiplayerServerBuildSummaryWrapper&& src) : + PFMultiplayerServerBuildSummaryWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerBuildSummaryWrapper& operator=(PFMultiplayerServerBuildSummaryWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerBuildSummaryWrapper() = default; + + friend void swap(PFMultiplayerServerBuildSummaryWrapper& lhs, PFMultiplayerServerBuildSummaryWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_buildId, rhs.m_buildId); + swap(lhs.m_buildName, rhs.m_buildName); + swap(lhs.m_creationTime, rhs.m_creationTime); + swap(lhs.m_metadata, rhs.m_metadata); + swap(lhs.m_regionConfigurations, rhs.m_regionConfigurations); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBuildId(String value) + { + m_buildId = std::move(value); + this->m_model.buildId = m_buildId.empty() ? nullptr : m_buildId.data(); + } + + void SetBuildName(String value) + { + m_buildName = std::move(value); + this->m_model.buildName = m_buildName.empty() ? nullptr : m_buildName.data(); + } + + void SetCreationTime(std::optional value) + { + m_creationTime = std::move(value); + this->m_model.creationTime = m_creationTime ? m_creationTime.operator->() : nullptr; + } + + void SetMetadata(StringDictionaryEntryVector value) + { + m_metadata = std::move(value); + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + this->m_model.metadataCount = static_cast(m_metadata.size()); + } + + void SetRegionConfigurations(ModelVector, Alloc> value) + { + m_regionConfigurations = std::move(value); + this->m_model.regionConfigurations = m_regionConfigurations.empty() ? nullptr : m_regionConfigurations.data(); + this->m_model.regionConfigurationsCount = static_cast(m_regionConfigurations.size()); + } + +private: + void SetModelPointers() + { + this->m_model.buildId = m_buildId.empty() ? nullptr : m_buildId.data(); + this->m_model.buildName = m_buildName.empty() ? nullptr : m_buildName.data(); + this->m_model.creationTime = m_creationTime ? m_creationTime.operator->() : nullptr; + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + this->m_model.regionConfigurations = m_regionConfigurations.empty() ? nullptr : m_regionConfigurations.data(); + } + + String m_buildId; + String m_buildName; + std::optional m_creationTime; + StringDictionaryEntryVector m_metadata; + ModelVector, Alloc> m_regionConfigurations; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerListBuildSummariesResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerListBuildSummariesResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerListBuildSummariesResponseWrapper() = default; + + PFMultiplayerServerListBuildSummariesResponseWrapper(const PFMultiplayerServerListBuildSummariesResponse& model) : + ModelWrapper{ model }, + m_buildSummaries{ model.buildSummaries, model.buildSummaries + model.buildSummariesCount }, + m_skipToken{ SafeString(model.skipToken) } + { + SetModelPointers(); + } + + PFMultiplayerServerListBuildSummariesResponseWrapper(const PFMultiplayerServerListBuildSummariesResponseWrapper& src) : + PFMultiplayerServerListBuildSummariesResponseWrapper{ src.Model() } + { + } + + PFMultiplayerServerListBuildSummariesResponseWrapper(PFMultiplayerServerListBuildSummariesResponseWrapper&& src) : + PFMultiplayerServerListBuildSummariesResponseWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerListBuildSummariesResponseWrapper& operator=(PFMultiplayerServerListBuildSummariesResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerListBuildSummariesResponseWrapper() = default; + + friend void swap(PFMultiplayerServerListBuildSummariesResponseWrapper& lhs, PFMultiplayerServerListBuildSummariesResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_buildSummaries, rhs.m_buildSummaries); + swap(lhs.m_skipToken, rhs.m_skipToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBuildSummaries(ModelVector, Alloc> value) + { + m_buildSummaries = std::move(value); + this->m_model.buildSummaries = m_buildSummaries.empty() ? nullptr : m_buildSummaries.data(); + this->m_model.buildSummariesCount = static_cast(m_buildSummaries.size()); + } + + void SetPageSize(int32_t value) + { + this->m_model.pageSize = value; + } + + void SetSkipToken(String value) + { + m_skipToken = std::move(value); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.buildSummaries = m_buildSummaries.empty() ? nullptr : m_buildSummaries.data(); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + + ModelVector, Alloc> m_buildSummaries; + String m_skipToken; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerListQosServersForTitleRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerListQosServersForTitleRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerListQosServersForTitleRequestWrapper() = default; + + PFMultiplayerServerListQosServersForTitleRequestWrapper(const PFMultiplayerServerListQosServersForTitleRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_includeAllRegions{ model.includeAllRegions ? std::optional{ *model.includeAllRegions } : std::nullopt } + { + SetModelPointers(); + } + + PFMultiplayerServerListQosServersForTitleRequestWrapper(const PFMultiplayerServerListQosServersForTitleRequestWrapper& src) : + PFMultiplayerServerListQosServersForTitleRequestWrapper{ src.Model() } + { + } + + PFMultiplayerServerListQosServersForTitleRequestWrapper(PFMultiplayerServerListQosServersForTitleRequestWrapper&& src) : + PFMultiplayerServerListQosServersForTitleRequestWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerListQosServersForTitleRequestWrapper& operator=(PFMultiplayerServerListQosServersForTitleRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerListQosServersForTitleRequestWrapper() = default; + + friend void swap(PFMultiplayerServerListQosServersForTitleRequestWrapper& lhs, PFMultiplayerServerListQosServersForTitleRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_includeAllRegions, rhs.m_includeAllRegions); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetIncludeAllRegions(std::optional value) + { + m_includeAllRegions = std::move(value); + this->m_model.includeAllRegions = m_includeAllRegions ? m_includeAllRegions.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.includeAllRegions = m_includeAllRegions ? m_includeAllRegions.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional m_includeAllRegions; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerQosServerWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerQosServer; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerQosServerWrapper() = default; + + PFMultiplayerServerQosServerWrapper(const PFMultiplayerServerQosServer& model) : + ModelWrapper{ model }, + m_region{ SafeString(model.region) }, + m_serverUrl{ SafeString(model.serverUrl) } + { + SetModelPointers(); + } + + PFMultiplayerServerQosServerWrapper(const PFMultiplayerServerQosServerWrapper& src) : + PFMultiplayerServerQosServerWrapper{ src.Model() } + { + } + + PFMultiplayerServerQosServerWrapper(PFMultiplayerServerQosServerWrapper&& src) : + PFMultiplayerServerQosServerWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerQosServerWrapper& operator=(PFMultiplayerServerQosServerWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerQosServerWrapper() = default; + + friend void swap(PFMultiplayerServerQosServerWrapper& lhs, PFMultiplayerServerQosServerWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_region, rhs.m_region); + swap(lhs.m_serverUrl, rhs.m_serverUrl); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetRegion(String value) + { + m_region = std::move(value); + this->m_model.region = m_region.empty() ? nullptr : m_region.data(); + } + + void SetServerUrl(String value) + { + m_serverUrl = std::move(value); + this->m_model.serverUrl = m_serverUrl.empty() ? nullptr : m_serverUrl.data(); + } + +private: + void SetModelPointers() + { + this->m_model.region = m_region.empty() ? nullptr : m_region.data(); + this->m_model.serverUrl = m_serverUrl.empty() ? nullptr : m_serverUrl.data(); + } + + String m_region; + String m_serverUrl; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerListQosServersForTitleResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerListQosServersForTitleResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerListQosServersForTitleResponseWrapper() = default; + + PFMultiplayerServerListQosServersForTitleResponseWrapper(const PFMultiplayerServerListQosServersForTitleResponse& model) : + ModelWrapper{ model }, + m_qosServers{ model.qosServers, model.qosServers + model.qosServersCount }, + m_skipToken{ SafeString(model.skipToken) } + { + SetModelPointers(); + } + + PFMultiplayerServerListQosServersForTitleResponseWrapper(const PFMultiplayerServerListQosServersForTitleResponseWrapper& src) : + PFMultiplayerServerListQosServersForTitleResponseWrapper{ src.Model() } + { + } + + PFMultiplayerServerListQosServersForTitleResponseWrapper(PFMultiplayerServerListQosServersForTitleResponseWrapper&& src) : + PFMultiplayerServerListQosServersForTitleResponseWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerListQosServersForTitleResponseWrapper& operator=(PFMultiplayerServerListQosServersForTitleResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerListQosServersForTitleResponseWrapper() = default; + + friend void swap(PFMultiplayerServerListQosServersForTitleResponseWrapper& lhs, PFMultiplayerServerListQosServersForTitleResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_qosServers, rhs.m_qosServers); + swap(lhs.m_skipToken, rhs.m_skipToken); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPageSize(int32_t value) + { + this->m_model.pageSize = value; + } + + void SetQosServers(ModelVector, Alloc> value) + { + m_qosServers = std::move(value); + this->m_model.qosServers = m_qosServers.empty() ? nullptr : m_qosServers.data(); + this->m_model.qosServersCount = static_cast(m_qosServers.size()); + } + + void SetSkipToken(String value) + { + m_skipToken = std::move(value); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + +private: + void SetModelPointers() + { + this->m_model.qosServers = m_qosServers.empty() ? nullptr : m_qosServers.data(); + this->m_model.skipToken = m_skipToken.empty() ? nullptr : m_skipToken.data(); + } + + ModelVector, Alloc> m_qosServers; + String m_skipToken; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerBuildAliasParamsWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerBuildAliasParams; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerBuildAliasParamsWrapper() = default; + + PFMultiplayerServerBuildAliasParamsWrapper(const PFMultiplayerServerBuildAliasParams& model) : + ModelWrapper{ model }, + m_aliasId{ SafeString(model.aliasId) } + { + SetModelPointers(); + } + + PFMultiplayerServerBuildAliasParamsWrapper(const PFMultiplayerServerBuildAliasParamsWrapper& src) : + PFMultiplayerServerBuildAliasParamsWrapper{ src.Model() } + { + } + + PFMultiplayerServerBuildAliasParamsWrapper(PFMultiplayerServerBuildAliasParamsWrapper&& src) : + PFMultiplayerServerBuildAliasParamsWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerBuildAliasParamsWrapper& operator=(PFMultiplayerServerBuildAliasParamsWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerBuildAliasParamsWrapper() = default; + + friend void swap(PFMultiplayerServerBuildAliasParamsWrapper& lhs, PFMultiplayerServerBuildAliasParamsWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_aliasId, rhs.m_aliasId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAliasId(String value) + { + m_aliasId = std::move(value); + this->m_model.aliasId = m_aliasId.empty() ? nullptr : m_aliasId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.aliasId = m_aliasId.empty() ? nullptr : m_aliasId.data(); + } + + String m_aliasId; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerRequestMultiplayerServerRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerRequestMultiplayerServerRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerRequestMultiplayerServerRequestWrapper() = default; + + PFMultiplayerServerRequestMultiplayerServerRequestWrapper(const PFMultiplayerServerRequestMultiplayerServerRequest& model) : + ModelWrapper{ model }, + m_buildAliasParams{ model.buildAliasParams ? std::optional>{ *model.buildAliasParams } : std::nullopt }, + m_buildId{ SafeString(model.buildId) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_initialPlayers{ model.initialPlayers, model.initialPlayers + model.initialPlayersCount }, + m_preferredRegions{ model.preferredRegions, model.preferredRegions + model.preferredRegionsCount }, + m_sessionCookie{ SafeString(model.sessionCookie) }, + m_sessionId{ SafeString(model.sessionId) } + { + SetModelPointers(); + } + + PFMultiplayerServerRequestMultiplayerServerRequestWrapper(const PFMultiplayerServerRequestMultiplayerServerRequestWrapper& src) : + PFMultiplayerServerRequestMultiplayerServerRequestWrapper{ src.Model() } + { + } + + PFMultiplayerServerRequestMultiplayerServerRequestWrapper(PFMultiplayerServerRequestMultiplayerServerRequestWrapper&& src) : + PFMultiplayerServerRequestMultiplayerServerRequestWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerRequestMultiplayerServerRequestWrapper& operator=(PFMultiplayerServerRequestMultiplayerServerRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerRequestMultiplayerServerRequestWrapper() = default; + + friend void swap(PFMultiplayerServerRequestMultiplayerServerRequestWrapper& lhs, PFMultiplayerServerRequestMultiplayerServerRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_buildAliasParams, rhs.m_buildAliasParams); + swap(lhs.m_buildId, rhs.m_buildId); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_initialPlayers, rhs.m_initialPlayers); + swap(lhs.m_preferredRegions, rhs.m_preferredRegions); + swap(lhs.m_sessionCookie, rhs.m_sessionCookie); + swap(lhs.m_sessionId, rhs.m_sessionId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBuildAliasParams(std::optional> value) + { + m_buildAliasParams = std::move(value); + this->m_model.buildAliasParams = m_buildAliasParams ? &m_buildAliasParams->Model() : nullptr; + } + + void SetBuildId(String value) + { + m_buildId = std::move(value); + this->m_model.buildId = m_buildId.empty() ? nullptr : m_buildId.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetInitialPlayers(CStringVector value) + { + m_initialPlayers = std::move(value); + this->m_model.initialPlayers = m_initialPlayers.empty() ? nullptr : m_initialPlayers.data(); + this->m_model.initialPlayersCount = static_cast(m_initialPlayers.size()); + } + + void SetPreferredRegions(CStringVector value) + { + m_preferredRegions = std::move(value); + this->m_model.preferredRegions = m_preferredRegions.empty() ? nullptr : m_preferredRegions.data(); + this->m_model.preferredRegionsCount = static_cast(m_preferredRegions.size()); + } + + void SetSessionCookie(String value) + { + m_sessionCookie = std::move(value); + this->m_model.sessionCookie = m_sessionCookie.empty() ? nullptr : m_sessionCookie.data(); + } + + void SetSessionId(String value) + { + m_sessionId = std::move(value); + this->m_model.sessionId = m_sessionId.empty() ? nullptr : m_sessionId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.buildAliasParams = m_buildAliasParams ? &m_buildAliasParams->Model() : nullptr; + this->m_model.buildId = m_buildId.empty() ? nullptr : m_buildId.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.initialPlayers = m_initialPlayers.empty() ? nullptr : m_initialPlayers.data(); + this->m_model.preferredRegions = m_preferredRegions.empty() ? nullptr : m_preferredRegions.data(); + this->m_model.sessionCookie = m_sessionCookie.empty() ? nullptr : m_sessionCookie.data(); + this->m_model.sessionId = m_sessionId.empty() ? nullptr : m_sessionId.data(); + } + + std::optional> m_buildAliasParams; + String m_buildId; + StringDictionaryEntryVector m_customTags; + CStringVector m_initialPlayers; + CStringVector m_preferredRegions; + String m_sessionCookie; + String m_sessionId; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerConnectedPlayerWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerConnectedPlayer; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerConnectedPlayerWrapper() = default; + + PFMultiplayerServerConnectedPlayerWrapper(const PFMultiplayerServerConnectedPlayer& model) : + ModelWrapper{ model }, + m_playerId{ SafeString(model.playerId) } + { + SetModelPointers(); + } + + PFMultiplayerServerConnectedPlayerWrapper(const PFMultiplayerServerConnectedPlayerWrapper& src) : + PFMultiplayerServerConnectedPlayerWrapper{ src.Model() } + { + } + + PFMultiplayerServerConnectedPlayerWrapper(PFMultiplayerServerConnectedPlayerWrapper&& src) : + PFMultiplayerServerConnectedPlayerWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerConnectedPlayerWrapper& operator=(PFMultiplayerServerConnectedPlayerWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerConnectedPlayerWrapper() = default; + + friend void swap(PFMultiplayerServerConnectedPlayerWrapper& lhs, PFMultiplayerServerConnectedPlayerWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playerId, rhs.m_playerId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayerId(String value) + { + m_playerId = std::move(value); + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + } + + String m_playerId; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerPortWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerPort; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerPortWrapper() = default; + + PFMultiplayerServerPortWrapper(const PFMultiplayerServerPort& model) : + ModelWrapper{ model }, + m_name{ SafeString(model.name) } + { + SetModelPointers(); + } + + PFMultiplayerServerPortWrapper(const PFMultiplayerServerPortWrapper& src) : + PFMultiplayerServerPortWrapper{ src.Model() } + { + } + + PFMultiplayerServerPortWrapper(PFMultiplayerServerPortWrapper&& src) : + PFMultiplayerServerPortWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerPortWrapper& operator=(PFMultiplayerServerPortWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerPortWrapper() = default; + + friend void swap(PFMultiplayerServerPortWrapper& lhs, PFMultiplayerServerPortWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_name, rhs.m_name); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetNum(int32_t value) + { + this->m_model.num = value; + } + + void SetProtocol(PFMultiplayerServerProtocolType value) + { + this->m_model.protocol = value; + } + +private: + void SetModelPointers() + { + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + String m_name; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerPublicIpAddressWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerPublicIpAddress; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerPublicIpAddressWrapper() = default; + + PFMultiplayerServerPublicIpAddressWrapper(const PFMultiplayerServerPublicIpAddress& model) : + ModelWrapper{ model }, + m_fQDN{ SafeString(model.fQDN) }, + m_ipAddress{ SafeString(model.ipAddress) }, + m_routingType{ SafeString(model.routingType) } + { + SetModelPointers(); + } + + PFMultiplayerServerPublicIpAddressWrapper(const PFMultiplayerServerPublicIpAddressWrapper& src) : + PFMultiplayerServerPublicIpAddressWrapper{ src.Model() } + { + } + + PFMultiplayerServerPublicIpAddressWrapper(PFMultiplayerServerPublicIpAddressWrapper&& src) : + PFMultiplayerServerPublicIpAddressWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerPublicIpAddressWrapper& operator=(PFMultiplayerServerPublicIpAddressWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerPublicIpAddressWrapper() = default; + + friend void swap(PFMultiplayerServerPublicIpAddressWrapper& lhs, PFMultiplayerServerPublicIpAddressWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_fQDN, rhs.m_fQDN); + swap(lhs.m_ipAddress, rhs.m_ipAddress); + swap(lhs.m_routingType, rhs.m_routingType); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetFQDN(String value) + { + m_fQDN = std::move(value); + this->m_model.fQDN = m_fQDN.empty() ? nullptr : m_fQDN.data(); + } + + void SetIpAddress(String value) + { + m_ipAddress = std::move(value); + this->m_model.ipAddress = m_ipAddress.empty() ? nullptr : m_ipAddress.data(); + } + + void SetRoutingType(String value) + { + m_routingType = std::move(value); + this->m_model.routingType = m_routingType.empty() ? nullptr : m_routingType.data(); + } + +private: + void SetModelPointers() + { + this->m_model.fQDN = m_fQDN.empty() ? nullptr : m_fQDN.data(); + this->m_model.ipAddress = m_ipAddress.empty() ? nullptr : m_ipAddress.data(); + this->m_model.routingType = m_routingType.empty() ? nullptr : m_routingType.data(); + } + + String m_fQDN; + String m_ipAddress; + String m_routingType; +}; + +template class Alloc = std::allocator> +class PFMultiplayerServerRequestMultiplayerServerResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFMultiplayerServerRequestMultiplayerServerResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFMultiplayerServerRequestMultiplayerServerResponseWrapper() = default; + + PFMultiplayerServerRequestMultiplayerServerResponseWrapper(const PFMultiplayerServerRequestMultiplayerServerResponse& model) : + ModelWrapper{ model }, + m_buildId{ SafeString(model.buildId) }, + m_connectedPlayers{ model.connectedPlayers, model.connectedPlayers + model.connectedPlayersCount }, + m_fQDN{ SafeString(model.fQDN) }, + m_iPV4Address{ SafeString(model.iPV4Address) }, + m_lastStateTransitionTime{ model.lastStateTransitionTime ? std::optional{ *model.lastStateTransitionTime } : std::nullopt }, + m_ports{ model.ports, model.ports + model.portsCount }, + m_publicIPV4Addresses{ model.publicIPV4Addresses, model.publicIPV4Addresses + model.publicIPV4AddressesCount }, + m_region{ SafeString(model.region) }, + m_serverId{ SafeString(model.serverId) }, + m_sessionId{ SafeString(model.sessionId) }, + m_state{ SafeString(model.state) }, + m_vmId{ SafeString(model.vmId) } + { + SetModelPointers(); + } + + PFMultiplayerServerRequestMultiplayerServerResponseWrapper(const PFMultiplayerServerRequestMultiplayerServerResponseWrapper& src) : + PFMultiplayerServerRequestMultiplayerServerResponseWrapper{ src.Model() } + { + } + + PFMultiplayerServerRequestMultiplayerServerResponseWrapper(PFMultiplayerServerRequestMultiplayerServerResponseWrapper&& src) : + PFMultiplayerServerRequestMultiplayerServerResponseWrapper{} + { + swap(*this, src); + } + + PFMultiplayerServerRequestMultiplayerServerResponseWrapper& operator=(PFMultiplayerServerRequestMultiplayerServerResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFMultiplayerServerRequestMultiplayerServerResponseWrapper() = default; + + friend void swap(PFMultiplayerServerRequestMultiplayerServerResponseWrapper& lhs, PFMultiplayerServerRequestMultiplayerServerResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_buildId, rhs.m_buildId); + swap(lhs.m_connectedPlayers, rhs.m_connectedPlayers); + swap(lhs.m_fQDN, rhs.m_fQDN); + swap(lhs.m_iPV4Address, rhs.m_iPV4Address); + swap(lhs.m_lastStateTransitionTime, rhs.m_lastStateTransitionTime); + swap(lhs.m_ports, rhs.m_ports); + swap(lhs.m_publicIPV4Addresses, rhs.m_publicIPV4Addresses); + swap(lhs.m_region, rhs.m_region); + swap(lhs.m_serverId, rhs.m_serverId); + swap(lhs.m_sessionId, rhs.m_sessionId); + swap(lhs.m_state, rhs.m_state); + swap(lhs.m_vmId, rhs.m_vmId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBuildId(String value) + { + m_buildId = std::move(value); + this->m_model.buildId = m_buildId.empty() ? nullptr : m_buildId.data(); + } + + void SetConnectedPlayers(ModelVector, Alloc> value) + { + m_connectedPlayers = std::move(value); + this->m_model.connectedPlayers = m_connectedPlayers.empty() ? nullptr : m_connectedPlayers.data(); + this->m_model.connectedPlayersCount = static_cast(m_connectedPlayers.size()); + } + + void SetFQDN(String value) + { + m_fQDN = std::move(value); + this->m_model.fQDN = m_fQDN.empty() ? nullptr : m_fQDN.data(); + } + + void SetIPV4Address(String value) + { + m_iPV4Address = std::move(value); + this->m_model.iPV4Address = m_iPV4Address.empty() ? nullptr : m_iPV4Address.data(); + } + + void SetLastStateTransitionTime(std::optional value) + { + m_lastStateTransitionTime = std::move(value); + this->m_model.lastStateTransitionTime = m_lastStateTransitionTime ? m_lastStateTransitionTime.operator->() : nullptr; + } + + void SetPorts(ModelVector, Alloc> value) + { + m_ports = std::move(value); + this->m_model.ports = m_ports.empty() ? nullptr : m_ports.data(); + this->m_model.portsCount = static_cast(m_ports.size()); + } + + void SetPublicIPV4Addresses(ModelVector, Alloc> value) + { + m_publicIPV4Addresses = std::move(value); + this->m_model.publicIPV4Addresses = m_publicIPV4Addresses.empty() ? nullptr : m_publicIPV4Addresses.data(); + this->m_model.publicIPV4AddressesCount = static_cast(m_publicIPV4Addresses.size()); + } + + void SetRegion(String value) + { + m_region = std::move(value); + this->m_model.region = m_region.empty() ? nullptr : m_region.data(); + } + + void SetServerId(String value) + { + m_serverId = std::move(value); + this->m_model.serverId = m_serverId.empty() ? nullptr : m_serverId.data(); + } + + void SetSessionId(String value) + { + m_sessionId = std::move(value); + this->m_model.sessionId = m_sessionId.empty() ? nullptr : m_sessionId.data(); + } + + void SetState(String value) + { + m_state = std::move(value); + this->m_model.state = m_state.empty() ? nullptr : m_state.data(); + } + + void SetVmId(String value) + { + m_vmId = std::move(value); + this->m_model.vmId = m_vmId.empty() ? nullptr : m_vmId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.buildId = m_buildId.empty() ? nullptr : m_buildId.data(); + this->m_model.connectedPlayers = m_connectedPlayers.empty() ? nullptr : m_connectedPlayers.data(); + this->m_model.fQDN = m_fQDN.empty() ? nullptr : m_fQDN.data(); + this->m_model.iPV4Address = m_iPV4Address.empty() ? nullptr : m_iPV4Address.data(); + this->m_model.lastStateTransitionTime = m_lastStateTransitionTime ? m_lastStateTransitionTime.operator->() : nullptr; + this->m_model.ports = m_ports.empty() ? nullptr : m_ports.data(); + this->m_model.publicIPV4Addresses = m_publicIPV4Addresses.empty() ? nullptr : m_publicIPV4Addresses.data(); + this->m_model.region = m_region.empty() ? nullptr : m_region.data(); + this->m_model.serverId = m_serverId.empty() ? nullptr : m_serverId.data(); + this->m_model.sessionId = m_sessionId.empty() ? nullptr : m_sessionId.data(); + this->m_model.state = m_state.empty() ? nullptr : m_state.data(); + this->m_model.vmId = m_vmId.empty() ? nullptr : m_vmId.data(); + } + + String m_buildId; + ModelVector, Alloc> m_connectedPlayers; + String m_fQDN; + String m_iPV4Address; + std::optional m_lastStateTransitionTime; + ModelVector, Alloc> m_ports; + ModelVector, Alloc> m_publicIPV4Addresses; + String m_region; + String m_serverId; + String m_sessionId; + String m_state; + String m_vmId; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlatformSpecificTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlatformSpecificTypeWrappers.h new file mode 100644 index 0000000..3d58819 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlatformSpecificTypeWrappers.h @@ -0,0 +1,456 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper() = default; + + PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper(const PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest& model) : + ModelWrapper{ model }, + m_confirmationMessage{ SafeString(model.confirmationMessage) }, + m_deviceToken{ SafeString(model.deviceToken) }, + m_sendPushNotificationConfirmation{ model.sendPushNotificationConfirmation ? std::optional{ *model.sendPushNotificationConfirmation } : std::nullopt } + { + SetModelPointers(); + } + + PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper(const PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper& src) : + PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper{ src.Model() } + { + } + + PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper(PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper&& src) : + PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper{} + { + swap(*this, src); + } + + PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper& operator=(PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper() = default; + + friend void swap(PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper& lhs, PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_confirmationMessage, rhs.m_confirmationMessage); + swap(lhs.m_deviceToken, rhs.m_deviceToken); + swap(lhs.m_sendPushNotificationConfirmation, rhs.m_sendPushNotificationConfirmation); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConfirmationMessage(String value) + { + m_confirmationMessage = std::move(value); + this->m_model.confirmationMessage = m_confirmationMessage.empty() ? nullptr : m_confirmationMessage.data(); + } + + void SetDeviceToken(String value) + { + m_deviceToken = std::move(value); + this->m_model.deviceToken = m_deviceToken.empty() ? nullptr : m_deviceToken.data(); + } + + void SetSendPushNotificationConfirmation(std::optional value) + { + m_sendPushNotificationConfirmation = std::move(value); + this->m_model.sendPushNotificationConfirmation = m_sendPushNotificationConfirmation ? m_sendPushNotificationConfirmation.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.confirmationMessage = m_confirmationMessage.empty() ? nullptr : m_confirmationMessage.data(); + this->m_model.deviceToken = m_deviceToken.empty() ? nullptr : m_deviceToken.data(); + this->m_model.sendPushNotificationConfirmation = m_sendPushNotificationConfirmation ? m_sendPushNotificationConfirmation.operator->() : nullptr; + } + + String m_confirmationMessage; + String m_deviceToken; + std::optional m_sendPushNotificationConfirmation; +}; + +template class Alloc = std::allocator> +class PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlatformSpecificRefreshPSNAuthTokenRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper() = default; + + PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper(const PFPlatformSpecificRefreshPSNAuthTokenRequest& model) : + ModelWrapper{ model }, + m_authCode{ SafeString(model.authCode) }, + m_issuerId{ model.issuerId ? std::optional{ *model.issuerId } : std::nullopt }, + m_redirectUri{ SafeString(model.redirectUri) } + { + SetModelPointers(); + } + + PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper(const PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper& src) : + PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper{ src.Model() } + { + } + + PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper(PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper&& src) : + PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper{} + { + swap(*this, src); + } + + PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper& operator=(PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper() = default; + + friend void swap(PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper& lhs, PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_authCode, rhs.m_authCode); + swap(lhs.m_issuerId, rhs.m_issuerId); + swap(lhs.m_redirectUri, rhs.m_redirectUri); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAuthCode(String value) + { + m_authCode = std::move(value); + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + } + + void SetIssuerId(std::optional value) + { + m_issuerId = std::move(value); + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + } + + void SetRedirectUri(String value) + { + m_redirectUri = std::move(value); + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + +private: + void SetModelPointers() + { + this->m_model.authCode = m_authCode.empty() ? nullptr : m_authCode.data(); + this->m_model.issuerId = m_issuerId ? m_issuerId.operator->() : nullptr; + this->m_model.redirectUri = m_redirectUri.empty() ? nullptr : m_redirectUri.data(); + } + + String m_authCode; + std::optional m_issuerId; + String m_redirectUri; +}; + +template class Alloc = std::allocator> +class PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlatformSpecificRegisterForIOSPushNotificationRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper() = default; + + PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper(const PFPlatformSpecificRegisterForIOSPushNotificationRequest& model) : + ModelWrapper{ model }, + m_confirmationMessage{ SafeString(model.confirmationMessage) }, + m_deviceToken{ SafeString(model.deviceToken) }, + m_sendPushNotificationConfirmation{ model.sendPushNotificationConfirmation ? std::optional{ *model.sendPushNotificationConfirmation } : std::nullopt } + { + SetModelPointers(); + } + + PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper(const PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper& src) : + PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper{ src.Model() } + { + } + + PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper(PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper&& src) : + PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper{} + { + swap(*this, src); + } + + PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper& operator=(PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper() = default; + + friend void swap(PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper& lhs, PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_confirmationMessage, rhs.m_confirmationMessage); + swap(lhs.m_deviceToken, rhs.m_deviceToken); + swap(lhs.m_sendPushNotificationConfirmation, rhs.m_sendPushNotificationConfirmation); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetConfirmationMessage(String value) + { + m_confirmationMessage = std::move(value); + this->m_model.confirmationMessage = m_confirmationMessage.empty() ? nullptr : m_confirmationMessage.data(); + } + + void SetDeviceToken(String value) + { + m_deviceToken = std::move(value); + this->m_model.deviceToken = m_deviceToken.empty() ? nullptr : m_deviceToken.data(); + } + + void SetSendPushNotificationConfirmation(std::optional value) + { + m_sendPushNotificationConfirmation = std::move(value); + this->m_model.sendPushNotificationConfirmation = m_sendPushNotificationConfirmation ? m_sendPushNotificationConfirmation.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.confirmationMessage = m_confirmationMessage.empty() ? nullptr : m_confirmationMessage.data(); + this->m_model.deviceToken = m_deviceToken.empty() ? nullptr : m_deviceToken.data(); + this->m_model.sendPushNotificationConfirmation = m_sendPushNotificationConfirmation ? m_sendPushNotificationConfirmation.operator->() : nullptr; + } + + String m_confirmationMessage; + String m_deviceToken; + std::optional m_sendPushNotificationConfirmation; +}; + +template class Alloc = std::allocator> +class PFPlatformSpecificAwardSteamAchievementItemWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlatformSpecificAwardSteamAchievementItem; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlatformSpecificAwardSteamAchievementItemWrapper() = default; + + PFPlatformSpecificAwardSteamAchievementItemWrapper(const PFPlatformSpecificAwardSteamAchievementItem& model) : + ModelWrapper{ model }, + m_achievementName{ SafeString(model.achievementName) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFPlatformSpecificAwardSteamAchievementItemWrapper(const PFPlatformSpecificAwardSteamAchievementItemWrapper& src) : + PFPlatformSpecificAwardSteamAchievementItemWrapper{ src.Model() } + { + } + + PFPlatformSpecificAwardSteamAchievementItemWrapper(PFPlatformSpecificAwardSteamAchievementItemWrapper&& src) : + PFPlatformSpecificAwardSteamAchievementItemWrapper{} + { + swap(*this, src); + } + + PFPlatformSpecificAwardSteamAchievementItemWrapper& operator=(PFPlatformSpecificAwardSteamAchievementItemWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlatformSpecificAwardSteamAchievementItemWrapper() = default; + + friend void swap(PFPlatformSpecificAwardSteamAchievementItemWrapper& lhs, PFPlatformSpecificAwardSteamAchievementItemWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_achievementName, rhs.m_achievementName); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAchievementName(String value) + { + m_achievementName = std::move(value); + this->m_model.achievementName = m_achievementName.empty() ? nullptr : m_achievementName.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetResult(bool value) + { + this->m_model.result = value; + } + +private: + void SetModelPointers() + { + this->m_model.achievementName = m_achievementName.empty() ? nullptr : m_achievementName.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + String m_achievementName; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFPlatformSpecificAwardSteamAchievementRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlatformSpecificAwardSteamAchievementRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlatformSpecificAwardSteamAchievementRequestWrapper() = default; + + PFPlatformSpecificAwardSteamAchievementRequestWrapper(const PFPlatformSpecificAwardSteamAchievementRequest& model) : + ModelWrapper{ model }, + m_achievements{ model.achievements, model.achievements + model.achievementsCount } + { + SetModelPointers(); + } + + PFPlatformSpecificAwardSteamAchievementRequestWrapper(const PFPlatformSpecificAwardSteamAchievementRequestWrapper& src) : + PFPlatformSpecificAwardSteamAchievementRequestWrapper{ src.Model() } + { + } + + PFPlatformSpecificAwardSteamAchievementRequestWrapper(PFPlatformSpecificAwardSteamAchievementRequestWrapper&& src) : + PFPlatformSpecificAwardSteamAchievementRequestWrapper{} + { + swap(*this, src); + } + + PFPlatformSpecificAwardSteamAchievementRequestWrapper& operator=(PFPlatformSpecificAwardSteamAchievementRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlatformSpecificAwardSteamAchievementRequestWrapper() = default; + + friend void swap(PFPlatformSpecificAwardSteamAchievementRequestWrapper& lhs, PFPlatformSpecificAwardSteamAchievementRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_achievements, rhs.m_achievements); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAchievements(ModelVector, Alloc> value) + { + m_achievements = std::move(value); + this->m_model.achievements = m_achievements.empty() ? nullptr : m_achievements.data(); + this->m_model.achievementsCount = static_cast(m_achievements.size()); + } + +private: + void SetModelPointers() + { + this->m_model.achievements = m_achievements.empty() ? nullptr : m_achievements.data(); + } + + ModelVector, Alloc> m_achievements; +}; + +template class Alloc = std::allocator> +class PFPlatformSpecificAwardSteamAchievementResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlatformSpecificAwardSteamAchievementResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlatformSpecificAwardSteamAchievementResultWrapper() = default; + + PFPlatformSpecificAwardSteamAchievementResultWrapper(const PFPlatformSpecificAwardSteamAchievementResult& model) : + ModelWrapper{ model }, + m_achievementResults{ model.achievementResults, model.achievementResults + model.achievementResultsCount } + { + SetModelPointers(); + } + + PFPlatformSpecificAwardSteamAchievementResultWrapper(const PFPlatformSpecificAwardSteamAchievementResultWrapper& src) : + PFPlatformSpecificAwardSteamAchievementResultWrapper{ src.Model() } + { + } + + PFPlatformSpecificAwardSteamAchievementResultWrapper(PFPlatformSpecificAwardSteamAchievementResultWrapper&& src) : + PFPlatformSpecificAwardSteamAchievementResultWrapper{} + { + swap(*this, src); + } + + PFPlatformSpecificAwardSteamAchievementResultWrapper& operator=(PFPlatformSpecificAwardSteamAchievementResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlatformSpecificAwardSteamAchievementResultWrapper() = default; + + friend void swap(PFPlatformSpecificAwardSteamAchievementResultWrapper& lhs, PFPlatformSpecificAwardSteamAchievementResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_achievementResults, rhs.m_achievementResults); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAchievementResults(ModelVector, Alloc> value) + { + m_achievementResults = std::move(value); + this->m_model.achievementResults = m_achievementResults.empty() ? nullptr : m_achievementResults.data(); + this->m_model.achievementResultsCount = static_cast(m_achievementResults.size()); + } + +private: + void SetModelPointers() + { + this->m_model.achievementResults = m_achievementResults.empty() ? nullptr : m_achievementResults.data(); + } + + ModelVector, Alloc> m_achievementResults; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlayerDataManagementTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlayerDataManagementTypeWrappers.h new file mode 100644 index 0000000..ecddbe5 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PlayerDataManagementTypeWrappers.h @@ -0,0 +1,549 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFPlayerDataManagementGetUserDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerDataManagementGetUserDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlayerDataManagementGetUserDataRequestWrapper() = default; + + PFPlayerDataManagementGetUserDataRequestWrapper(const PFPlayerDataManagementGetUserDataRequest& model) : + ModelWrapper{ model }, + m_ifChangedFromDataVersion{ model.ifChangedFromDataVersion ? std::optional{ *model.ifChangedFromDataVersion } : std::nullopt }, + m_keys{ model.keys, model.keys + model.keysCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFPlayerDataManagementGetUserDataRequestWrapper(const PFPlayerDataManagementGetUserDataRequestWrapper& src) : + PFPlayerDataManagementGetUserDataRequestWrapper{ src.Model() } + { + } + + PFPlayerDataManagementGetUserDataRequestWrapper(PFPlayerDataManagementGetUserDataRequestWrapper&& src) : + PFPlayerDataManagementGetUserDataRequestWrapper{} + { + swap(*this, src); + } + + PFPlayerDataManagementGetUserDataRequestWrapper& operator=(PFPlayerDataManagementGetUserDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlayerDataManagementGetUserDataRequestWrapper() = default; + + friend void swap(PFPlayerDataManagementGetUserDataRequestWrapper& lhs, PFPlayerDataManagementGetUserDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_ifChangedFromDataVersion, rhs.m_ifChangedFromDataVersion); + swap(lhs.m_keys, rhs.m_keys); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetIfChangedFromDataVersion(std::optional value) + { + m_ifChangedFromDataVersion = std::move(value); + this->m_model.ifChangedFromDataVersion = m_ifChangedFromDataVersion ? m_ifChangedFromDataVersion.operator->() : nullptr; + } + + void SetKeys(CStringVector value) + { + m_keys = std::move(value); + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + this->m_model.keysCount = static_cast(m_keys.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.ifChangedFromDataVersion = m_ifChangedFromDataVersion ? m_ifChangedFromDataVersion.operator->() : nullptr; + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + std::optional m_ifChangedFromDataVersion; + CStringVector m_keys; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFPlayerDataManagementClientGetUserDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerDataManagementClientGetUserDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlayerDataManagementClientGetUserDataResultWrapper() = default; + + PFPlayerDataManagementClientGetUserDataResultWrapper(const PFPlayerDataManagementClientGetUserDataResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFPlayerDataManagementClientGetUserDataResultWrapper(const PFPlayerDataManagementClientGetUserDataResultWrapper& src) : + PFPlayerDataManagementClientGetUserDataResultWrapper{ src.Model() } + { + } + + PFPlayerDataManagementClientGetUserDataResultWrapper(PFPlayerDataManagementClientGetUserDataResultWrapper&& src) : + PFPlayerDataManagementClientGetUserDataResultWrapper{} + { + swap(*this, src); + } + + PFPlayerDataManagementClientGetUserDataResultWrapper& operator=(PFPlayerDataManagementClientGetUserDataResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlayerDataManagementClientGetUserDataResultWrapper() = default; + + friend void swap(PFPlayerDataManagementClientGetUserDataResultWrapper& lhs, PFPlayerDataManagementClientGetUserDataResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelDictionaryEntryVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetDataVersion(uint32_t value) + { + this->m_model.dataVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + ModelDictionaryEntryVector, Alloc> m_data; +}; + +template class Alloc = std::allocator> +class PFPlayerDataManagementClientUpdateUserDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerDataManagementClientUpdateUserDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlayerDataManagementClientUpdateUserDataRequestWrapper() = default; + + PFPlayerDataManagementClientUpdateUserDataRequestWrapper(const PFPlayerDataManagementClientUpdateUserDataRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_data{ model.data, model.data + model.dataCount }, + m_keysToRemove{ model.keysToRemove, model.keysToRemove + model.keysToRemoveCount }, + m_permission{ model.permission ? std::optional{ *model.permission } : std::nullopt } + { + SetModelPointers(); + } + + PFPlayerDataManagementClientUpdateUserDataRequestWrapper(const PFPlayerDataManagementClientUpdateUserDataRequestWrapper& src) : + PFPlayerDataManagementClientUpdateUserDataRequestWrapper{ src.Model() } + { + } + + PFPlayerDataManagementClientUpdateUserDataRequestWrapper(PFPlayerDataManagementClientUpdateUserDataRequestWrapper&& src) : + PFPlayerDataManagementClientUpdateUserDataRequestWrapper{} + { + swap(*this, src); + } + + PFPlayerDataManagementClientUpdateUserDataRequestWrapper& operator=(PFPlayerDataManagementClientUpdateUserDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlayerDataManagementClientUpdateUserDataRequestWrapper() = default; + + friend void swap(PFPlayerDataManagementClientUpdateUserDataRequestWrapper& lhs, PFPlayerDataManagementClientUpdateUserDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_data, rhs.m_data); + swap(lhs.m_keysToRemove, rhs.m_keysToRemove); + swap(lhs.m_permission, rhs.m_permission); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetData(StringDictionaryEntryVector value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetKeysToRemove(CStringVector value) + { + m_keysToRemove = std::move(value); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.keysToRemoveCount = static_cast(m_keysToRemove.size()); + } + + void SetPermission(std::optional value) + { + m_permission = std::move(value); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + StringDictionaryEntryVector m_data; + CStringVector m_keysToRemove; + std::optional m_permission; +}; + +template class Alloc = std::allocator> +class PFPlayerDataManagementUpdateUserDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerDataManagementUpdateUserDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetDataVersion(uint32_t value) + { + this->m_model.dataVersion = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFPlayerDataManagementServerGetUserDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerDataManagementServerGetUserDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlayerDataManagementServerGetUserDataResultWrapper() = default; + + PFPlayerDataManagementServerGetUserDataResultWrapper(const PFPlayerDataManagementServerGetUserDataResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFPlayerDataManagementServerGetUserDataResultWrapper(const PFPlayerDataManagementServerGetUserDataResultWrapper& src) : + PFPlayerDataManagementServerGetUserDataResultWrapper{ src.Model() } + { + } + + PFPlayerDataManagementServerGetUserDataResultWrapper(PFPlayerDataManagementServerGetUserDataResultWrapper&& src) : + PFPlayerDataManagementServerGetUserDataResultWrapper{} + { + swap(*this, src); + } + + PFPlayerDataManagementServerGetUserDataResultWrapper& operator=(PFPlayerDataManagementServerGetUserDataResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlayerDataManagementServerGetUserDataResultWrapper() = default; + + friend void swap(PFPlayerDataManagementServerGetUserDataResultWrapper& lhs, PFPlayerDataManagementServerGetUserDataResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(ModelDictionaryEntryVector, Alloc> value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetDataVersion(uint32_t value) + { + this->m_model.dataVersion = value; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + ModelDictionaryEntryVector, Alloc> m_data; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFPlayerDataManagementServerUpdateUserDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerDataManagementServerUpdateUserDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlayerDataManagementServerUpdateUserDataRequestWrapper() = default; + + PFPlayerDataManagementServerUpdateUserDataRequestWrapper(const PFPlayerDataManagementServerUpdateUserDataRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_data{ model.data, model.data + model.dataCount }, + m_keysToRemove{ model.keysToRemove, model.keysToRemove + model.keysToRemoveCount }, + m_permission{ model.permission ? std::optional{ *model.permission } : std::nullopt }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFPlayerDataManagementServerUpdateUserDataRequestWrapper(const PFPlayerDataManagementServerUpdateUserDataRequestWrapper& src) : + PFPlayerDataManagementServerUpdateUserDataRequestWrapper{ src.Model() } + { + } + + PFPlayerDataManagementServerUpdateUserDataRequestWrapper(PFPlayerDataManagementServerUpdateUserDataRequestWrapper&& src) : + PFPlayerDataManagementServerUpdateUserDataRequestWrapper{} + { + swap(*this, src); + } + + PFPlayerDataManagementServerUpdateUserDataRequestWrapper& operator=(PFPlayerDataManagementServerUpdateUserDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlayerDataManagementServerUpdateUserDataRequestWrapper() = default; + + friend void swap(PFPlayerDataManagementServerUpdateUserDataRequestWrapper& lhs, PFPlayerDataManagementServerUpdateUserDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_data, rhs.m_data); + swap(lhs.m_keysToRemove, rhs.m_keysToRemove); + swap(lhs.m_permission, rhs.m_permission); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetData(StringDictionaryEntryVector value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetKeysToRemove(CStringVector value) + { + m_keysToRemove = std::move(value); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.keysToRemoveCount = static_cast(m_keysToRemove.size()); + } + + void SetPermission(std::optional value) + { + m_permission = std::move(value); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.permission = m_permission ? m_permission.operator->() : nullptr; + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + StringDictionaryEntryVector m_data; + CStringVector m_keysToRemove; + std::optional m_permission; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFPlayerDataManagementUpdateUserInternalDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPlayerDataManagementUpdateUserInternalDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPlayerDataManagementUpdateUserInternalDataRequestWrapper() = default; + + PFPlayerDataManagementUpdateUserInternalDataRequestWrapper(const PFPlayerDataManagementUpdateUserInternalDataRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_data{ model.data, model.data + model.dataCount }, + m_keysToRemove{ model.keysToRemove, model.keysToRemove + model.keysToRemoveCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFPlayerDataManagementUpdateUserInternalDataRequestWrapper(const PFPlayerDataManagementUpdateUserInternalDataRequestWrapper& src) : + PFPlayerDataManagementUpdateUserInternalDataRequestWrapper{ src.Model() } + { + } + + PFPlayerDataManagementUpdateUserInternalDataRequestWrapper(PFPlayerDataManagementUpdateUserInternalDataRequestWrapper&& src) : + PFPlayerDataManagementUpdateUserInternalDataRequestWrapper{} + { + swap(*this, src); + } + + PFPlayerDataManagementUpdateUserInternalDataRequestWrapper& operator=(PFPlayerDataManagementUpdateUserInternalDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPlayerDataManagementUpdateUserInternalDataRequestWrapper() = default; + + friend void swap(PFPlayerDataManagementUpdateUserInternalDataRequestWrapper& lhs, PFPlayerDataManagementUpdateUserInternalDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_data, rhs.m_data); + swap(lhs.m_keysToRemove, rhs.m_keysToRemove); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetData(StringDictionaryEntryVector value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + + void SetKeysToRemove(CStringVector value) + { + m_keysToRemove = std::move(value); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.keysToRemoveCount = static_cast(m_keysToRemove.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.keysToRemove = m_keysToRemove.empty() ? nullptr : m_keysToRemove.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + StringDictionaryEntryVector m_data; + CStringVector m_keysToRemove; + String m_playFabId; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/ProfilesTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/ProfilesTypeWrappers.h new file mode 100644 index 0000000..e57a97d --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/ProfilesTypeWrappers.h @@ -0,0 +1,1288 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFProfilesGetEntityProfileRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesGetEntityProfileRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesGetEntityProfileRequestWrapper() = default; + + PFProfilesGetEntityProfileRequestWrapper(const PFProfilesGetEntityProfileRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_dataAsObject{ model.dataAsObject ? std::optional{ *model.dataAsObject } : std::nullopt }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt } + { + SetModelPointers(); + } + + PFProfilesGetEntityProfileRequestWrapper(const PFProfilesGetEntityProfileRequestWrapper& src) : + PFProfilesGetEntityProfileRequestWrapper{ src.Model() } + { + } + + PFProfilesGetEntityProfileRequestWrapper(PFProfilesGetEntityProfileRequestWrapper&& src) : + PFProfilesGetEntityProfileRequestWrapper{} + { + swap(*this, src); + } + + PFProfilesGetEntityProfileRequestWrapper& operator=(PFProfilesGetEntityProfileRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesGetEntityProfileRequestWrapper() = default; + + friend void swap(PFProfilesGetEntityProfileRequestWrapper& lhs, PFProfilesGetEntityProfileRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_dataAsObject, rhs.m_dataAsObject); + swap(lhs.m_entity, rhs.m_entity); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDataAsObject(std::optional value) + { + m_dataAsObject = std::move(value); + this->m_model.dataAsObject = m_dataAsObject ? m_dataAsObject.operator->() : nullptr; + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.dataAsObject = m_dataAsObject ? m_dataAsObject.operator->() : nullptr; + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + StringDictionaryEntryVector m_customTags; + std::optional m_dataAsObject; + std::optional> m_entity; +}; + +template class Alloc = std::allocator> +class PFProfilesEntityProfileFileMetadataWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesEntityProfileFileMetadata; + using DictionaryEntryType = PFProfilesEntityProfileFileMetadataDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesEntityProfileFileMetadataWrapper() = default; + + PFProfilesEntityProfileFileMetadataWrapper(const PFProfilesEntityProfileFileMetadata& model) : + ModelWrapper{ model }, + m_checksum{ SafeString(model.checksum) }, + m_fileName{ SafeString(model.fileName) } + { + SetModelPointers(); + } + + PFProfilesEntityProfileFileMetadataWrapper(const PFProfilesEntityProfileFileMetadataWrapper& src) : + PFProfilesEntityProfileFileMetadataWrapper{ src.Model() } + { + } + + PFProfilesEntityProfileFileMetadataWrapper(PFProfilesEntityProfileFileMetadataWrapper&& src) : + PFProfilesEntityProfileFileMetadataWrapper{} + { + swap(*this, src); + } + + PFProfilesEntityProfileFileMetadataWrapper& operator=(PFProfilesEntityProfileFileMetadataWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesEntityProfileFileMetadataWrapper() = default; + + friend void swap(PFProfilesEntityProfileFileMetadataWrapper& lhs, PFProfilesEntityProfileFileMetadataWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_checksum, rhs.m_checksum); + swap(lhs.m_fileName, rhs.m_fileName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetChecksum(String value) + { + m_checksum = std::move(value); + this->m_model.checksum = m_checksum.empty() ? nullptr : m_checksum.data(); + } + + void SetFileName(String value) + { + m_fileName = std::move(value); + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + + void SetLastModified(time_t value) + { + this->m_model.lastModified = value; + } + + void SetSize(int32_t value) + { + this->m_model.size = value; + } + +private: + void SetModelPointers() + { + this->m_model.checksum = m_checksum.empty() ? nullptr : m_checksum.data(); + this->m_model.fileName = m_fileName.empty() ? nullptr : m_fileName.data(); + } + + String m_checksum; + String m_fileName; +}; + +template class Alloc = std::allocator> +class PFProfilesEntityDataObjectWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesEntityDataObject; + using DictionaryEntryType = PFProfilesEntityDataObjectDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesEntityDataObjectWrapper() = default; + + PFProfilesEntityDataObjectWrapper(const PFProfilesEntityDataObject& model) : + ModelWrapper{ model }, + m_dataObject{ model.dataObject }, + m_escapedDataObject{ SafeString(model.escapedDataObject) }, + m_objectName{ SafeString(model.objectName) } + { + SetModelPointers(); + } + + PFProfilesEntityDataObjectWrapper(const PFProfilesEntityDataObjectWrapper& src) : + PFProfilesEntityDataObjectWrapper{ src.Model() } + { + } + + PFProfilesEntityDataObjectWrapper(PFProfilesEntityDataObjectWrapper&& src) : + PFProfilesEntityDataObjectWrapper{} + { + swap(*this, src); + } + + PFProfilesEntityDataObjectWrapper& operator=(PFProfilesEntityDataObjectWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesEntityDataObjectWrapper() = default; + + friend void swap(PFProfilesEntityDataObjectWrapper& lhs, PFProfilesEntityDataObjectWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_dataObject, rhs.m_dataObject); + swap(lhs.m_escapedDataObject, rhs.m_escapedDataObject); + swap(lhs.m_objectName, rhs.m_objectName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetDataObject(JsonObject value) + { + m_dataObject = std::move(value); + this->m_model.dataObject.stringValue = m_dataObject.stringValue.empty() ? nullptr : m_dataObject.stringValue.data(); + } + + void SetEscapedDataObject(String value) + { + m_escapedDataObject = std::move(value); + this->m_model.escapedDataObject = m_escapedDataObject.empty() ? nullptr : m_escapedDataObject.data(); + } + + void SetObjectName(String value) + { + m_objectName = std::move(value); + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.dataObject.stringValue = m_dataObject.stringValue.empty() ? nullptr : m_dataObject.stringValue.data(); + this->m_model.escapedDataObject = m_escapedDataObject.empty() ? nullptr : m_escapedDataObject.data(); + this->m_model.objectName = m_objectName.empty() ? nullptr : m_objectName.data(); + } + + JsonObject m_dataObject; + String m_escapedDataObject; + String m_objectName; +}; + +template class Alloc = std::allocator> +class PFProfilesEntityPermissionStatementWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesEntityPermissionStatement; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesEntityPermissionStatementWrapper() = default; + + PFProfilesEntityPermissionStatementWrapper(const PFProfilesEntityPermissionStatement& model) : + ModelWrapper{ model }, + m_action{ SafeString(model.action) }, + m_comment{ SafeString(model.comment) }, + m_condition{ model.condition }, + m_principal{ model.principal }, + m_resource{ SafeString(model.resource) } + { + SetModelPointers(); + } + + PFProfilesEntityPermissionStatementWrapper(const PFProfilesEntityPermissionStatementWrapper& src) : + PFProfilesEntityPermissionStatementWrapper{ src.Model() } + { + } + + PFProfilesEntityPermissionStatementWrapper(PFProfilesEntityPermissionStatementWrapper&& src) : + PFProfilesEntityPermissionStatementWrapper{} + { + swap(*this, src); + } + + PFProfilesEntityPermissionStatementWrapper& operator=(PFProfilesEntityPermissionStatementWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesEntityPermissionStatementWrapper() = default; + + friend void swap(PFProfilesEntityPermissionStatementWrapper& lhs, PFProfilesEntityPermissionStatementWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_action, rhs.m_action); + swap(lhs.m_comment, rhs.m_comment); + swap(lhs.m_condition, rhs.m_condition); + swap(lhs.m_principal, rhs.m_principal); + swap(lhs.m_resource, rhs.m_resource); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAction(String value) + { + m_action = std::move(value); + this->m_model.action = m_action.empty() ? nullptr : m_action.data(); + } + + void SetComment(String value) + { + m_comment = std::move(value); + this->m_model.comment = m_comment.empty() ? nullptr : m_comment.data(); + } + + void SetCondition(JsonObject value) + { + m_condition = std::move(value); + this->m_model.condition.stringValue = m_condition.stringValue.empty() ? nullptr : m_condition.stringValue.data(); + } + + void SetEffect(PFProfilesEffectType value) + { + this->m_model.effect = value; + } + + void SetPrincipal(JsonObject value) + { + m_principal = std::move(value); + this->m_model.principal.stringValue = m_principal.stringValue.empty() ? nullptr : m_principal.stringValue.data(); + } + + void SetResource(String value) + { + m_resource = std::move(value); + this->m_model.resource = m_resource.empty() ? nullptr : m_resource.data(); + } + +private: + void SetModelPointers() + { + this->m_model.action = m_action.empty() ? nullptr : m_action.data(); + this->m_model.comment = m_comment.empty() ? nullptr : m_comment.data(); + this->m_model.condition.stringValue = m_condition.stringValue.empty() ? nullptr : m_condition.stringValue.data(); + this->m_model.principal.stringValue = m_principal.stringValue.empty() ? nullptr : m_principal.stringValue.data(); + this->m_model.resource = m_resource.empty() ? nullptr : m_resource.data(); + } + + String m_action; + String m_comment; + JsonObject m_condition; + JsonObject m_principal; + String m_resource; +}; + +template class Alloc = std::allocator> +class PFProfilesEntityStatisticValueWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesEntityStatisticValue; + using DictionaryEntryType = PFProfilesEntityStatisticValueDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesEntityStatisticValueWrapper() = default; + + PFProfilesEntityStatisticValueWrapper(const PFProfilesEntityStatisticValue& model) : + ModelWrapper{ model }, + m_metadata{ SafeString(model.metadata) }, + m_name{ SafeString(model.name) }, + m_value{ model.value ? std::optional{ *model.value } : std::nullopt } + { + SetModelPointers(); + } + + PFProfilesEntityStatisticValueWrapper(const PFProfilesEntityStatisticValueWrapper& src) : + PFProfilesEntityStatisticValueWrapper{ src.Model() } + { + } + + PFProfilesEntityStatisticValueWrapper(PFProfilesEntityStatisticValueWrapper&& src) : + PFProfilesEntityStatisticValueWrapper{} + { + swap(*this, src); + } + + PFProfilesEntityStatisticValueWrapper& operator=(PFProfilesEntityStatisticValueWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesEntityStatisticValueWrapper() = default; + + friend void swap(PFProfilesEntityStatisticValueWrapper& lhs, PFProfilesEntityStatisticValueWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_metadata, rhs.m_metadata); + swap(lhs.m_name, rhs.m_name); + swap(lhs.m_value, rhs.m_value); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetMetadata(String value) + { + m_metadata = std::move(value); + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetValue(std::optional value) + { + m_value = std::move(value); + this->m_model.value = m_value ? m_value.operator->() : nullptr; + } + + void SetVersion(int32_t value) + { + this->m_model.version = value; + } + +private: + void SetModelPointers() + { + this->m_model.metadata = m_metadata.empty() ? nullptr : m_metadata.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + this->m_model.value = m_value ? m_value.operator->() : nullptr; + } + + String m_metadata; + String m_name; + std::optional m_value; +}; + +template class Alloc = std::allocator> +class PFProfilesEntityProfileBodyWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesEntityProfileBody; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesEntityProfileBodyWrapper() = default; + + PFProfilesEntityProfileBodyWrapper(const PFProfilesEntityProfileBody& model) : + ModelWrapper{ model }, + m_avatarUrl{ SafeString(model.avatarUrl) }, + m_displayName{ SafeString(model.displayName) }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_entityChain{ SafeString(model.entityChain) }, + m_experimentVariants{ model.experimentVariants, model.experimentVariants + model.experimentVariantsCount }, + m_files{ model.files, model.files + model.filesCount }, + m_language{ SafeString(model.language) }, + m_lineage{ model.lineage ? std::optional>{ *model.lineage } : std::nullopt }, + m_objects{ model.objects, model.objects + model.objectsCount }, + m_permissions{ model.permissions, model.permissions + model.permissionsCount }, + m_statistics{ model.statistics, model.statistics + model.statisticsCount } + { + SetModelPointers(); + } + + PFProfilesEntityProfileBodyWrapper(const PFProfilesEntityProfileBodyWrapper& src) : + PFProfilesEntityProfileBodyWrapper{ src.Model() } + { + } + + PFProfilesEntityProfileBodyWrapper(PFProfilesEntityProfileBodyWrapper&& src) : + PFProfilesEntityProfileBodyWrapper{} + { + swap(*this, src); + } + + PFProfilesEntityProfileBodyWrapper& operator=(PFProfilesEntityProfileBodyWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesEntityProfileBodyWrapper() = default; + + friend void swap(PFProfilesEntityProfileBodyWrapper& lhs, PFProfilesEntityProfileBodyWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_avatarUrl, rhs.m_avatarUrl); + swap(lhs.m_displayName, rhs.m_displayName); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_entityChain, rhs.m_entityChain); + swap(lhs.m_experimentVariants, rhs.m_experimentVariants); + swap(lhs.m_files, rhs.m_files); + swap(lhs.m_language, rhs.m_language); + swap(lhs.m_lineage, rhs.m_lineage); + swap(lhs.m_objects, rhs.m_objects); + swap(lhs.m_permissions, rhs.m_permissions); + swap(lhs.m_statistics, rhs.m_statistics); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAvatarUrl(String value) + { + m_avatarUrl = std::move(value); + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + } + + void SetCreated(time_t value) + { + this->m_model.created = value; + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetEntityChain(String value) + { + m_entityChain = std::move(value); + this->m_model.entityChain = m_entityChain.empty() ? nullptr : m_entityChain.data(); + } + + void SetExperimentVariants(CStringVector value) + { + m_experimentVariants = std::move(value); + this->m_model.experimentVariants = m_experimentVariants.empty() ? nullptr : m_experimentVariants.data(); + this->m_model.experimentVariantsCount = static_cast(m_experimentVariants.size()); + } + + void SetFiles(ModelDictionaryEntryVector, Alloc> value) + { + m_files = std::move(value); + this->m_model.files = m_files.empty() ? nullptr : m_files.data(); + this->m_model.filesCount = static_cast(m_files.size()); + } + + void SetLanguage(String value) + { + m_language = std::move(value); + this->m_model.language = m_language.empty() ? nullptr : m_language.data(); + } + + void SetLineage(std::optional> value) + { + m_lineage = std::move(value); + this->m_model.lineage = m_lineage ? &m_lineage->Model() : nullptr; + } + + void SetObjects(ModelDictionaryEntryVector, Alloc> value) + { + m_objects = std::move(value); + this->m_model.objects = m_objects.empty() ? nullptr : m_objects.data(); + this->m_model.objectsCount = static_cast(m_objects.size()); + } + + void SetPermissions(ModelVector, Alloc> value) + { + m_permissions = std::move(value); + this->m_model.permissions = m_permissions.empty() ? nullptr : m_permissions.data(); + this->m_model.permissionsCount = static_cast(m_permissions.size()); + } + + void SetStatistics(ModelDictionaryEntryVector, Alloc> value) + { + m_statistics = std::move(value); + this->m_model.statistics = m_statistics.empty() ? nullptr : m_statistics.data(); + this->m_model.statisticsCount = static_cast(m_statistics.size()); + } + + void SetVersionNumber(int32_t value) + { + this->m_model.versionNumber = value; + } + +private: + void SetModelPointers() + { + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.entityChain = m_entityChain.empty() ? nullptr : m_entityChain.data(); + this->m_model.experimentVariants = m_experimentVariants.empty() ? nullptr : m_experimentVariants.data(); + this->m_model.files = m_files.empty() ? nullptr : m_files.data(); + this->m_model.language = m_language.empty() ? nullptr : m_language.data(); + this->m_model.lineage = m_lineage ? &m_lineage->Model() : nullptr; + this->m_model.objects = m_objects.empty() ? nullptr : m_objects.data(); + this->m_model.permissions = m_permissions.empty() ? nullptr : m_permissions.data(); + this->m_model.statistics = m_statistics.empty() ? nullptr : m_statistics.data(); + } + + String m_avatarUrl; + String m_displayName; + std::optional> m_entity; + String m_entityChain; + CStringVector m_experimentVariants; + ModelDictionaryEntryVector, Alloc> m_files; + String m_language; + std::optional> m_lineage; + ModelDictionaryEntryVector, Alloc> m_objects; + ModelVector, Alloc> m_permissions; + ModelDictionaryEntryVector, Alloc> m_statistics; +}; + +template class Alloc = std::allocator> +class PFProfilesGetEntityProfileResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesGetEntityProfileResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesGetEntityProfileResponseWrapper() = default; + + PFProfilesGetEntityProfileResponseWrapper(const PFProfilesGetEntityProfileResponse& model) : + ModelWrapper{ model }, + m_profile{ model.profile ? std::optional>{ *model.profile } : std::nullopt } + { + SetModelPointers(); + } + + PFProfilesGetEntityProfileResponseWrapper(const PFProfilesGetEntityProfileResponseWrapper& src) : + PFProfilesGetEntityProfileResponseWrapper{ src.Model() } + { + } + + PFProfilesGetEntityProfileResponseWrapper(PFProfilesGetEntityProfileResponseWrapper&& src) : + PFProfilesGetEntityProfileResponseWrapper{} + { + swap(*this, src); + } + + PFProfilesGetEntityProfileResponseWrapper& operator=(PFProfilesGetEntityProfileResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesGetEntityProfileResponseWrapper() = default; + + friend void swap(PFProfilesGetEntityProfileResponseWrapper& lhs, PFProfilesGetEntityProfileResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_profile, rhs.m_profile); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetProfile(std::optional> value) + { + m_profile = std::move(value); + this->m_model.profile = m_profile ? &m_profile->Model() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.profile = m_profile ? &m_profile->Model() : nullptr; + } + + std::optional> m_profile; +}; + +template class Alloc = std::allocator> +class PFProfilesGetEntityProfilesRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesGetEntityProfilesRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesGetEntityProfilesRequestWrapper() = default; + + PFProfilesGetEntityProfilesRequestWrapper(const PFProfilesGetEntityProfilesRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_dataAsObject{ model.dataAsObject ? std::optional{ *model.dataAsObject } : std::nullopt }, + m_entities{ model.entities, model.entities + model.entitiesCount } + { + SetModelPointers(); + } + + PFProfilesGetEntityProfilesRequestWrapper(const PFProfilesGetEntityProfilesRequestWrapper& src) : + PFProfilesGetEntityProfilesRequestWrapper{ src.Model() } + { + } + + PFProfilesGetEntityProfilesRequestWrapper(PFProfilesGetEntityProfilesRequestWrapper&& src) : + PFProfilesGetEntityProfilesRequestWrapper{} + { + swap(*this, src); + } + + PFProfilesGetEntityProfilesRequestWrapper& operator=(PFProfilesGetEntityProfilesRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesGetEntityProfilesRequestWrapper() = default; + + friend void swap(PFProfilesGetEntityProfilesRequestWrapper& lhs, PFProfilesGetEntityProfilesRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_dataAsObject, rhs.m_dataAsObject); + swap(lhs.m_entities, rhs.m_entities); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetDataAsObject(std::optional value) + { + m_dataAsObject = std::move(value); + this->m_model.dataAsObject = m_dataAsObject ? m_dataAsObject.operator->() : nullptr; + } + + void SetEntities(ModelVector, Alloc> value) + { + m_entities = std::move(value); + this->m_model.entities = m_entities.empty() ? nullptr : m_entities.data(); + this->m_model.entitiesCount = static_cast(m_entities.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.dataAsObject = m_dataAsObject ? m_dataAsObject.operator->() : nullptr; + this->m_model.entities = m_entities.empty() ? nullptr : m_entities.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional m_dataAsObject; + ModelVector, Alloc> m_entities; +}; + +template class Alloc = std::allocator> +class PFProfilesGetEntityProfilesResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesGetEntityProfilesResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesGetEntityProfilesResponseWrapper() = default; + + PFProfilesGetEntityProfilesResponseWrapper(const PFProfilesGetEntityProfilesResponse& model) : + ModelWrapper{ model }, + m_profiles{ model.profiles, model.profiles + model.profilesCount } + { + SetModelPointers(); + } + + PFProfilesGetEntityProfilesResponseWrapper(const PFProfilesGetEntityProfilesResponseWrapper& src) : + PFProfilesGetEntityProfilesResponseWrapper{ src.Model() } + { + } + + PFProfilesGetEntityProfilesResponseWrapper(PFProfilesGetEntityProfilesResponseWrapper&& src) : + PFProfilesGetEntityProfilesResponseWrapper{} + { + swap(*this, src); + } + + PFProfilesGetEntityProfilesResponseWrapper& operator=(PFProfilesGetEntityProfilesResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesGetEntityProfilesResponseWrapper() = default; + + friend void swap(PFProfilesGetEntityProfilesResponseWrapper& lhs, PFProfilesGetEntityProfilesResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_profiles, rhs.m_profiles); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetProfiles(ModelVector, Alloc> value) + { + m_profiles = std::move(value); + this->m_model.profiles = m_profiles.empty() ? nullptr : m_profiles.data(); + this->m_model.profilesCount = static_cast(m_profiles.size()); + } + +private: + void SetModelPointers() + { + this->m_model.profiles = m_profiles.empty() ? nullptr : m_profiles.data(); + } + + ModelVector, Alloc> m_profiles; +}; + +template class Alloc = std::allocator> +class PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper() = default; + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_masterPlayerAccountIds{ model.masterPlayerAccountIds, model.masterPlayerAccountIds + model.masterPlayerAccountIdsCount }, + m_titleId{ SafeString(model.titleId) } + { + SetModelPointers(); + } + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper& src) : + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper{ src.Model() } + { + } + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper&& src) : + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper{} + { + swap(*this, src); + } + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper& operator=(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper() = default; + + friend void swap(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper& lhs, PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_masterPlayerAccountIds, rhs.m_masterPlayerAccountIds); + swap(lhs.m_titleId, rhs.m_titleId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetMasterPlayerAccountIds(CStringVector value) + { + m_masterPlayerAccountIds = std::move(value); + this->m_model.masterPlayerAccountIds = m_masterPlayerAccountIds.empty() ? nullptr : m_masterPlayerAccountIds.data(); + this->m_model.masterPlayerAccountIdsCount = static_cast(m_masterPlayerAccountIds.size()); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.masterPlayerAccountIds = m_masterPlayerAccountIds.empty() ? nullptr : m_masterPlayerAccountIds.data(); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + StringDictionaryEntryVector m_customTags; + CStringVector m_masterPlayerAccountIds; + String m_titleId; +}; + +template class Alloc = std::allocator> +class PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper() = default; + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse& model) : + ModelWrapper{ model }, + m_titleId{ SafeString(model.titleId) }, + m_titlePlayerAccounts{ model.titlePlayerAccounts, model.titlePlayerAccounts + model.titlePlayerAccountsCount } + { + SetModelPointers(); + } + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper& src) : + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper{ src.Model() } + { + } + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper&& src) : + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper{} + { + swap(*this, src); + } + + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper& operator=(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper() = default; + + friend void swap(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper& lhs, PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_titleId, rhs.m_titleId); + swap(lhs.m_titlePlayerAccounts, rhs.m_titlePlayerAccounts); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + void SetTitlePlayerAccounts(ModelDictionaryEntryVector, Alloc> value) + { + m_titlePlayerAccounts = std::move(value); + this->m_model.titlePlayerAccounts = m_titlePlayerAccounts.empty() ? nullptr : m_titlePlayerAccounts.data(); + this->m_model.titlePlayerAccountsCount = static_cast(m_titlePlayerAccounts.size()); + } + +private: + void SetModelPointers() + { + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + this->m_model.titlePlayerAccounts = m_titlePlayerAccounts.empty() ? nullptr : m_titlePlayerAccounts.data(); + } + + String m_titleId; + ModelDictionaryEntryVector, Alloc> m_titlePlayerAccounts; +}; + +template class Alloc = std::allocator> +class PFProfilesSetProfileLanguageRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesSetProfileLanguageRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesSetProfileLanguageRequestWrapper() = default; + + PFProfilesSetProfileLanguageRequestWrapper(const PFProfilesSetProfileLanguageRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? std::optional>{ *model.entity } : std::nullopt }, + m_expectedVersion{ model.expectedVersion ? std::optional{ *model.expectedVersion } : std::nullopt }, + m_language{ SafeString(model.language) } + { + SetModelPointers(); + } + + PFProfilesSetProfileLanguageRequestWrapper(const PFProfilesSetProfileLanguageRequestWrapper& src) : + PFProfilesSetProfileLanguageRequestWrapper{ src.Model() } + { + } + + PFProfilesSetProfileLanguageRequestWrapper(PFProfilesSetProfileLanguageRequestWrapper&& src) : + PFProfilesSetProfileLanguageRequestWrapper{} + { + swap(*this, src); + } + + PFProfilesSetProfileLanguageRequestWrapper& operator=(PFProfilesSetProfileLanguageRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesSetProfileLanguageRequestWrapper() = default; + + friend void swap(PFProfilesSetProfileLanguageRequestWrapper& lhs, PFProfilesSetProfileLanguageRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_expectedVersion, rhs.m_expectedVersion); + swap(lhs.m_language, rhs.m_language); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(std::optional> value) + { + m_entity = std::move(value); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + } + + void SetExpectedVersion(std::optional value) + { + m_expectedVersion = std::move(value); + this->m_model.expectedVersion = m_expectedVersion ? m_expectedVersion.operator->() : nullptr; + } + + void SetLanguage(String value) + { + m_language = std::move(value); + this->m_model.language = m_language.empty() ? nullptr : m_language.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = m_entity ? &m_entity->Model() : nullptr; + this->m_model.expectedVersion = m_expectedVersion ? m_expectedVersion.operator->() : nullptr; + this->m_model.language = m_language.empty() ? nullptr : m_language.data(); + } + + StringDictionaryEntryVector m_customTags; + std::optional> m_entity; + std::optional m_expectedVersion; + String m_language; +}; + +template class Alloc = std::allocator> +class PFProfilesSetProfileLanguageResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesSetProfileLanguageResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesSetProfileLanguageResponseWrapper() = default; + + PFProfilesSetProfileLanguageResponseWrapper(const PFProfilesSetProfileLanguageResponse& model) : + ModelWrapper{ model }, + m_operationResult{ model.operationResult ? std::optional{ *model.operationResult } : std::nullopt }, + m_versionNumber{ model.versionNumber ? std::optional{ *model.versionNumber } : std::nullopt } + { + SetModelPointers(); + } + + PFProfilesSetProfileLanguageResponseWrapper(const PFProfilesSetProfileLanguageResponseWrapper& src) : + PFProfilesSetProfileLanguageResponseWrapper{ src.Model() } + { + } + + PFProfilesSetProfileLanguageResponseWrapper(PFProfilesSetProfileLanguageResponseWrapper&& src) : + PFProfilesSetProfileLanguageResponseWrapper{} + { + swap(*this, src); + } + + PFProfilesSetProfileLanguageResponseWrapper& operator=(PFProfilesSetProfileLanguageResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesSetProfileLanguageResponseWrapper() = default; + + friend void swap(PFProfilesSetProfileLanguageResponseWrapper& lhs, PFProfilesSetProfileLanguageResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_operationResult, rhs.m_operationResult); + swap(lhs.m_versionNumber, rhs.m_versionNumber); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetOperationResult(std::optional value) + { + m_operationResult = std::move(value); + this->m_model.operationResult = m_operationResult ? m_operationResult.operator->() : nullptr; + } + + void SetVersionNumber(std::optional value) + { + m_versionNumber = std::move(value); + this->m_model.versionNumber = m_versionNumber ? m_versionNumber.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.operationResult = m_operationResult ? m_operationResult.operator->() : nullptr; + this->m_model.versionNumber = m_versionNumber ? m_versionNumber.operator->() : nullptr; + } + + std::optional m_operationResult; + std::optional m_versionNumber; +}; + +template class Alloc = std::allocator> +class PFProfilesSetEntityProfilePolicyRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesSetEntityProfilePolicyRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesSetEntityProfilePolicyRequestWrapper() = default; + + PFProfilesSetEntityProfilePolicyRequestWrapper(const PFProfilesSetEntityProfilePolicyRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_entity{ model.entity ? *model.entity : decltype(*model.entity){} }, + m_statements{ model.statements, model.statements + model.statementsCount } + { + SetModelPointers(); + } + + PFProfilesSetEntityProfilePolicyRequestWrapper(const PFProfilesSetEntityProfilePolicyRequestWrapper& src) : + PFProfilesSetEntityProfilePolicyRequestWrapper{ src.Model() } + { + } + + PFProfilesSetEntityProfilePolicyRequestWrapper(PFProfilesSetEntityProfilePolicyRequestWrapper&& src) : + PFProfilesSetEntityProfilePolicyRequestWrapper{} + { + swap(*this, src); + } + + PFProfilesSetEntityProfilePolicyRequestWrapper& operator=(PFProfilesSetEntityProfilePolicyRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesSetEntityProfilePolicyRequestWrapper() = default; + + friend void swap(PFProfilesSetEntityProfilePolicyRequestWrapper& lhs, PFProfilesSetEntityProfilePolicyRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_entity, rhs.m_entity); + swap(lhs.m_statements, rhs.m_statements); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetEntity(PFEntityKeyWrapper value) + { + m_entity = std::move(value); + this->m_model.entity = &m_entity.Model(); + } + + void SetStatements(ModelVector, Alloc> value) + { + m_statements = std::move(value); + this->m_model.statements = m_statements.empty() ? nullptr : m_statements.data(); + this->m_model.statementsCount = static_cast(m_statements.size()); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.entity = &m_entity.Model(); + this->m_model.statements = m_statements.empty() ? nullptr : m_statements.data(); + } + + StringDictionaryEntryVector m_customTags; + PFEntityKeyWrapper m_entity; + ModelVector, Alloc> m_statements; +}; + +template class Alloc = std::allocator> +class PFProfilesSetEntityProfilePolicyResponseWrapper : public ModelWrapper +{ +public: + using ModelType = PFProfilesSetEntityProfilePolicyResponse; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFProfilesSetEntityProfilePolicyResponseWrapper() = default; + + PFProfilesSetEntityProfilePolicyResponseWrapper(const PFProfilesSetEntityProfilePolicyResponse& model) : + ModelWrapper{ model }, + m_permissions{ model.permissions, model.permissions + model.permissionsCount } + { + SetModelPointers(); + } + + PFProfilesSetEntityProfilePolicyResponseWrapper(const PFProfilesSetEntityProfilePolicyResponseWrapper& src) : + PFProfilesSetEntityProfilePolicyResponseWrapper{ src.Model() } + { + } + + PFProfilesSetEntityProfilePolicyResponseWrapper(PFProfilesSetEntityProfilePolicyResponseWrapper&& src) : + PFProfilesSetEntityProfilePolicyResponseWrapper{} + { + swap(*this, src); + } + + PFProfilesSetEntityProfilePolicyResponseWrapper& operator=(PFProfilesSetEntityProfilePolicyResponseWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFProfilesSetEntityProfilePolicyResponseWrapper() = default; + + friend void swap(PFProfilesSetEntityProfilePolicyResponseWrapper& lhs, PFProfilesSetEntityProfilePolicyResponseWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_permissions, rhs.m_permissions); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPermissions(ModelVector, Alloc> value) + { + m_permissions = std::move(value); + this->m_model.permissions = m_permissions.empty() ? nullptr : m_permissions.data(); + this->m_model.permissionsCount = static_cast(m_permissions.size()); + } + +private: + void SetModelPointers() + { + this->m_model.permissions = m_permissions.empty() ? nullptr : m_permissions.data(); + } + + ModelVector, Alloc> m_permissions; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PushNotificationsTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PushNotificationsTypeWrappers.h new file mode 100644 index 0000000..dbbe605 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/PushNotificationsTypeWrappers.h @@ -0,0 +1,403 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFPushNotificationsAdvancedPushPlatformMsgWrapper : public ModelWrapper +{ +public: + using ModelType = PFPushNotificationsAdvancedPushPlatformMsg; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPushNotificationsAdvancedPushPlatformMsgWrapper() = default; + + PFPushNotificationsAdvancedPushPlatformMsgWrapper(const PFPushNotificationsAdvancedPushPlatformMsg& model) : + ModelWrapper{ model }, + m_gCMDataOnly{ model.gCMDataOnly ? std::optional{ *model.gCMDataOnly } : std::nullopt }, + m_json{ SafeString(model.json) } + { + SetModelPointers(); + } + + PFPushNotificationsAdvancedPushPlatformMsgWrapper(const PFPushNotificationsAdvancedPushPlatformMsgWrapper& src) : + PFPushNotificationsAdvancedPushPlatformMsgWrapper{ src.Model() } + { + } + + PFPushNotificationsAdvancedPushPlatformMsgWrapper(PFPushNotificationsAdvancedPushPlatformMsgWrapper&& src) : + PFPushNotificationsAdvancedPushPlatformMsgWrapper{} + { + swap(*this, src); + } + + PFPushNotificationsAdvancedPushPlatformMsgWrapper& operator=(PFPushNotificationsAdvancedPushPlatformMsgWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPushNotificationsAdvancedPushPlatformMsgWrapper() = default; + + friend void swap(PFPushNotificationsAdvancedPushPlatformMsgWrapper& lhs, PFPushNotificationsAdvancedPushPlatformMsgWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_gCMDataOnly, rhs.m_gCMDataOnly); + swap(lhs.m_json, rhs.m_json); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetGCMDataOnly(std::optional value) + { + m_gCMDataOnly = std::move(value); + this->m_model.gCMDataOnly = m_gCMDataOnly ? m_gCMDataOnly.operator->() : nullptr; + } + + void SetJson(String value) + { + m_json = std::move(value); + this->m_model.json = m_json.empty() ? nullptr : m_json.data(); + } + + void SetPlatform(PFPushNotificationPlatform value) + { + this->m_model.platform = value; + } + +private: + void SetModelPointers() + { + this->m_model.gCMDataOnly = m_gCMDataOnly ? m_gCMDataOnly.operator->() : nullptr; + this->m_model.json = m_json.empty() ? nullptr : m_json.data(); + } + + std::optional m_gCMDataOnly; + String m_json; +}; + +template class Alloc = std::allocator> +class PFPushNotificationsPushNotificationPackageWrapper : public ModelWrapper +{ +public: + using ModelType = PFPushNotificationsPushNotificationPackage; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPushNotificationsPushNotificationPackageWrapper() = default; + + PFPushNotificationsPushNotificationPackageWrapper(const PFPushNotificationsPushNotificationPackage& model) : + ModelWrapper{ model }, + m_customData{ SafeString(model.customData) }, + m_icon{ SafeString(model.icon) }, + m_message{ SafeString(model.message) }, + m_sound{ SafeString(model.sound) }, + m_title{ SafeString(model.title) } + { + SetModelPointers(); + } + + PFPushNotificationsPushNotificationPackageWrapper(const PFPushNotificationsPushNotificationPackageWrapper& src) : + PFPushNotificationsPushNotificationPackageWrapper{ src.Model() } + { + } + + PFPushNotificationsPushNotificationPackageWrapper(PFPushNotificationsPushNotificationPackageWrapper&& src) : + PFPushNotificationsPushNotificationPackageWrapper{} + { + swap(*this, src); + } + + PFPushNotificationsPushNotificationPackageWrapper& operator=(PFPushNotificationsPushNotificationPackageWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPushNotificationsPushNotificationPackageWrapper() = default; + + friend void swap(PFPushNotificationsPushNotificationPackageWrapper& lhs, PFPushNotificationsPushNotificationPackageWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customData, rhs.m_customData); + swap(lhs.m_icon, rhs.m_icon); + swap(lhs.m_message, rhs.m_message); + swap(lhs.m_sound, rhs.m_sound); + swap(lhs.m_title, rhs.m_title); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBadge(int32_t value) + { + this->m_model.badge = value; + } + + void SetCustomData(String value) + { + m_customData = std::move(value); + this->m_model.customData = m_customData.empty() ? nullptr : m_customData.data(); + } + + void SetIcon(String value) + { + m_icon = std::move(value); + this->m_model.icon = m_icon.empty() ? nullptr : m_icon.data(); + } + + void SetMessage(String value) + { + m_message = std::move(value); + this->m_model.message = m_message.empty() ? nullptr : m_message.data(); + } + + void SetSound(String value) + { + m_sound = std::move(value); + this->m_model.sound = m_sound.empty() ? nullptr : m_sound.data(); + } + + void SetTitle(String value) + { + m_title = std::move(value); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customData = m_customData.empty() ? nullptr : m_customData.data(); + this->m_model.icon = m_icon.empty() ? nullptr : m_icon.data(); + this->m_model.message = m_message.empty() ? nullptr : m_message.data(); + this->m_model.sound = m_sound.empty() ? nullptr : m_sound.data(); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + } + + String m_customData; + String m_icon; + String m_message; + String m_sound; + String m_title; +}; + +template class Alloc = std::allocator> +class PFPushNotificationsSendPushNotificationRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPushNotificationsSendPushNotificationRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPushNotificationsSendPushNotificationRequestWrapper() = default; + + PFPushNotificationsSendPushNotificationRequestWrapper(const PFPushNotificationsSendPushNotificationRequest& model) : + ModelWrapper{ model }, + m_advancedPlatformDelivery{ model.advancedPlatformDelivery, model.advancedPlatformDelivery + model.advancedPlatformDeliveryCount }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_message{ SafeString(model.message) }, + m_package{ model.package ? std::optional>{ *model.package } : std::nullopt }, + m_recipient{ SafeString(model.recipient) }, + m_subject{ SafeString(model.subject) }, + m_targetPlatforms{ model.targetPlatforms, model.targetPlatforms + model.targetPlatformsCount } + { + SetModelPointers(); + } + + PFPushNotificationsSendPushNotificationRequestWrapper(const PFPushNotificationsSendPushNotificationRequestWrapper& src) : + PFPushNotificationsSendPushNotificationRequestWrapper{ src.Model() } + { + } + + PFPushNotificationsSendPushNotificationRequestWrapper(PFPushNotificationsSendPushNotificationRequestWrapper&& src) : + PFPushNotificationsSendPushNotificationRequestWrapper{} + { + swap(*this, src); + } + + PFPushNotificationsSendPushNotificationRequestWrapper& operator=(PFPushNotificationsSendPushNotificationRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPushNotificationsSendPushNotificationRequestWrapper() = default; + + friend void swap(PFPushNotificationsSendPushNotificationRequestWrapper& lhs, PFPushNotificationsSendPushNotificationRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_advancedPlatformDelivery, rhs.m_advancedPlatformDelivery); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_message, rhs.m_message); + swap(lhs.m_package, rhs.m_package); + swap(lhs.m_recipient, rhs.m_recipient); + swap(lhs.m_subject, rhs.m_subject); + swap(lhs.m_targetPlatforms, rhs.m_targetPlatforms); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdvancedPlatformDelivery(ModelVector, Alloc> value) + { + m_advancedPlatformDelivery = std::move(value); + this->m_model.advancedPlatformDelivery = m_advancedPlatformDelivery.empty() ? nullptr : m_advancedPlatformDelivery.data(); + this->m_model.advancedPlatformDeliveryCount = static_cast(m_advancedPlatformDelivery.size()); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetMessage(String value) + { + m_message = std::move(value); + this->m_model.message = m_message.empty() ? nullptr : m_message.data(); + } + + void SetPackage(std::optional> value) + { + m_package = std::move(value); + this->m_model.package = m_package ? &m_package->Model() : nullptr; + } + + void SetRecipient(String value) + { + m_recipient = std::move(value); + this->m_model.recipient = m_recipient.empty() ? nullptr : m_recipient.data(); + } + + void SetSubject(String value) + { + m_subject = std::move(value); + this->m_model.subject = m_subject.empty() ? nullptr : m_subject.data(); + } + + void SetTargetPlatforms(Vector value) + { + m_targetPlatforms = std::move(value); + this->m_model.targetPlatforms = m_targetPlatforms.empty() ? nullptr : m_targetPlatforms.data(); + this->m_model.targetPlatformsCount = static_cast(m_targetPlatforms.size()); + } + +private: + void SetModelPointers() + { + this->m_model.advancedPlatformDelivery = m_advancedPlatformDelivery.empty() ? nullptr : m_advancedPlatformDelivery.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.message = m_message.empty() ? nullptr : m_message.data(); + this->m_model.package = m_package ? &m_package->Model() : nullptr; + this->m_model.recipient = m_recipient.empty() ? nullptr : m_recipient.data(); + this->m_model.subject = m_subject.empty() ? nullptr : m_subject.data(); + this->m_model.targetPlatforms = m_targetPlatforms.empty() ? nullptr : m_targetPlatforms.data(); + } + + ModelVector, Alloc> m_advancedPlatformDelivery; + StringDictionaryEntryVector m_customTags; + String m_message; + std::optional> m_package; + String m_recipient; + String m_subject; + Vector m_targetPlatforms; +}; + +template class Alloc = std::allocator> +class PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFPushNotificationsSendPushNotificationFromTemplateRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper() = default; + + PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper(const PFPushNotificationsSendPushNotificationFromTemplateRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_pushNotificationTemplateId{ SafeString(model.pushNotificationTemplateId) }, + m_recipient{ SafeString(model.recipient) } + { + SetModelPointers(); + } + + PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper(const PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper& src) : + PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper{ src.Model() } + { + } + + PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper(PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper&& src) : + PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper{} + { + swap(*this, src); + } + + PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper& operator=(PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper() = default; + + friend void swap(PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper& lhs, PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_pushNotificationTemplateId, rhs.m_pushNotificationTemplateId); + swap(lhs.m_recipient, rhs.m_recipient); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPushNotificationTemplateId(String value) + { + m_pushNotificationTemplateId = std::move(value); + this->m_model.pushNotificationTemplateId = m_pushNotificationTemplateId.empty() ? nullptr : m_pushNotificationTemplateId.data(); + } + + void SetRecipient(String value) + { + m_recipient = std::move(value); + this->m_model.recipient = m_recipient.empty() ? nullptr : m_recipient.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.pushNotificationTemplateId = m_pushNotificationTemplateId.empty() ? nullptr : m_pushNotificationTemplateId.data(); + this->m_model.recipient = m_recipient.empty() ? nullptr : m_recipient.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_pushNotificationTemplateId; + String m_recipient; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/SegmentsTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/SegmentsTypeWrappers.h new file mode 100644 index 0000000..1ecb908 --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/SegmentsTypeWrappers.h @@ -0,0 +1,1560 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFSegmentsGetSegmentResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetSegmentResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetSegmentResultWrapper() = default; + + PFSegmentsGetSegmentResultWrapper(const PFSegmentsGetSegmentResult& model) : + ModelWrapper{ model }, + m_aBTestParent{ SafeString(model.aBTestParent) }, + m_id{ SafeString(model.id) }, + m_name{ SafeString(model.name) } + { + SetModelPointers(); + } + + PFSegmentsGetSegmentResultWrapper(const PFSegmentsGetSegmentResultWrapper& src) : + PFSegmentsGetSegmentResultWrapper{ src.Model() } + { + } + + PFSegmentsGetSegmentResultWrapper(PFSegmentsGetSegmentResultWrapper&& src) : + PFSegmentsGetSegmentResultWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetSegmentResultWrapper& operator=(PFSegmentsGetSegmentResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetSegmentResultWrapper() = default; + + friend void swap(PFSegmentsGetSegmentResultWrapper& lhs, PFSegmentsGetSegmentResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_aBTestParent, rhs.m_aBTestParent); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_name, rhs.m_name); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetABTestParent(String value) + { + m_aBTestParent = std::move(value); + this->m_model.aBTestParent = m_aBTestParent.empty() ? nullptr : m_aBTestParent.data(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + +private: + void SetModelPointers() + { + this->m_model.aBTestParent = m_aBTestParent.empty() ? nullptr : m_aBTestParent.data(); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + String m_aBTestParent; + String m_id; + String m_name; +}; + +template class Alloc = std::allocator> +class PFSegmentsGetPlayerSegmentsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetPlayerSegmentsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetPlayerSegmentsResultWrapper() = default; + + PFSegmentsGetPlayerSegmentsResultWrapper(const PFSegmentsGetPlayerSegmentsResult& model) : + ModelWrapper{ model }, + m_segments{ model.segments, model.segments + model.segmentsCount } + { + SetModelPointers(); + } + + PFSegmentsGetPlayerSegmentsResultWrapper(const PFSegmentsGetPlayerSegmentsResultWrapper& src) : + PFSegmentsGetPlayerSegmentsResultWrapper{ src.Model() } + { + } + + PFSegmentsGetPlayerSegmentsResultWrapper(PFSegmentsGetPlayerSegmentsResultWrapper&& src) : + PFSegmentsGetPlayerSegmentsResultWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetPlayerSegmentsResultWrapper& operator=(PFSegmentsGetPlayerSegmentsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetPlayerSegmentsResultWrapper() = default; + + friend void swap(PFSegmentsGetPlayerSegmentsResultWrapper& lhs, PFSegmentsGetPlayerSegmentsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_segments, rhs.m_segments); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetSegments(ModelVector, Alloc> value) + { + m_segments = std::move(value); + this->m_model.segments = m_segments.empty() ? nullptr : m_segments.data(); + this->m_model.segmentsCount = static_cast(m_segments.size()); + } + +private: + void SetModelPointers() + { + this->m_model.segments = m_segments.empty() ? nullptr : m_segments.data(); + } + + ModelVector, Alloc> m_segments; +}; + +template class Alloc = std::allocator> +class PFSegmentsGetPlayerTagsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetPlayerTagsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetPlayerTagsRequestWrapper() = default; + + PFSegmentsGetPlayerTagsRequestWrapper(const PFSegmentsGetPlayerTagsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playfabNamespace{ SafeString(model.playfabNamespace) }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFSegmentsGetPlayerTagsRequestWrapper(const PFSegmentsGetPlayerTagsRequestWrapper& src) : + PFSegmentsGetPlayerTagsRequestWrapper{ src.Model() } + { + } + + PFSegmentsGetPlayerTagsRequestWrapper(PFSegmentsGetPlayerTagsRequestWrapper&& src) : + PFSegmentsGetPlayerTagsRequestWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetPlayerTagsRequestWrapper& operator=(PFSegmentsGetPlayerTagsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetPlayerTagsRequestWrapper() = default; + + friend void swap(PFSegmentsGetPlayerTagsRequestWrapper& lhs, PFSegmentsGetPlayerTagsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playfabNamespace, rhs.m_playfabNamespace); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetplayfabNamespace(String value) + { + m_playfabNamespace = std::move(value); + this->m_model.playfabNamespace = m_playfabNamespace.empty() ? nullptr : m_playfabNamespace.data(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playfabNamespace = m_playfabNamespace.empty() ? nullptr : m_playfabNamespace.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playfabNamespace; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFSegmentsGetPlayerTagsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetPlayerTagsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetPlayerTagsResultWrapper() = default; + + PFSegmentsGetPlayerTagsResultWrapper(const PFSegmentsGetPlayerTagsResult& model) : + ModelWrapper{ model }, + m_playFabId{ SafeString(model.playFabId) }, + m_tags{ model.tags, model.tags + model.tagsCount } + { + SetModelPointers(); + } + + PFSegmentsGetPlayerTagsResultWrapper(const PFSegmentsGetPlayerTagsResultWrapper& src) : + PFSegmentsGetPlayerTagsResultWrapper{ src.Model() } + { + } + + PFSegmentsGetPlayerTagsResultWrapper(PFSegmentsGetPlayerTagsResultWrapper&& src) : + PFSegmentsGetPlayerTagsResultWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetPlayerTagsResultWrapper& operator=(PFSegmentsGetPlayerTagsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetPlayerTagsResultWrapper() = default; + + friend void swap(PFSegmentsGetPlayerTagsResultWrapper& lhs, PFSegmentsGetPlayerTagsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_tags, rhs.m_tags); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + +private: + void SetModelPointers() + { + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + } + + String m_playFabId; + CStringVector m_tags; +}; + +template class Alloc = std::allocator> +class PFSegmentsAddPlayerTagRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsAddPlayerTagRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsAddPlayerTagRequestWrapper() = default; + + PFSegmentsAddPlayerTagRequestWrapper(const PFSegmentsAddPlayerTagRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) }, + m_tagName{ SafeString(model.tagName) } + { + SetModelPointers(); + } + + PFSegmentsAddPlayerTagRequestWrapper(const PFSegmentsAddPlayerTagRequestWrapper& src) : + PFSegmentsAddPlayerTagRequestWrapper{ src.Model() } + { + } + + PFSegmentsAddPlayerTagRequestWrapper(PFSegmentsAddPlayerTagRequestWrapper&& src) : + PFSegmentsAddPlayerTagRequestWrapper{} + { + swap(*this, src); + } + + PFSegmentsAddPlayerTagRequestWrapper& operator=(PFSegmentsAddPlayerTagRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsAddPlayerTagRequestWrapper() = default; + + friend void swap(PFSegmentsAddPlayerTagRequestWrapper& lhs, PFSegmentsAddPlayerTagRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_tagName, rhs.m_tagName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetTagName(String value) + { + m_tagName = std::move(value); + this->m_model.tagName = m_tagName.empty() ? nullptr : m_tagName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.tagName = m_tagName.empty() ? nullptr : m_tagName.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; + String m_tagName; +}; + +template class Alloc = std::allocator> +class PFSegmentsGetAllSegmentsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetAllSegmentsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetAllSegmentsResultWrapper() = default; + + PFSegmentsGetAllSegmentsResultWrapper(const PFSegmentsGetAllSegmentsResult& model) : + ModelWrapper{ model }, + m_segments{ model.segments, model.segments + model.segmentsCount } + { + SetModelPointers(); + } + + PFSegmentsGetAllSegmentsResultWrapper(const PFSegmentsGetAllSegmentsResultWrapper& src) : + PFSegmentsGetAllSegmentsResultWrapper{ src.Model() } + { + } + + PFSegmentsGetAllSegmentsResultWrapper(PFSegmentsGetAllSegmentsResultWrapper&& src) : + PFSegmentsGetAllSegmentsResultWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetAllSegmentsResultWrapper& operator=(PFSegmentsGetAllSegmentsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetAllSegmentsResultWrapper() = default; + + friend void swap(PFSegmentsGetAllSegmentsResultWrapper& lhs, PFSegmentsGetAllSegmentsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_segments, rhs.m_segments); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetSegments(ModelVector, Alloc> value) + { + m_segments = std::move(value); + this->m_model.segments = m_segments.empty() ? nullptr : m_segments.data(); + this->m_model.segmentsCount = static_cast(m_segments.size()); + } + +private: + void SetModelPointers() + { + this->m_model.segments = m_segments.empty() ? nullptr : m_segments.data(); + } + + ModelVector, Alloc> m_segments; +}; + +template class Alloc = std::allocator> +class PFSegmentsGetPlayersSegmentsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetPlayersSegmentsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetPlayersSegmentsRequestWrapper() = default; + + PFSegmentsGetPlayersSegmentsRequestWrapper(const PFSegmentsGetPlayersSegmentsRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) } + { + SetModelPointers(); + } + + PFSegmentsGetPlayersSegmentsRequestWrapper(const PFSegmentsGetPlayersSegmentsRequestWrapper& src) : + PFSegmentsGetPlayersSegmentsRequestWrapper{ src.Model() } + { + } + + PFSegmentsGetPlayersSegmentsRequestWrapper(PFSegmentsGetPlayersSegmentsRequestWrapper&& src) : + PFSegmentsGetPlayersSegmentsRequestWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetPlayersSegmentsRequestWrapper& operator=(PFSegmentsGetPlayersSegmentsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetPlayersSegmentsRequestWrapper() = default; + + friend void swap(PFSegmentsGetPlayersSegmentsRequestWrapper& lhs, PFSegmentsGetPlayersSegmentsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; +}; + +template class Alloc = std::allocator> +class PFSegmentsGetPlayersInSegmentRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetPlayersInSegmentRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetPlayersInSegmentRequestWrapper() = default; + + PFSegmentsGetPlayersInSegmentRequestWrapper(const PFSegmentsGetPlayersInSegmentRequest& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_getProfilesAsync{ model.getProfilesAsync ? std::optional{ *model.getProfilesAsync } : std::nullopt }, + m_maxBatchSize{ model.maxBatchSize ? std::optional{ *model.maxBatchSize } : std::nullopt }, + m_secondsToLive{ model.secondsToLive ? std::optional{ *model.secondsToLive } : std::nullopt }, + m_segmentId{ SafeString(model.segmentId) } + { + SetModelPointers(); + } + + PFSegmentsGetPlayersInSegmentRequestWrapper(const PFSegmentsGetPlayersInSegmentRequestWrapper& src) : + PFSegmentsGetPlayersInSegmentRequestWrapper{ src.Model() } + { + } + + PFSegmentsGetPlayersInSegmentRequestWrapper(PFSegmentsGetPlayersInSegmentRequestWrapper&& src) : + PFSegmentsGetPlayersInSegmentRequestWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetPlayersInSegmentRequestWrapper& operator=(PFSegmentsGetPlayersInSegmentRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetPlayersInSegmentRequestWrapper() = default; + + friend void swap(PFSegmentsGetPlayersInSegmentRequestWrapper& lhs, PFSegmentsGetPlayersInSegmentRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_getProfilesAsync, rhs.m_getProfilesAsync); + swap(lhs.m_maxBatchSize, rhs.m_maxBatchSize); + swap(lhs.m_secondsToLive, rhs.m_secondsToLive); + swap(lhs.m_segmentId, rhs.m_segmentId); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetGetProfilesAsync(std::optional value) + { + m_getProfilesAsync = std::move(value); + this->m_model.getProfilesAsync = m_getProfilesAsync ? m_getProfilesAsync.operator->() : nullptr; + } + + void SetMaxBatchSize(std::optional value) + { + m_maxBatchSize = std::move(value); + this->m_model.maxBatchSize = m_maxBatchSize ? m_maxBatchSize.operator->() : nullptr; + } + + void SetSecondsToLive(std::optional value) + { + m_secondsToLive = std::move(value); + this->m_model.secondsToLive = m_secondsToLive ? m_secondsToLive.operator->() : nullptr; + } + + void SetSegmentId(String value) + { + m_segmentId = std::move(value); + this->m_model.segmentId = m_segmentId.empty() ? nullptr : m_segmentId.data(); + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.getProfilesAsync = m_getProfilesAsync ? m_getProfilesAsync.operator->() : nullptr; + this->m_model.maxBatchSize = m_maxBatchSize ? m_maxBatchSize.operator->() : nullptr; + this->m_model.secondsToLive = m_secondsToLive ? m_secondsToLive.operator->() : nullptr; + this->m_model.segmentId = m_segmentId.empty() ? nullptr : m_segmentId.data(); + } + + String m_continuationToken; + StringDictionaryEntryVector m_customTags; + std::optional m_getProfilesAsync; + std::optional m_maxBatchSize; + std::optional m_secondsToLive; + String m_segmentId; +}; + +template class Alloc = std::allocator> +class PFSegmentsAdCampaignAttributionWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsAdCampaignAttribution; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsAdCampaignAttributionWrapper() = default; + + PFSegmentsAdCampaignAttributionWrapper(const PFSegmentsAdCampaignAttribution& model) : + ModelWrapper{ model }, + m_campaignId{ SafeString(model.campaignId) }, + m_platform{ SafeString(model.platform) } + { + SetModelPointers(); + } + + PFSegmentsAdCampaignAttributionWrapper(const PFSegmentsAdCampaignAttributionWrapper& src) : + PFSegmentsAdCampaignAttributionWrapper{ src.Model() } + { + } + + PFSegmentsAdCampaignAttributionWrapper(PFSegmentsAdCampaignAttributionWrapper&& src) : + PFSegmentsAdCampaignAttributionWrapper{} + { + swap(*this, src); + } + + PFSegmentsAdCampaignAttributionWrapper& operator=(PFSegmentsAdCampaignAttributionWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsAdCampaignAttributionWrapper() = default; + + friend void swap(PFSegmentsAdCampaignAttributionWrapper& lhs, PFSegmentsAdCampaignAttributionWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_campaignId, rhs.m_campaignId); + swap(lhs.m_platform, rhs.m_platform); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAttributedAt(time_t value) + { + this->m_model.attributedAt = value; + } + + void SetCampaignId(String value) + { + m_campaignId = std::move(value); + this->m_model.campaignId = m_campaignId.empty() ? nullptr : m_campaignId.data(); + } + + void SetPlatform(String value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + } + +private: + void SetModelPointers() + { + this->m_model.campaignId = m_campaignId.empty() ? nullptr : m_campaignId.data(); + this->m_model.platform = m_platform.empty() ? nullptr : m_platform.data(); + } + + String m_campaignId; + String m_platform; +}; + +template class Alloc = std::allocator> +class PFSegmentsContactEmailInfoWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsContactEmailInfo; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsContactEmailInfoWrapper() = default; + + PFSegmentsContactEmailInfoWrapper(const PFSegmentsContactEmailInfo& model) : + ModelWrapper{ model }, + m_emailAddress{ SafeString(model.emailAddress) }, + m_name{ SafeString(model.name) }, + m_verificationStatus{ model.verificationStatus ? std::optional{ *model.verificationStatus } : std::nullopt } + { + SetModelPointers(); + } + + PFSegmentsContactEmailInfoWrapper(const PFSegmentsContactEmailInfoWrapper& src) : + PFSegmentsContactEmailInfoWrapper{ src.Model() } + { + } + + PFSegmentsContactEmailInfoWrapper(PFSegmentsContactEmailInfoWrapper&& src) : + PFSegmentsContactEmailInfoWrapper{} + { + swap(*this, src); + } + + PFSegmentsContactEmailInfoWrapper& operator=(PFSegmentsContactEmailInfoWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsContactEmailInfoWrapper() = default; + + friend void swap(PFSegmentsContactEmailInfoWrapper& lhs, PFSegmentsContactEmailInfoWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_emailAddress, rhs.m_emailAddress); + swap(lhs.m_name, rhs.m_name); + swap(lhs.m_verificationStatus, rhs.m_verificationStatus); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEmailAddress(String value) + { + m_emailAddress = std::move(value); + this->m_model.emailAddress = m_emailAddress.empty() ? nullptr : m_emailAddress.data(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetVerificationStatus(std::optional value) + { + m_verificationStatus = std::move(value); + this->m_model.verificationStatus = m_verificationStatus ? m_verificationStatus.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.emailAddress = m_emailAddress.empty() ? nullptr : m_emailAddress.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + this->m_model.verificationStatus = m_verificationStatus ? m_verificationStatus.operator->() : nullptr; + } + + String m_emailAddress; + String m_name; + std::optional m_verificationStatus; +}; + +template class Alloc = std::allocator> +class PFSegmentsPlayerLinkedAccountWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsPlayerLinkedAccount; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsPlayerLinkedAccountWrapper() = default; + + PFSegmentsPlayerLinkedAccountWrapper(const PFSegmentsPlayerLinkedAccount& model) : + ModelWrapper{ model }, + m_email{ SafeString(model.email) }, + m_platform{ model.platform ? std::optional{ *model.platform } : std::nullopt }, + m_platformUserId{ SafeString(model.platformUserId) }, + m_username{ SafeString(model.username) } + { + SetModelPointers(); + } + + PFSegmentsPlayerLinkedAccountWrapper(const PFSegmentsPlayerLinkedAccountWrapper& src) : + PFSegmentsPlayerLinkedAccountWrapper{ src.Model() } + { + } + + PFSegmentsPlayerLinkedAccountWrapper(PFSegmentsPlayerLinkedAccountWrapper&& src) : + PFSegmentsPlayerLinkedAccountWrapper{} + { + swap(*this, src); + } + + PFSegmentsPlayerLinkedAccountWrapper& operator=(PFSegmentsPlayerLinkedAccountWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsPlayerLinkedAccountWrapper() = default; + + friend void swap(PFSegmentsPlayerLinkedAccountWrapper& lhs, PFSegmentsPlayerLinkedAccountWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_email, rhs.m_email); + swap(lhs.m_platform, rhs.m_platform); + swap(lhs.m_platformUserId, rhs.m_platformUserId); + swap(lhs.m_username, rhs.m_username); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetEmail(String value) + { + m_email = std::move(value); + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + } + + void SetPlatform(std::optional value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + } + + void SetPlatformUserId(String value) + { + m_platformUserId = std::move(value); + this->m_model.platformUserId = m_platformUserId.empty() ? nullptr : m_platformUserId.data(); + } + + void SetUsername(String value) + { + m_username = std::move(value); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + +private: + void SetModelPointers() + { + this->m_model.email = m_email.empty() ? nullptr : m_email.data(); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + this->m_model.platformUserId = m_platformUserId.empty() ? nullptr : m_platformUserId.data(); + this->m_model.username = m_username.empty() ? nullptr : m_username.data(); + } + + String m_email; + std::optional m_platform; + String m_platformUserId; + String m_username; +}; + +template class Alloc = std::allocator> +class PFSegmentsPlayerLocationWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsPlayerLocation; + using DictionaryEntryType = PFSegmentsPlayerLocationDictionaryEntry; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsPlayerLocationWrapper() = default; + + PFSegmentsPlayerLocationWrapper(const PFSegmentsPlayerLocation& model) : + ModelWrapper{ model }, + m_city{ SafeString(model.city) }, + m_latitude{ model.latitude ? std::optional{ *model.latitude } : std::nullopt }, + m_longitude{ model.longitude ? std::optional{ *model.longitude } : std::nullopt } + { + SetModelPointers(); + } + + PFSegmentsPlayerLocationWrapper(const PFSegmentsPlayerLocationWrapper& src) : + PFSegmentsPlayerLocationWrapper{ src.Model() } + { + } + + PFSegmentsPlayerLocationWrapper(PFSegmentsPlayerLocationWrapper&& src) : + PFSegmentsPlayerLocationWrapper{} + { + swap(*this, src); + } + + PFSegmentsPlayerLocationWrapper& operator=(PFSegmentsPlayerLocationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsPlayerLocationWrapper() = default; + + friend void swap(PFSegmentsPlayerLocationWrapper& lhs, PFSegmentsPlayerLocationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_city, rhs.m_city); + swap(lhs.m_latitude, rhs.m_latitude); + swap(lhs.m_longitude, rhs.m_longitude); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCity(String value) + { + m_city = std::move(value); + this->m_model.city = m_city.empty() ? nullptr : m_city.data(); + } + + void SetContinentCode(PFContinentCode value) + { + this->m_model.continentCode = value; + } + + void SetCountryCode(PFCountryCode value) + { + this->m_model.countryCode = value; + } + + void SetLatitude(std::optional value) + { + m_latitude = std::move(value); + this->m_model.latitude = m_latitude ? m_latitude.operator->() : nullptr; + } + + void SetLongitude(std::optional value) + { + m_longitude = std::move(value); + this->m_model.longitude = m_longitude ? m_longitude.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.city = m_city.empty() ? nullptr : m_city.data(); + this->m_model.latitude = m_latitude ? m_latitude.operator->() : nullptr; + this->m_model.longitude = m_longitude ? m_longitude.operator->() : nullptr; + } + + String m_city; + std::optional m_latitude; + std::optional m_longitude; +}; + +template class Alloc = std::allocator> +class PFSegmentsPlayerStatisticWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsPlayerStatistic; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsPlayerStatisticWrapper() = default; + + PFSegmentsPlayerStatisticWrapper(const PFSegmentsPlayerStatistic& model) : + ModelWrapper{ model }, + m_id{ SafeString(model.id) }, + m_name{ SafeString(model.name) } + { + SetModelPointers(); + } + + PFSegmentsPlayerStatisticWrapper(const PFSegmentsPlayerStatisticWrapper& src) : + PFSegmentsPlayerStatisticWrapper{ src.Model() } + { + } + + PFSegmentsPlayerStatisticWrapper(PFSegmentsPlayerStatisticWrapper&& src) : + PFSegmentsPlayerStatisticWrapper{} + { + swap(*this, src); + } + + PFSegmentsPlayerStatisticWrapper& operator=(PFSegmentsPlayerStatisticWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsPlayerStatisticWrapper() = default; + + friend void swap(PFSegmentsPlayerStatisticWrapper& lhs, PFSegmentsPlayerStatisticWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_id, rhs.m_id); + swap(lhs.m_name, rhs.m_name); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetId(String value) + { + m_id = std::move(value); + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + } + + void SetName(String value) + { + m_name = std::move(value); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + void SetStatisticValue(int32_t value) + { + this->m_model.statisticValue = value; + } + + void SetStatisticVersion(int32_t value) + { + this->m_model.statisticVersion = value; + } + +private: + void SetModelPointers() + { + this->m_model.id = m_id.empty() ? nullptr : m_id.data(); + this->m_model.name = m_name.empty() ? nullptr : m_name.data(); + } + + String m_id; + String m_name; +}; + +template class Alloc = std::allocator> +class PFSegmentsPushNotificationRegistrationWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsPushNotificationRegistration; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsPushNotificationRegistrationWrapper() = default; + + PFSegmentsPushNotificationRegistrationWrapper(const PFSegmentsPushNotificationRegistration& model) : + ModelWrapper{ model }, + m_notificationEndpointARN{ SafeString(model.notificationEndpointARN) }, + m_platform{ model.platform ? std::optional{ *model.platform } : std::nullopt } + { + SetModelPointers(); + } + + PFSegmentsPushNotificationRegistrationWrapper(const PFSegmentsPushNotificationRegistrationWrapper& src) : + PFSegmentsPushNotificationRegistrationWrapper{ src.Model() } + { + } + + PFSegmentsPushNotificationRegistrationWrapper(PFSegmentsPushNotificationRegistrationWrapper&& src) : + PFSegmentsPushNotificationRegistrationWrapper{} + { + swap(*this, src); + } + + PFSegmentsPushNotificationRegistrationWrapper& operator=(PFSegmentsPushNotificationRegistrationWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsPushNotificationRegistrationWrapper() = default; + + friend void swap(PFSegmentsPushNotificationRegistrationWrapper& lhs, PFSegmentsPushNotificationRegistrationWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_notificationEndpointARN, rhs.m_notificationEndpointARN); + swap(lhs.m_platform, rhs.m_platform); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNotificationEndpointARN(String value) + { + m_notificationEndpointARN = std::move(value); + this->m_model.notificationEndpointARN = m_notificationEndpointARN.empty() ? nullptr : m_notificationEndpointARN.data(); + } + + void SetPlatform(std::optional value) + { + m_platform = std::move(value); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.notificationEndpointARN = m_notificationEndpointARN.empty() ? nullptr : m_notificationEndpointARN.data(); + this->m_model.platform = m_platform ? m_platform.operator->() : nullptr; + } + + String m_notificationEndpointARN; + std::optional m_platform; +}; + +template class Alloc = std::allocator> +class PFSegmentsPlayerProfileWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsPlayerProfile; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsPlayerProfileWrapper() = default; + + PFSegmentsPlayerProfileWrapper(const PFSegmentsPlayerProfile& model) : + ModelWrapper{ model }, + m_adCampaignAttributions{ model.adCampaignAttributions, model.adCampaignAttributions + model.adCampaignAttributionsCount }, + m_avatarUrl{ SafeString(model.avatarUrl) }, + m_bannedUntil{ model.bannedUntil ? std::optional{ *model.bannedUntil } : std::nullopt }, + m_churnPrediction{ model.churnPrediction ? std::optional{ *model.churnPrediction } : std::nullopt }, + m_contactEmailAddresses{ model.contactEmailAddresses, model.contactEmailAddresses + model.contactEmailAddressesCount }, + m_created{ model.created ? std::optional{ *model.created } : std::nullopt }, + m_displayName{ SafeString(model.displayName) }, + m_lastLogin{ model.lastLogin ? std::optional{ *model.lastLogin } : std::nullopt }, + m_linkedAccounts{ model.linkedAccounts, model.linkedAccounts + model.linkedAccountsCount }, + m_locations{ model.locations, model.locations + model.locationsCount }, + m_origination{ model.origination ? std::optional{ *model.origination } : std::nullopt }, + m_playerExperimentVariants{ model.playerExperimentVariants, model.playerExperimentVariants + model.playerExperimentVariantsCount }, + m_playerId{ SafeString(model.playerId) }, + m_playerStatistics{ model.playerStatistics, model.playerStatistics + model.playerStatisticsCount }, + m_publisherId{ SafeString(model.publisherId) }, + m_pushNotificationRegistrations{ model.pushNotificationRegistrations, model.pushNotificationRegistrations + model.pushNotificationRegistrationsCount }, + m_statistics{ model.statistics, model.statistics + model.statisticsCount }, + m_tags{ model.tags, model.tags + model.tagsCount }, + m_titleId{ SafeString(model.titleId) }, + m_totalValueToDateInUSD{ model.totalValueToDateInUSD ? std::optional{ *model.totalValueToDateInUSD } : std::nullopt }, + m_valuesToDate{ model.valuesToDate, model.valuesToDate + model.valuesToDateCount }, + m_virtualCurrencyBalances{ model.virtualCurrencyBalances, model.virtualCurrencyBalances + model.virtualCurrencyBalancesCount } + { + SetModelPointers(); + } + + PFSegmentsPlayerProfileWrapper(const PFSegmentsPlayerProfileWrapper& src) : + PFSegmentsPlayerProfileWrapper{ src.Model() } + { + } + + PFSegmentsPlayerProfileWrapper(PFSegmentsPlayerProfileWrapper&& src) : + PFSegmentsPlayerProfileWrapper{} + { + swap(*this, src); + } + + PFSegmentsPlayerProfileWrapper& operator=(PFSegmentsPlayerProfileWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsPlayerProfileWrapper() = default; + + friend void swap(PFSegmentsPlayerProfileWrapper& lhs, PFSegmentsPlayerProfileWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_adCampaignAttributions, rhs.m_adCampaignAttributions); + swap(lhs.m_avatarUrl, rhs.m_avatarUrl); + swap(lhs.m_bannedUntil, rhs.m_bannedUntil); + swap(lhs.m_churnPrediction, rhs.m_churnPrediction); + swap(lhs.m_contactEmailAddresses, rhs.m_contactEmailAddresses); + swap(lhs.m_created, rhs.m_created); + swap(lhs.m_displayName, rhs.m_displayName); + swap(lhs.m_lastLogin, rhs.m_lastLogin); + swap(lhs.m_linkedAccounts, rhs.m_linkedAccounts); + swap(lhs.m_locations, rhs.m_locations); + swap(lhs.m_origination, rhs.m_origination); + swap(lhs.m_playerExperimentVariants, rhs.m_playerExperimentVariants); + swap(lhs.m_playerId, rhs.m_playerId); + swap(lhs.m_playerStatistics, rhs.m_playerStatistics); + swap(lhs.m_publisherId, rhs.m_publisherId); + swap(lhs.m_pushNotificationRegistrations, rhs.m_pushNotificationRegistrations); + swap(lhs.m_statistics, rhs.m_statistics); + swap(lhs.m_tags, rhs.m_tags); + swap(lhs.m_titleId, rhs.m_titleId); + swap(lhs.m_totalValueToDateInUSD, rhs.m_totalValueToDateInUSD); + swap(lhs.m_valuesToDate, rhs.m_valuesToDate); + swap(lhs.m_virtualCurrencyBalances, rhs.m_virtualCurrencyBalances); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetAdCampaignAttributions(ModelVector, Alloc> value) + { + m_adCampaignAttributions = std::move(value); + this->m_model.adCampaignAttributions = m_adCampaignAttributions.empty() ? nullptr : m_adCampaignAttributions.data(); + this->m_model.adCampaignAttributionsCount = static_cast(m_adCampaignAttributions.size()); + } + + void SetAvatarUrl(String value) + { + m_avatarUrl = std::move(value); + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + } + + void SetBannedUntil(std::optional value) + { + m_bannedUntil = std::move(value); + this->m_model.bannedUntil = m_bannedUntil ? m_bannedUntil.operator->() : nullptr; + } + + void SetChurnPrediction(std::optional value) + { + m_churnPrediction = std::move(value); + this->m_model.churnPrediction = m_churnPrediction ? m_churnPrediction.operator->() : nullptr; + } + + void SetContactEmailAddresses(ModelVector, Alloc> value) + { + m_contactEmailAddresses = std::move(value); + this->m_model.contactEmailAddresses = m_contactEmailAddresses.empty() ? nullptr : m_contactEmailAddresses.data(); + this->m_model.contactEmailAddressesCount = static_cast(m_contactEmailAddresses.size()); + } + + void SetCreated(std::optional value) + { + m_created = std::move(value); + this->m_model.created = m_created ? m_created.operator->() : nullptr; + } + + void SetDisplayName(String value) + { + m_displayName = std::move(value); + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + } + + void SetLastLogin(std::optional value) + { + m_lastLogin = std::move(value); + this->m_model.lastLogin = m_lastLogin ? m_lastLogin.operator->() : nullptr; + } + + void SetLinkedAccounts(ModelVector, Alloc> value) + { + m_linkedAccounts = std::move(value); + this->m_model.linkedAccounts = m_linkedAccounts.empty() ? nullptr : m_linkedAccounts.data(); + this->m_model.linkedAccountsCount = static_cast(m_linkedAccounts.size()); + } + + void SetLocations(ModelDictionaryEntryVector, Alloc> value) + { + m_locations = std::move(value); + this->m_model.locations = m_locations.empty() ? nullptr : m_locations.data(); + this->m_model.locationsCount = static_cast(m_locations.size()); + } + + void SetOrigination(std::optional value) + { + m_origination = std::move(value); + this->m_model.origination = m_origination ? m_origination.operator->() : nullptr; + } + + void SetPlayerExperimentVariants(CStringVector value) + { + m_playerExperimentVariants = std::move(value); + this->m_model.playerExperimentVariants = m_playerExperimentVariants.empty() ? nullptr : m_playerExperimentVariants.data(); + this->m_model.playerExperimentVariantsCount = static_cast(m_playerExperimentVariants.size()); + } + + void SetPlayerId(String value) + { + m_playerId = std::move(value); + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + } + + void SetPlayerStatistics(ModelVector, Alloc> value) + { + m_playerStatistics = std::move(value); + this->m_model.playerStatistics = m_playerStatistics.empty() ? nullptr : m_playerStatistics.data(); + this->m_model.playerStatisticsCount = static_cast(m_playerStatistics.size()); + } + + void SetPublisherId(String value) + { + m_publisherId = std::move(value); + this->m_model.publisherId = m_publisherId.empty() ? nullptr : m_publisherId.data(); + } + + void SetPushNotificationRegistrations(ModelVector, Alloc> value) + { + m_pushNotificationRegistrations = std::move(value); + this->m_model.pushNotificationRegistrations = m_pushNotificationRegistrations.empty() ? nullptr : m_pushNotificationRegistrations.data(); + this->m_model.pushNotificationRegistrationsCount = static_cast(m_pushNotificationRegistrations.size()); + } + + void SetStatistics(DictionaryEntryVector value) + { + m_statistics = std::move(value); + this->m_model.statistics = m_statistics.empty() ? nullptr : m_statistics.data(); + this->m_model.statisticsCount = static_cast(m_statistics.size()); + } + + void SetTags(CStringVector value) + { + m_tags = std::move(value); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.tagsCount = static_cast(m_tags.size()); + } + + void SetTitleId(String value) + { + m_titleId = std::move(value); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + } + + void SetTotalValueToDateInUSD(std::optional value) + { + m_totalValueToDateInUSD = std::move(value); + this->m_model.totalValueToDateInUSD = m_totalValueToDateInUSD ? m_totalValueToDateInUSD.operator->() : nullptr; + } + + void SetValuesToDate(DictionaryEntryVector value) + { + m_valuesToDate = std::move(value); + this->m_model.valuesToDate = m_valuesToDate.empty() ? nullptr : m_valuesToDate.data(); + this->m_model.valuesToDateCount = static_cast(m_valuesToDate.size()); + } + + void SetVirtualCurrencyBalances(DictionaryEntryVector value) + { + m_virtualCurrencyBalances = std::move(value); + this->m_model.virtualCurrencyBalances = m_virtualCurrencyBalances.empty() ? nullptr : m_virtualCurrencyBalances.data(); + this->m_model.virtualCurrencyBalancesCount = static_cast(m_virtualCurrencyBalances.size()); + } + +private: + void SetModelPointers() + { + this->m_model.adCampaignAttributions = m_adCampaignAttributions.empty() ? nullptr : m_adCampaignAttributions.data(); + this->m_model.avatarUrl = m_avatarUrl.empty() ? nullptr : m_avatarUrl.data(); + this->m_model.bannedUntil = m_bannedUntil ? m_bannedUntil.operator->() : nullptr; + this->m_model.churnPrediction = m_churnPrediction ? m_churnPrediction.operator->() : nullptr; + this->m_model.contactEmailAddresses = m_contactEmailAddresses.empty() ? nullptr : m_contactEmailAddresses.data(); + this->m_model.created = m_created ? m_created.operator->() : nullptr; + this->m_model.displayName = m_displayName.empty() ? nullptr : m_displayName.data(); + this->m_model.lastLogin = m_lastLogin ? m_lastLogin.operator->() : nullptr; + this->m_model.linkedAccounts = m_linkedAccounts.empty() ? nullptr : m_linkedAccounts.data(); + this->m_model.locations = m_locations.empty() ? nullptr : m_locations.data(); + this->m_model.origination = m_origination ? m_origination.operator->() : nullptr; + this->m_model.playerExperimentVariants = m_playerExperimentVariants.empty() ? nullptr : m_playerExperimentVariants.data(); + this->m_model.playerId = m_playerId.empty() ? nullptr : m_playerId.data(); + this->m_model.playerStatistics = m_playerStatistics.empty() ? nullptr : m_playerStatistics.data(); + this->m_model.publisherId = m_publisherId.empty() ? nullptr : m_publisherId.data(); + this->m_model.pushNotificationRegistrations = m_pushNotificationRegistrations.empty() ? nullptr : m_pushNotificationRegistrations.data(); + this->m_model.statistics = m_statistics.empty() ? nullptr : m_statistics.data(); + this->m_model.tags = m_tags.empty() ? nullptr : m_tags.data(); + this->m_model.titleId = m_titleId.empty() ? nullptr : m_titleId.data(); + this->m_model.totalValueToDateInUSD = m_totalValueToDateInUSD ? m_totalValueToDateInUSD.operator->() : nullptr; + this->m_model.valuesToDate = m_valuesToDate.empty() ? nullptr : m_valuesToDate.data(); + this->m_model.virtualCurrencyBalances = m_virtualCurrencyBalances.empty() ? nullptr : m_virtualCurrencyBalances.data(); + } + + ModelVector, Alloc> m_adCampaignAttributions; + String m_avatarUrl; + std::optional m_bannedUntil; + std::optional m_churnPrediction; + ModelVector, Alloc> m_contactEmailAddresses; + std::optional m_created; + String m_displayName; + std::optional m_lastLogin; + ModelVector, Alloc> m_linkedAccounts; + ModelDictionaryEntryVector, Alloc> m_locations; + std::optional m_origination; + CStringVector m_playerExperimentVariants; + String m_playerId; + ModelVector, Alloc> m_playerStatistics; + String m_publisherId; + ModelVector, Alloc> m_pushNotificationRegistrations; + DictionaryEntryVector m_statistics; + CStringVector m_tags; + String m_titleId; + std::optional m_totalValueToDateInUSD; + DictionaryEntryVector m_valuesToDate; + DictionaryEntryVector m_virtualCurrencyBalances; +}; + +template class Alloc = std::allocator> +class PFSegmentsGetPlayersInSegmentResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsGetPlayersInSegmentResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsGetPlayersInSegmentResultWrapper() = default; + + PFSegmentsGetPlayersInSegmentResultWrapper(const PFSegmentsGetPlayersInSegmentResult& model) : + ModelWrapper{ model }, + m_continuationToken{ SafeString(model.continuationToken) }, + m_playerProfiles{ model.playerProfiles, model.playerProfiles + model.playerProfilesCount } + { + SetModelPointers(); + } + + PFSegmentsGetPlayersInSegmentResultWrapper(const PFSegmentsGetPlayersInSegmentResultWrapper& src) : + PFSegmentsGetPlayersInSegmentResultWrapper{ src.Model() } + { + } + + PFSegmentsGetPlayersInSegmentResultWrapper(PFSegmentsGetPlayersInSegmentResultWrapper&& src) : + PFSegmentsGetPlayersInSegmentResultWrapper{} + { + swap(*this, src); + } + + PFSegmentsGetPlayersInSegmentResultWrapper& operator=(PFSegmentsGetPlayersInSegmentResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsGetPlayersInSegmentResultWrapper() = default; + + friend void swap(PFSegmentsGetPlayersInSegmentResultWrapper& lhs, PFSegmentsGetPlayersInSegmentResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_continuationToken, rhs.m_continuationToken); + swap(lhs.m_playerProfiles, rhs.m_playerProfiles); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetContinuationToken(String value) + { + m_continuationToken = std::move(value); + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + } + + void SetPlayerProfiles(ModelVector, Alloc> value) + { + m_playerProfiles = std::move(value); + this->m_model.playerProfiles = m_playerProfiles.empty() ? nullptr : m_playerProfiles.data(); + this->m_model.playerProfilesCount = static_cast(m_playerProfiles.size()); + } + + void SetProfilesInSegment(int32_t value) + { + this->m_model.profilesInSegment = value; + } + +private: + void SetModelPointers() + { + this->m_model.continuationToken = m_continuationToken.empty() ? nullptr : m_continuationToken.data(); + this->m_model.playerProfiles = m_playerProfiles.empty() ? nullptr : m_playerProfiles.data(); + } + + String m_continuationToken; + ModelVector, Alloc> m_playerProfiles; +}; + +template class Alloc = std::allocator> +class PFSegmentsRemovePlayerTagRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFSegmentsRemovePlayerTagRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFSegmentsRemovePlayerTagRequestWrapper() = default; + + PFSegmentsRemovePlayerTagRequestWrapper(const PFSegmentsRemovePlayerTagRequest& model) : + ModelWrapper{ model }, + m_customTags{ model.customTags, model.customTags + model.customTagsCount }, + m_playFabId{ SafeString(model.playFabId) }, + m_tagName{ SafeString(model.tagName) } + { + SetModelPointers(); + } + + PFSegmentsRemovePlayerTagRequestWrapper(const PFSegmentsRemovePlayerTagRequestWrapper& src) : + PFSegmentsRemovePlayerTagRequestWrapper{ src.Model() } + { + } + + PFSegmentsRemovePlayerTagRequestWrapper(PFSegmentsRemovePlayerTagRequestWrapper&& src) : + PFSegmentsRemovePlayerTagRequestWrapper{} + { + swap(*this, src); + } + + PFSegmentsRemovePlayerTagRequestWrapper& operator=(PFSegmentsRemovePlayerTagRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFSegmentsRemovePlayerTagRequestWrapper() = default; + + friend void swap(PFSegmentsRemovePlayerTagRequestWrapper& lhs, PFSegmentsRemovePlayerTagRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_customTags, rhs.m_customTags); + swap(lhs.m_playFabId, rhs.m_playFabId); + swap(lhs.m_tagName, rhs.m_tagName); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCustomTags(StringDictionaryEntryVector value) + { + m_customTags = std::move(value); + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.customTagsCount = static_cast(m_customTags.size()); + } + + void SetPlayFabId(String value) + { + m_playFabId = std::move(value); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + } + + void SetTagName(String value) + { + m_tagName = std::move(value); + this->m_model.tagName = m_tagName.empty() ? nullptr : m_tagName.data(); + } + +private: + void SetModelPointers() + { + this->m_model.customTags = m_customTags.empty() ? nullptr : m_customTags.data(); + this->m_model.playFabId = m_playFabId.empty() ? nullptr : m_playFabId.data(); + this->m_model.tagName = m_tagName.empty() ? nullptr : m_tagName.data(); + } + + StringDictionaryEntryVector m_customTags; + String m_playFabId; + String m_tagName; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/TitleDataManagementTypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/TitleDataManagementTypeWrappers.h new file mode 100644 index 0000000..2ea58ba --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/TitleDataManagementTypeWrappers.h @@ -0,0 +1,637 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +template class Alloc = std::allocator> +class PFTitleDataManagementGetPublisherDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementGetPublisherDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementGetPublisherDataRequestWrapper() = default; + + PFTitleDataManagementGetPublisherDataRequestWrapper(const PFTitleDataManagementGetPublisherDataRequest& model) : + ModelWrapper{ model }, + m_keys{ model.keys, model.keys + model.keysCount } + { + SetModelPointers(); + } + + PFTitleDataManagementGetPublisherDataRequestWrapper(const PFTitleDataManagementGetPublisherDataRequestWrapper& src) : + PFTitleDataManagementGetPublisherDataRequestWrapper{ src.Model() } + { + } + + PFTitleDataManagementGetPublisherDataRequestWrapper(PFTitleDataManagementGetPublisherDataRequestWrapper&& src) : + PFTitleDataManagementGetPublisherDataRequestWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementGetPublisherDataRequestWrapper& operator=(PFTitleDataManagementGetPublisherDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementGetPublisherDataRequestWrapper() = default; + + friend void swap(PFTitleDataManagementGetPublisherDataRequestWrapper& lhs, PFTitleDataManagementGetPublisherDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_keys, rhs.m_keys); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKeys(CStringVector value) + { + m_keys = std::move(value); + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + this->m_model.keysCount = static_cast(m_keys.size()); + } + +private: + void SetModelPointers() + { + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + } + + CStringVector m_keys; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementGetPublisherDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementGetPublisherDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementGetPublisherDataResultWrapper() = default; + + PFTitleDataManagementGetPublisherDataResultWrapper(const PFTitleDataManagementGetPublisherDataResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFTitleDataManagementGetPublisherDataResultWrapper(const PFTitleDataManagementGetPublisherDataResultWrapper& src) : + PFTitleDataManagementGetPublisherDataResultWrapper{ src.Model() } + { + } + + PFTitleDataManagementGetPublisherDataResultWrapper(PFTitleDataManagementGetPublisherDataResultWrapper&& src) : + PFTitleDataManagementGetPublisherDataResultWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementGetPublisherDataResultWrapper& operator=(PFTitleDataManagementGetPublisherDataResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementGetPublisherDataResultWrapper() = default; + + friend void swap(PFTitleDataManagementGetPublisherDataResultWrapper& lhs, PFTitleDataManagementGetPublisherDataResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(StringDictionaryEntryVector value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + StringDictionaryEntryVector m_data; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementGetTimeResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementGetTimeResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + using ModelWrapper::ModelWrapper; + + void SetTime(time_t value) + { + this->m_model.time = value; + } + +private: +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementGetTitleDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementGetTitleDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementGetTitleDataRequestWrapper() = default; + + PFTitleDataManagementGetTitleDataRequestWrapper(const PFTitleDataManagementGetTitleDataRequest& model) : + ModelWrapper{ model }, + m_keys{ model.keys, model.keys + model.keysCount }, + m_overrideLabel{ SafeString(model.overrideLabel) } + { + SetModelPointers(); + } + + PFTitleDataManagementGetTitleDataRequestWrapper(const PFTitleDataManagementGetTitleDataRequestWrapper& src) : + PFTitleDataManagementGetTitleDataRequestWrapper{ src.Model() } + { + } + + PFTitleDataManagementGetTitleDataRequestWrapper(PFTitleDataManagementGetTitleDataRequestWrapper&& src) : + PFTitleDataManagementGetTitleDataRequestWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementGetTitleDataRequestWrapper& operator=(PFTitleDataManagementGetTitleDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementGetTitleDataRequestWrapper() = default; + + friend void swap(PFTitleDataManagementGetTitleDataRequestWrapper& lhs, PFTitleDataManagementGetTitleDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_keys, rhs.m_keys); + swap(lhs.m_overrideLabel, rhs.m_overrideLabel); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKeys(CStringVector value) + { + m_keys = std::move(value); + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + this->m_model.keysCount = static_cast(m_keys.size()); + } + + void SetOverrideLabel(String value) + { + m_overrideLabel = std::move(value); + this->m_model.overrideLabel = m_overrideLabel.empty() ? nullptr : m_overrideLabel.data(); + } + +private: + void SetModelPointers() + { + this->m_model.keys = m_keys.empty() ? nullptr : m_keys.data(); + this->m_model.overrideLabel = m_overrideLabel.empty() ? nullptr : m_overrideLabel.data(); + } + + CStringVector m_keys; + String m_overrideLabel; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementGetTitleDataResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementGetTitleDataResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementGetTitleDataResultWrapper() = default; + + PFTitleDataManagementGetTitleDataResultWrapper(const PFTitleDataManagementGetTitleDataResult& model) : + ModelWrapper{ model }, + m_data{ model.data, model.data + model.dataCount } + { + SetModelPointers(); + } + + PFTitleDataManagementGetTitleDataResultWrapper(const PFTitleDataManagementGetTitleDataResultWrapper& src) : + PFTitleDataManagementGetTitleDataResultWrapper{ src.Model() } + { + } + + PFTitleDataManagementGetTitleDataResultWrapper(PFTitleDataManagementGetTitleDataResultWrapper&& src) : + PFTitleDataManagementGetTitleDataResultWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementGetTitleDataResultWrapper& operator=(PFTitleDataManagementGetTitleDataResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementGetTitleDataResultWrapper() = default; + + friend void swap(PFTitleDataManagementGetTitleDataResultWrapper& lhs, PFTitleDataManagementGetTitleDataResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_data, rhs.m_data); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetData(StringDictionaryEntryVector value) + { + m_data = std::move(value); + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + this->m_model.dataCount = static_cast(m_data.size()); + } + +private: + void SetModelPointers() + { + this->m_model.data = m_data.empty() ? nullptr : m_data.data(); + } + + StringDictionaryEntryVector m_data; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementGetTitleNewsRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementGetTitleNewsRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementGetTitleNewsRequestWrapper() = default; + + PFTitleDataManagementGetTitleNewsRequestWrapper(const PFTitleDataManagementGetTitleNewsRequest& model) : + ModelWrapper{ model }, + m_count{ model.count ? std::optional{ *model.count } : std::nullopt } + { + SetModelPointers(); + } + + PFTitleDataManagementGetTitleNewsRequestWrapper(const PFTitleDataManagementGetTitleNewsRequestWrapper& src) : + PFTitleDataManagementGetTitleNewsRequestWrapper{ src.Model() } + { + } + + PFTitleDataManagementGetTitleNewsRequestWrapper(PFTitleDataManagementGetTitleNewsRequestWrapper&& src) : + PFTitleDataManagementGetTitleNewsRequestWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementGetTitleNewsRequestWrapper& operator=(PFTitleDataManagementGetTitleNewsRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementGetTitleNewsRequestWrapper() = default; + + friend void swap(PFTitleDataManagementGetTitleNewsRequestWrapper& lhs, PFTitleDataManagementGetTitleNewsRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_count, rhs.m_count); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetCount(std::optional value) + { + m_count = std::move(value); + this->m_model.count = m_count ? m_count.operator->() : nullptr; + } + +private: + void SetModelPointers() + { + this->m_model.count = m_count ? m_count.operator->() : nullptr; + } + + std::optional m_count; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementTitleNewsItemWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementTitleNewsItem; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementTitleNewsItemWrapper() = default; + + PFTitleDataManagementTitleNewsItemWrapper(const PFTitleDataManagementTitleNewsItem& model) : + ModelWrapper{ model }, + m_body{ SafeString(model.body) }, + m_newsId{ SafeString(model.newsId) }, + m_title{ SafeString(model.title) } + { + SetModelPointers(); + } + + PFTitleDataManagementTitleNewsItemWrapper(const PFTitleDataManagementTitleNewsItemWrapper& src) : + PFTitleDataManagementTitleNewsItemWrapper{ src.Model() } + { + } + + PFTitleDataManagementTitleNewsItemWrapper(PFTitleDataManagementTitleNewsItemWrapper&& src) : + PFTitleDataManagementTitleNewsItemWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementTitleNewsItemWrapper& operator=(PFTitleDataManagementTitleNewsItemWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementTitleNewsItemWrapper() = default; + + friend void swap(PFTitleDataManagementTitleNewsItemWrapper& lhs, PFTitleDataManagementTitleNewsItemWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_body, rhs.m_body); + swap(lhs.m_newsId, rhs.m_newsId); + swap(lhs.m_title, rhs.m_title); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetBody(String value) + { + m_body = std::move(value); + this->m_model.body = m_body.empty() ? nullptr : m_body.data(); + } + + void SetNewsId(String value) + { + m_newsId = std::move(value); + this->m_model.newsId = m_newsId.empty() ? nullptr : m_newsId.data(); + } + + void SetTimestamp(time_t value) + { + this->m_model.timestamp = value; + } + + void SetTitle(String value) + { + m_title = std::move(value); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + } + +private: + void SetModelPointers() + { + this->m_model.body = m_body.empty() ? nullptr : m_body.data(); + this->m_model.newsId = m_newsId.empty() ? nullptr : m_newsId.data(); + this->m_model.title = m_title.empty() ? nullptr : m_title.data(); + } + + String m_body; + String m_newsId; + String m_title; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementGetTitleNewsResultWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementGetTitleNewsResult; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementGetTitleNewsResultWrapper() = default; + + PFTitleDataManagementGetTitleNewsResultWrapper(const PFTitleDataManagementGetTitleNewsResult& model) : + ModelWrapper{ model }, + m_news{ model.news, model.news + model.newsCount } + { + SetModelPointers(); + } + + PFTitleDataManagementGetTitleNewsResultWrapper(const PFTitleDataManagementGetTitleNewsResultWrapper& src) : + PFTitleDataManagementGetTitleNewsResultWrapper{ src.Model() } + { + } + + PFTitleDataManagementGetTitleNewsResultWrapper(PFTitleDataManagementGetTitleNewsResultWrapper&& src) : + PFTitleDataManagementGetTitleNewsResultWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementGetTitleNewsResultWrapper& operator=(PFTitleDataManagementGetTitleNewsResultWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementGetTitleNewsResultWrapper() = default; + + friend void swap(PFTitleDataManagementGetTitleNewsResultWrapper& lhs, PFTitleDataManagementGetTitleNewsResultWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_news, rhs.m_news); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetNews(ModelVector, Alloc> value) + { + m_news = std::move(value); + this->m_model.news = m_news.empty() ? nullptr : m_news.data(); + this->m_model.newsCount = static_cast(m_news.size()); + } + +private: + void SetModelPointers() + { + this->m_model.news = m_news.empty() ? nullptr : m_news.data(); + } + + ModelVector, Alloc> m_news; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementSetPublisherDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementSetPublisherDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementSetPublisherDataRequestWrapper() = default; + + PFTitleDataManagementSetPublisherDataRequestWrapper(const PFTitleDataManagementSetPublisherDataRequest& model) : + ModelWrapper{ model }, + m_key{ SafeString(model.key) }, + m_value{ SafeString(model.value) } + { + SetModelPointers(); + } + + PFTitleDataManagementSetPublisherDataRequestWrapper(const PFTitleDataManagementSetPublisherDataRequestWrapper& src) : + PFTitleDataManagementSetPublisherDataRequestWrapper{ src.Model() } + { + } + + PFTitleDataManagementSetPublisherDataRequestWrapper(PFTitleDataManagementSetPublisherDataRequestWrapper&& src) : + PFTitleDataManagementSetPublisherDataRequestWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementSetPublisherDataRequestWrapper& operator=(PFTitleDataManagementSetPublisherDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementSetPublisherDataRequestWrapper() = default; + + friend void swap(PFTitleDataManagementSetPublisherDataRequestWrapper& lhs, PFTitleDataManagementSetPublisherDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_key, rhs.m_key); + swap(lhs.m_value, rhs.m_value); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKey(String value) + { + m_key = std::move(value); + this->m_model.key = m_key.empty() ? nullptr : m_key.data(); + } + + void SetValue(String value) + { + m_value = std::move(value); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + +private: + void SetModelPointers() + { + this->m_model.key = m_key.empty() ? nullptr : m_key.data(); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + + String m_key; + String m_value; +}; + +template class Alloc = std::allocator> +class PFTitleDataManagementSetTitleDataRequestWrapper : public ModelWrapper +{ +public: + using ModelType = PFTitleDataManagementSetTitleDataRequest; + using String = typename std::basic_string, Alloc>; + template using Vector = typename std::vector>; + + PFTitleDataManagementSetTitleDataRequestWrapper() = default; + + PFTitleDataManagementSetTitleDataRequestWrapper(const PFTitleDataManagementSetTitleDataRequest& model) : + ModelWrapper{ model }, + m_key{ SafeString(model.key) }, + m_value{ SafeString(model.value) } + { + SetModelPointers(); + } + + PFTitleDataManagementSetTitleDataRequestWrapper(const PFTitleDataManagementSetTitleDataRequestWrapper& src) : + PFTitleDataManagementSetTitleDataRequestWrapper{ src.Model() } + { + } + + PFTitleDataManagementSetTitleDataRequestWrapper(PFTitleDataManagementSetTitleDataRequestWrapper&& src) : + PFTitleDataManagementSetTitleDataRequestWrapper{} + { + swap(*this, src); + } + + PFTitleDataManagementSetTitleDataRequestWrapper& operator=(PFTitleDataManagementSetTitleDataRequestWrapper src) + { + swap(*this, src); + return *this; + } + + virtual ~PFTitleDataManagementSetTitleDataRequestWrapper() = default; + + friend void swap(PFTitleDataManagementSetTitleDataRequestWrapper& lhs, PFTitleDataManagementSetTitleDataRequestWrapper& rhs) + { + using std::swap; + swap(lhs.m_model, rhs.m_model); + swap(lhs.m_key, rhs.m_key); + swap(lhs.m_value, rhs.m_value); + lhs.SetModelPointers(); + rhs.SetModelPointers(); + } + + void SetKey(String value) + { + m_key = std::move(value); + this->m_model.key = m_key.empty() ? nullptr : m_key.data(); + } + + void SetValue(String value) + { + m_value = std::move(value); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + +private: + void SetModelPointers() + { + this->m_model.key = m_key.empty() ? nullptr : m_key.data(); + this->m_model.value = m_value.empty() ? nullptr : m_value.data(); + } + + String m_key; + String m_value; +}; + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Include/Generated/playfab/services/cpp/TypeWrappers.h b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/TypeWrappers.h new file mode 100644 index 0000000..9543efe --- /dev/null +++ b/Source/PlayFabServices/Include/Generated/playfab/services/cpp/TypeWrappers.h @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +} // namespace Wrappers +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Api/PFServices.cpp b/Source/PlayFabServices/Source/Api/PFServices.cpp new file mode 100644 index 0000000..ce95729 --- /dev/null +++ b/Source/PlayFabServices/Source/Api/PFServices.cpp @@ -0,0 +1,22 @@ +#include "stdafx.h" +#include +#include "GlobalState.h" + +using namespace PlayFab; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFServicesInitialize( + _In_opt_ XTaskQueueHandle backgroundQueue +) noexcept +{ + UNREFERENCED_PARAMETER(backgroundQueue); + return GlobalState::Create(nullptr); +} +#endif + +PF_API PFServicesUninitializeAsync( + _In_ XAsyncBlock* async +) noexcept +{ + return GlobalState::CleanupAsync(async); +} diff --git a/Source/PlayFabServices/Source/Common/GlobalState.cpp b/Source/PlayFabServices/Source/Common/GlobalState.cpp new file mode 100644 index 0000000..d09c471 --- /dev/null +++ b/Source/PlayFabServices/Source/Common/GlobalState.cpp @@ -0,0 +1,233 @@ +#include "stdafx.h" +#include "GlobalState.h" +#include "Platform.h" + +/// +/// Internal PFCore function to enable PFServices's init to also init'd PFCore with HCInitArgs on demand as needed +/// +PF_API PFInitializeWithLHC( + _In_opt_ XTaskQueueHandle backgroundQueue, + _In_ HCInitArgs* args +) noexcept; + +namespace PlayFab +{ + +enum class AccessMode +{ + Initialize, + Get, + Cleanup +}; + +HRESULT ServicesAccessGlobalState(AccessMode mode, SharedPtr& state) +{ + struct GlobalStateHolder + { + SharedPtr const state; + }; + + static std::atomic s_globalStateHolder{ nullptr }; + assert(s_globalStateHolder.is_lock_free()); + + try + { + switch (mode) + { + case AccessMode::Initialize: + { + RETURN_HR_INVALIDARG_IF_NULL(state); + + UniquePtr stateHolder{ new (Allocator{}.allocate(1)) GlobalStateHolder{ state } }; + + GlobalStateHolder* expected{ nullptr }; + if (!s_globalStateHolder.compare_exchange_strong(expected, stateHolder.get())) + { + return E_PF_SERVICES_ALREADY_INITIALIZED; + } + + stateHolder.release(); // reclaimed via AccessMode::Cleanup + + return S_OK; + } + case AccessMode::Get: + { + GlobalStateHolder* stateHolder = s_globalStateHolder.load(); + + RETURN_HR_IF(E_PF_SERVICES_NOT_INITIALIZED, !stateHolder); + assert(stateHolder->state); + state = stateHolder->state; + + return S_OK; + } + case AccessMode::Cleanup: + { + UniquePtr stateHolder{ s_globalStateHolder.exchange(nullptr) }; + + RETURN_HR_IF(E_PF_SERVICES_NOT_INITIALIZED, !stateHolder); + state = stateHolder->state; + + return S_OK; + } + default: + { + assert(false); + return E_UNEXPECTED; + } + } + } + catch (...) + { + return CurrentExceptionToHR(); + } +} + +GlobalState::GlobalState(bool uninitPlayFabCore) noexcept : + m_runContext{ RunContext::Root(nullptr) }, // No background work for Services SDK currently + m_uninitPlayFabCore{ uninitPlayFabCore } +{ + TRACE_VERBOSE("PlayFabServices::GlobalState::GlobalState"); +} + +GlobalState::~GlobalState() noexcept +{ + TRACE_VERBOSE("PlayFabServices::GlobalState::~GlobalState"); +} + +HRESULT GlobalState::Create(_In_opt_ HCInitArgs* args) noexcept +{ + // Before creating global state, initialize platform hooks + RETURN_IF_FAILED(PlayFab::InitializePlatformHooks()); + + // As a convenience, initialize PFCore on behalf of the title if they haven't done so already. + // This does mean that the title sacrifices the ability to provide a XTaskQueue for PFCore background work, + // but it makes some golden path scenarios more streamlined if they don't need that level of control. + HRESULT hr = PFInitializeWithLHC(nullptr, args); + RETURN_HR_IF(hr, FAILED(hr) && hr != E_PF_CORE_ALREADY_INITIALIZED); + + Allocator a{}; + auto state = SharedPtr{ new (a.allocate(1)) GlobalState{ SUCCEEDED(hr) }, Deleter(), a}; + return ServicesAccessGlobalState(AccessMode::Initialize, state); +} + +HRESULT GlobalState::Get(SharedPtr& state) noexcept +{ + return ServicesAccessGlobalState(AccessMode::Get, state); +} + +struct CleanupContext +{ + SharedPtr state; + XAsyncBlock pfCoreCleanupAsyncBlock{}; + XAsyncBlock* clientAsyncBlock{}; +}; + +HRESULT GlobalState::CleanupAsync(XAsyncBlock* async) noexcept +{ + try + { + TRACE_VERBOSE("PlayFabServices::GlobalState::CleanupAsync"); + + UniquePtr context = MakeUnique(); + RETURN_IF_FAILED(XAsyncBegin(async, context.get(), __FUNCTION__, __FUNCTION__, CleanupAsyncProvider)); + context.release(); + return S_OK; + } + catch (...) + { + return CurrentExceptionToHR(); + } +} + +HRESULT CALLBACK GlobalState::CleanupAsyncProvider(XAsyncOp op, XAsyncProviderData const* data) +{ + CleanupContext* context{ static_cast(data->context) }; + + switch (op) + { + case XAsyncOp::Begin: + try + { + TRACE_VERBOSE("PlayFabServices::GlobalState::CleanupAsyncProvider::Begin"); + + RETURN_IF_FAILED(ServicesAccessGlobalState(AccessMode::Cleanup, context->state)); + context->clientAsyncBlock = data->async; + + context->state->m_runContext.Terminate(*context->state, context); + return S_OK; + } + catch (...) + { + return CurrentExceptionToHR(); + } + default: + { + return S_OK; + } + } +} + +void CALLBACK PFUninitializeComplete(XAsyncBlock* async) +{ + TRACE_VERBOSE(__FUNCTION__); + + UniquePtr context{ static_cast(async->context) }; + XAsyncBlock* asyncBlock{ context->clientAsyncBlock }; // Keep copy of asyncBlock pointer to complete after cleaning up context + + HRESULT hr = XAsyncGetStatus(async, true); + + // Free CleanupContext + context.reset(); + + // GlobalState::Cleanup complete! + XAsyncComplete(asyncBlock, hr, 0); +} + +void GlobalState::OnTerminated(void* c) noexcept +{ + TRACE_VERBOSE(__FUNCTION__); + + UniquePtr context{ static_cast(c) }; + XAsyncBlock* asyncBlock{ context->clientAsyncBlock }; // Keep copy of asyncBlock pointer to complete after cleaning up context + + if (context->state->m_uninitPlayFabCore) + { + // Free GlobalState before calling PFUninitializeAsync - 'this' will be destroyed here + context->state.reset(); + + // Uninitialize PlayFab Core + context->pfCoreCleanupAsyncBlock.callback = PFUninitializeComplete; + context->pfCoreCleanupAsyncBlock.queue = context->clientAsyncBlock->queue; // Should use derived queue + context->pfCoreCleanupAsyncBlock.context = context.get(); + + HRESULT hr = PFUninitializeAsync(&context->pfCoreCleanupAsyncBlock); + if (FAILED(hr)) + { + // We never expect this to fail, but complete cleanup if it does + assert(false); + + // Free CleanupContext + context.reset(); + + // Complete GlobalState::Cleanup with failure + XAsyncComplete(asyncBlock, hr, 0); + + return; + } + + context.release(); + } + else + { + // Cleanup complete. Flow returns to client now + context.reset(); + XAsyncComplete(asyncBlock, S_OK, 0); + } +} + +RunContext GlobalState::RunContext() const noexcept +{ + return m_runContext; +} + +} diff --git a/Source/PlayFabServices/Source/Common/GlobalState.h b/Source/PlayFabServices/Source/Common/GlobalState.h new file mode 100644 index 0000000..ddceb71 --- /dev/null +++ b/Source/PlayFabServices/Source/Common/GlobalState.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include "HttpClient.h" + +// Forward declaration of HCInitArgs +struct HCInitArgs; + +namespace PlayFab +{ + +class GlobalState : public ITerminationListener +{ +public: + virtual ~GlobalState() noexcept; + + static HRESULT Create(_In_opt_ HCInitArgs* args) noexcept; + static HRESULT Get(SharedPtr& state) noexcept; + static HRESULT CleanupAsync(XAsyncBlock* async) noexcept; + +public: + RunContext RunContext() const noexcept; + +private: + GlobalState(bool uninitPlayFabCore) noexcept; + + void OnTerminated(void* context) noexcept override; + static HRESULT CALLBACK CleanupAsyncProvider(XAsyncOp op, XAsyncProviderData const* data); + + PlayFab::RunContext m_runContext; + bool m_uninitPlayFabCore{ false }; +}; + +} diff --git a/Source/PlayFabServices/Source/Common/HttpClient.cpp b/Source/PlayFabServices/Source/Common/HttpClient.cpp new file mode 100644 index 0000000..b59d9c6 --- /dev/null +++ b/Source/PlayFabServices/Source/Common/HttpClient.cpp @@ -0,0 +1,169 @@ +#include "stdafx.h" +#include "HttpClient.h" +#include "HttpRequest.h" +#include "JsonUtils.h" +#include "SdkVersion.h" +#include "XAsyncOperation.h" + +namespace PlayFab +{ + +class GetEntityTokenOperation : public XAsyncOperation +{ +public: + GetEntityTokenOperation(Entity const& entity, PlayFab::RunContext&& runContext) noexcept; + ~GetEntityTokenOperation() = default; + +private: + // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity const m_entity; +}; + +ServicesHttpClient::ServicesHttpClient() +{ +} + +String ServicesHttpClient::GetUrl(String const& connectionString, const char* path) +{ + Stringstream fullUrl; + fullUrl << connectionString; + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return fullUrl.str(); +} + +UnorderedMap ServicesHttpClient::GetDefaultHeaders() +{ + Stringstream headerVal; + headerVal << versionString << sdkVersion; + return UnorderedMap{ { kSDKVersionStringHeaderName, headerVal.str() } }; +} + +AsyncOp ServicesHttpClient::MakePostRequest( + ServicesCacheId cacheId, + String&& endpoint, + const char* path, + JsonValue const& requestBody, + RunContext&& runContext +) +{ + PFHttpRetrySettings retrySettings{}; + RETURN_IF_FAILED(PFGetHttpRetrySettings(&retrySettings)); + + auto requestOp = MakeUnique( + kPostMethod, + GetUrl(endpoint, path), + GetDefaultHeaders(), + JsonUtils::WriteToString(requestBody), + static_cast(cacheId), + retrySettings, + std::move(runContext) + ); + + return RunOperation(std::move(requestOp)); +} + +AsyncOp ServicesHttpClient::MakeEntityRequest( + ServicesCacheId cacheId, + Entity const& entity, + const char* path, + const JsonValue& requestBody, + RunContext&& runContext +) +{ + return RunOperation(MakeUnique(entity, runContext.Derive())).Then( + [ + cacheId, + url = GetUrl(entity.APIEndpoint(), path), + body = JsonUtils::WriteToString(requestBody), + runContextDerived{ runContext.Derive() } + ] + (Result result) mutable -> AsyncOp + { + RETURN_IF_FAILED(result.hr); + + UnorderedMap headers = GetDefaultHeaders(); + headers[kEntityTokenHeaderName] = result.ExtractPayload(); + + PFHttpRetrySettings retrySettings{}; + RETURN_IF_FAILED(PFGetHttpRetrySettings(&retrySettings)); + + auto requestOp = MakeUnique( + kPostMethod, + url, + std::move(headers), + std::move(body), + static_cast(cacheId), + retrySettings, + std::move(runContextDerived) + ); + + return RunOperation(std::move(requestOp)); + }); +} + + +AsyncOp ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId cacheId, + Entity const& entity, + const char* path, + JsonValue const& requestBody, + RunContext&& runContext +) +{ + String secretKey; + RETURN_IF_FAILED(entity.TryGetSecretKey(secretKey)); + + UnorderedMap headers = GetDefaultHeaders(); + headers[kSecretKeyHeaderName] = std::move(secretKey); + + PFHttpRetrySettings retrySettings{}; + RETURN_IF_FAILED(PFGetHttpRetrySettings(&retrySettings)); + + auto requestOp = MakeUnique( + kPostMethod, + GetUrl(entity.APIEndpoint(), path), + std::move(headers), + JsonUtils::WriteToString(requestBody), + static_cast(cacheId), + retrySettings, + std::move(runContext) + ); + + return RunOperation(std::move(requestOp)); +} + +GetEntityTokenOperation::GetEntityTokenOperation(Entity const& entity, PlayFab::RunContext&& runContext) noexcept : + XAsyncOperation{ std::move(runContext) }, + m_entity{ entity } +{ +} + +HRESULT GetEntityTokenOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFEntityGetEntityTokenAsync(m_entity.Handle(), async); +} + +Result GetEntityTokenOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize; + Vector buffer; + PFEntityToken const* entityToken; + + RETURN_IF_FAILED(PFEntityGetEntityTokenResultSize(async, &bufferSize)); + buffer.resize(bufferSize); + RETURN_IF_FAILED(PFEntityGetEntityTokenResult(async, buffer.size(), buffer.data(), &entityToken, nullptr)); + RETURN_HR_IF(E_UNEXPECTED, !entityToken->token); + + return String{ entityToken->token }; +} + +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Common/HttpClient.h b/Source/PlayFabServices/Source/Common/HttpClient.h new file mode 100644 index 0000000..a3c32c1 --- /dev/null +++ b/Source/PlayFabServices/Source/Common/HttpClient.h @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include "Generated/CacheId.h" + +namespace PlayFab +{ + +// An Http client for make PlayFab service requests +class ServicesHttpClient +{ +public: + static AsyncOp MakePostRequest( + ServicesCacheId cacheId, + String&& endpoint, + const char* path, + JsonValue const& requestBody, + RunContext&& runContext + ); + + static AsyncOp MakeEntityRequest( + ServicesCacheId cacheId, + Entity const& entity, + const char* path, + JsonValue const& requestBody, + RunContext&& runContext + ); + + static AsyncOp MakeSecretKeyRequest( + ServicesCacheId cacheId, + Entity const& entity, + const char* path, + JsonValue const& requestBody, + RunContext&& runContext + ); + +private: + ServicesHttpClient(); // static only + + static UnorderedMap GetDefaultHeaders(); + static String GetUrl(String const& connectionString, const char* path); +}; + +} diff --git a/Source/PlayFabServices/Source/Common/Platform.cpp b/Source/PlayFabServices/Source/Common/Platform.cpp new file mode 100644 index 0000000..4025c47 --- /dev/null +++ b/Source/PlayFabServices/Source/Common/Platform.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" +#include "Platform.h" +#include "Memory.h" +#include + +#ifdef _DEBUG +// The SDK should never rely on the new or delete operators - all allocations should be hooked and +// route through the configured memory hooks (or the default memory functions, which use std::malloc and std::free). +// If these operators are ever used, it indicates we have an allocation that is unhooked and needs to be. + +void* operator new(size_t size) +{ +#if HC_PLATFORM == HC_PLATFORM_GDK + assert(false); +#endif + return malloc(size); +} + +void operator delete(void* p) +{ + if (p) + { + // rapidjson sometimes calls delete on a nullptr, which by C++ standard is a no-op. Don't flag this as + // an unhooked allocation +#if HC_PLATFORM == HC_PLATFORM_GDK + assert(false); +#endif + free(p); + } +} +#endif + +namespace PlayFab +{ + +HRESULT InitializePlatformHooks() +{ + PFMemoryHooks hooks{}; + RETURN_IF_FAILED(PFMemGetFunctions(&hooks)); + return SetMemoryHooks(hooks); +} + +} diff --git a/Source/PlayFabServices/Source/Common/Platform.h b/Source/PlayFabServices/Source/Common/Platform.h new file mode 100644 index 0000000..97b564c --- /dev/null +++ b/Source/PlayFabServices/Source/Common/Platform.h @@ -0,0 +1,9 @@ +#pragma once + +namespace PlayFab +{ + +// Configures required platform callbacks based on PFCore +HRESULT InitializePlatformHooks(); + +} diff --git a/Source/PlayFabServices/Source/GDK/AccountManagementXTokenAPIs.cpp b/Source/PlayFabServices/Source/GDK/AccountManagementXTokenAPIs.cpp new file mode 100644 index 0000000..43380ac --- /dev/null +++ b/Source/PlayFabServices/Source/GDK/AccountManagementXTokenAPIs.cpp @@ -0,0 +1,53 @@ +#include "stdafx.h" +#include "Generated/AccountManagement.h" +#include "JsonUtils.h" +#include "GDK/PlatformUser_GDK.h" + +namespace PlayFab +{ +namespace AccountManagement +{ + +AsyncOp AccountManagementAPI::ClientLinkXboxAccount( + Entity const& entity, + const ClientLinkXboxAccountRequest& request, + RunContext rc +) +{ + auto duplicateUserResult = XUser::Duplicate(request.Model().user); + RETURN_IF_FAILED(duplicateUserResult.hr); + + return duplicateUserResult.Payload().GetTokenAndSignature(rc).Then([entity, request, rc](Result result) mutable -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + const char* path{ "/Client/LinkXboxAccount" }; + JsonValue requestBody{ request.ToJson() }; + JsonUtils::ObjectAddMember(requestBody, "XboxToken", result.ExtractPayload().token); + + return ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkXboxAccount, + entity, + path, + requestBody, + std::move(rc) + ); + }) + .Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace AccountManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/GDK/FriendsXTokenAPIs.cpp b/Source/PlayFabServices/Source/GDK/FriendsXTokenAPIs.cpp new file mode 100644 index 0000000..d220f91 --- /dev/null +++ b/Source/PlayFabServices/Source/GDK/FriendsXTokenAPIs.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "Generated/Friends.h" +#include "JsonUtils.h" +#include "GDK/PlatformUser_GDK.h" + +namespace PlayFab +{ +namespace Friends +{ + +AsyncOp FriendsAPI::ClientGetFriendsList( + Entity const& entity, + const ClientGetFriendsListRequest& request, + RunContext rc +) +{ + const auto getFriendsListContinuation = [](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetFriendsListResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }; + + if (request.Model().user) + { + auto duplicateUserResult = XUser::Duplicate(request.Model().user); + RETURN_IF_FAILED(duplicateUserResult.hr); + + return duplicateUserResult.Payload().GetTokenAndSignature(rc).Then([rc, entity, request](Result result) mutable -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + const char* path{ "/Client/GetFriendsList" }; + JsonValue requestBody{ request.ToJson() }; + JsonUtils::ObjectAddMember(requestBody, "XboxToken", result.ExtractPayload().token); + + return ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::FriendsClientGetFriendsList, + entity, + path, + std::move(requestBody), + rc.Derive() + ); + }) + .Then(getFriendsListContinuation); + } + else + { + const char* path{ "/Client/GetFriendsList" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::FriendsClientGetFriendsList, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then(getFriendsListContinuation); + } +} + +} // namespace Friends +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/GDK/InventoryXTokenAPIs.cpp b/Source/PlayFabServices/Source/GDK/InventoryXTokenAPIs.cpp new file mode 100644 index 0000000..0752044 --- /dev/null +++ b/Source/PlayFabServices/Source/GDK/InventoryXTokenAPIs.cpp @@ -0,0 +1,55 @@ +#include "stdafx.h" +#include "Generated/Inventory.h" +#include "JsonUtils.h" +#include "GDK/PlatformUser_GDK.h" + +namespace PlayFab +{ +namespace Inventory +{ + +AsyncOp InventoryAPI::RedeemMicrosoftStoreInventoryItems( + Entity const& entity, + const RedeemMicrosoftStoreInventoryItemsRequest& request, + RunContext rc +) +{ + auto duplicateUserResult = XUser::Duplicate(request.Model().user); + RETURN_IF_FAILED(duplicateUserResult.hr); + + return duplicateUserResult.Payload().GetTokenAndSignature(rc).Then([entity, request, rc](Result result) mutable -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + const char* path{ "/Inventory/RedeemMicrosoftStoreInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + JsonUtils::ObjectAddMember(requestBody, "XboxToken", result.ExtractPayload().token); + + return ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryRedeemMicrosoftStoreInventoryItems, + entity, + path, + std::move(requestBody), + rc.Derive() + ); + }) + .Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RedeemMicrosoftStoreInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Inventory +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/AccountManagement.cpp b/Source/PlayFabServices/Source/Generated/AccountManagement.cpp new file mode 100644 index 0000000..bbaf5b3 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/AccountManagement.cpp @@ -0,0 +1,3089 @@ +#include "stdafx.h" +#include "AccountManagement.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace AccountManagement +{ + + +AsyncOp AccountManagementAPI::ClientAddOrUpdateContactEmail( + Entity const& entity, + const AddOrUpdateContactEmailRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/AddOrUpdateContactEmail" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientAddOrUpdateContactEmail, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientAddUsernamePassword( + Entity const& entity, + const AddUsernamePasswordRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/AddUsernamePassword" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientAddUsernamePassword, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + AddUsernamePasswordResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetAccountInfo( + Entity const& entity, + const GetAccountInfoRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetAccountInfo" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetAccountInfo, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetAccountInfoResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayerCombinedInfo( + Entity const& entity, + const GetPlayerCombinedInfoRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayerCombinedInfo" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayerCombinedInfo, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerCombinedInfoResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayerProfile( + Entity const& entity, + const GetPlayerProfileRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayerProfile" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayerProfile, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerProfileResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromFacebookIDs( + Entity const& entity, + const GetPlayFabIDsFromFacebookIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromFacebookIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromFacebookIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromFacebookIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromFacebookInstantGamesIds( + Entity const& entity, + const GetPlayFabIDsFromFacebookInstantGamesIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromFacebookInstantGamesIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromFacebookInstantGamesIdsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromGameCenterIDs( + Entity const& entity, + const GetPlayFabIDsFromGameCenterIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromGameCenterIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromGameCenterIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromGameCenterIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromGoogleIDs( + Entity const& entity, + const GetPlayFabIDsFromGoogleIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromGoogleIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromGoogleIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromGoogleIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs( + Entity const& entity, + const GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromGooglePlayGamesPlayerIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromKongregateIDs( + Entity const& entity, + const GetPlayFabIDsFromKongregateIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromKongregateIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromKongregateIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromKongregateIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromNintendoServiceAccountIds( + Entity const& entity, + const GetPlayFabIDsFromNintendoServiceAccountIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromNintendoServiceAccountIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromNintendoServiceAccountIdsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromNintendoSwitchDeviceIds( + Entity const& entity, + const GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromNintendoSwitchDeviceIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromNintendoSwitchDeviceIdsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromPSNAccountIDs( + Entity const& entity, + const GetPlayFabIDsFromPSNAccountIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromPSNAccountIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromPSNAccountIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromPSNAccountIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromSteamIDs( + Entity const& entity, + const GetPlayFabIDsFromSteamIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromSteamIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromSteamIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromSteamIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromTwitchIDs( + Entity const& entity, + const GetPlayFabIDsFromTwitchIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromTwitchIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromTwitchIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromTwitchIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientGetPlayFabIDsFromXboxLiveIDs( + Entity const& entity, + const GetPlayFabIDsFromXboxLiveIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayFabIDsFromXboxLiveIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientGetPlayFabIDsFromXboxLiveIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromXboxLiveIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkAndroidDeviceID( + Entity const& entity, + const LinkAndroidDeviceIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkAndroidDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkAndroidDeviceID, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkApple( + Entity const& entity, + const LinkAppleRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkApple" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkApple, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkCustomID( + Entity const& entity, + const LinkCustomIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkCustomID" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkCustomID, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkFacebookAccount( + Entity const& entity, + const LinkFacebookAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkFacebookAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkFacebookAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkFacebookInstantGamesId( + Entity const& entity, + const LinkFacebookInstantGamesIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkFacebookInstantGamesId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkFacebookInstantGamesId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkGameCenterAccount( + Entity const& entity, + const LinkGameCenterAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkGameCenterAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkGameCenterAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkGoogleAccount( + Entity const& entity, + const LinkGoogleAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkGoogleAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkGoogleAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkGooglePlayGamesServicesAccount( + Entity const& entity, + const LinkGooglePlayGamesServicesAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkGooglePlayGamesServicesAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkGooglePlayGamesServicesAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkIOSDeviceID( + Entity const& entity, + const LinkIOSDeviceIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkIOSDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkIOSDeviceID, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkKongregate( + Entity const& entity, + const LinkKongregateAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkKongregate" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkKongregate, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkNintendoServiceAccount( + Entity const& entity, + const ClientLinkNintendoServiceAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkNintendoServiceAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkNintendoServiceAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkNintendoSwitchDeviceId( + Entity const& entity, + const ClientLinkNintendoSwitchDeviceIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkNintendoSwitchDeviceId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkNintendoSwitchDeviceId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkOpenIdConnect( + Entity const& entity, + const LinkOpenIdConnectRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkOpenIdConnect" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkOpenIdConnect, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkPSNAccount( + Entity const& entity, + const ClientLinkPSNAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkPSNAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkPSNAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkSteamAccount( + Entity const& entity, + const LinkSteamAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkSteamAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkSteamAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientLinkTwitch( + Entity const& entity, + const LinkTwitchAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkTwitch" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkTwitch, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +AsyncOp AccountManagementAPI::ClientLinkXboxAccount( + Entity const& entity, + const ClientLinkXboxAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/LinkXboxAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientLinkXboxAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} +#endif + +AsyncOp AccountManagementAPI::ClientRemoveContactEmail( + Entity const& entity, + const RemoveContactEmailRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/RemoveContactEmail" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientRemoveContactEmail, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientReportPlayer( + Entity const& entity, + const ReportPlayerClientRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/ReportPlayer" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientReportPlayer, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ReportPlayerClientResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientSendAccountRecoveryEmail( + ServiceConfig const& serviceConfig, + const SendAccountRecoveryEmailRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/SendAccountRecoveryEmail" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakePostRequest( + ServicesCacheId::AccountManagementClientSendAccountRecoveryEmail, + serviceConfig.APIEndpoint(), + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkAndroidDeviceID( + Entity const& entity, + const UnlinkAndroidDeviceIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkAndroidDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkAndroidDeviceID, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkApple( + Entity const& entity, + const UnlinkAppleRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkApple" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkApple, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkCustomID( + Entity const& entity, + const UnlinkCustomIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkCustomID" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkCustomID, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkFacebookAccount( + Entity const& entity, + const UnlinkFacebookAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkFacebookAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkFacebookAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkFacebookInstantGamesId( + Entity const& entity, + const UnlinkFacebookInstantGamesIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkFacebookInstantGamesId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkFacebookInstantGamesId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkGameCenterAccount( + Entity const& entity, + const UnlinkGameCenterAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkGameCenterAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkGameCenterAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkGoogleAccount( + Entity const& entity, + const UnlinkGoogleAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkGoogleAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkGoogleAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkGooglePlayGamesServicesAccount( + Entity const& entity, + const UnlinkGooglePlayGamesServicesAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkGooglePlayGamesServicesAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkGooglePlayGamesServicesAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkIOSDeviceID( + Entity const& entity, + const UnlinkIOSDeviceIDRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkIOSDeviceID" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkIOSDeviceID, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkKongregate( + Entity const& entity, + const UnlinkKongregateAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkKongregate" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkKongregate, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkNintendoServiceAccount( + Entity const& entity, + const ClientUnlinkNintendoServiceAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkNintendoServiceAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkNintendoServiceAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkNintendoSwitchDeviceId( + Entity const& entity, + const ClientUnlinkNintendoSwitchDeviceIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkNintendoSwitchDeviceId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkNintendoSwitchDeviceId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkOpenIdConnect( + Entity const& entity, + const UnlinkOpenIdConnectRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkOpenIdConnect" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkOpenIdConnect, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkPSNAccount( + Entity const& entity, + const ClientUnlinkPSNAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkPSNAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkPSNAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkSteamAccount( + Entity const& entity, + const UnlinkSteamAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkSteamAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkSteamAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkTwitch( + Entity const& entity, + const UnlinkTwitchAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkTwitch" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkTwitch, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUnlinkXboxAccount( + Entity const& entity, + const ClientUnlinkXboxAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UnlinkXboxAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUnlinkXboxAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUpdateAvatarUrl( + Entity const& entity, + const ClientUpdateAvatarUrlRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UpdateAvatarUrl" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUpdateAvatarUrl, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ClientUpdateUserTitleDisplayName( + Entity const& entity, + const UpdateUserTitleDisplayNameRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UpdateUserTitleDisplayName" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementClientUpdateUserTitleDisplayName, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserTitleDisplayNameResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerBanUsers( + Entity const& entity, + const BanUsersRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/BanUsers" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerBanUsers, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + BanUsersResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerDeletePlayer( + Entity const& entity, + const DeletePlayerRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/DeletePlayer" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerDeletePlayer, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayerCombinedInfo( + Entity const& entity, + const GetPlayerCombinedInfoRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayerCombinedInfo" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayerCombinedInfo, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerCombinedInfoResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayerProfile( + Entity const& entity, + const GetPlayerProfileRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayerProfile" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayerProfile, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerProfileResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromFacebookIDs( + Entity const& entity, + const GetPlayFabIDsFromFacebookIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromFacebookIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromFacebookIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromFacebookIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromFacebookInstantGamesIds( + Entity const& entity, + const GetPlayFabIDsFromFacebookInstantGamesIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromFacebookInstantGamesIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromFacebookInstantGamesIdsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromNintendoServiceAccountIds( + Entity const& entity, + const GetPlayFabIDsFromNintendoServiceAccountIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromNintendoServiceAccountIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromNintendoServiceAccountIdsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromNintendoSwitchDeviceIds( + Entity const& entity, + const GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromNintendoSwitchDeviceIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromNintendoSwitchDeviceIdsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromPSNAccountIDs( + Entity const& entity, + const GetPlayFabIDsFromPSNAccountIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromPSNAccountIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromPSNAccountIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromPSNAccountIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromSteamIDs( + Entity const& entity, + const GetPlayFabIDsFromSteamIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromSteamIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromSteamIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromSteamIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromTwitchIDs( + Entity const& entity, + const GetPlayFabIDsFromTwitchIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromTwitchIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromTwitchIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromTwitchIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetPlayFabIDsFromXboxLiveIDs( + Entity const& entity, + const GetPlayFabIDsFromXboxLiveIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayFabIDsFromXboxLiveIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetPlayFabIDsFromXboxLiveIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayFabIDsFromXboxLiveIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetServerCustomIDsFromPlayFabIDs( + Entity const& entity, + const GetServerCustomIDsFromPlayFabIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetServerCustomIDsFromPlayFabIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetServerCustomIDsFromPlayFabIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetServerCustomIDsFromPlayFabIDsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetUserAccountInfo( + Entity const& entity, + const GetUserAccountInfoRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserAccountInfo" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetUserAccountInfo, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetUserAccountInfoResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerGetUserBans( + Entity const& entity, + const GetUserBansRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserBans" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerGetUserBans, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetUserBansResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerLinkNintendoServiceAccount( + Entity const& entity, + const ServerLinkNintendoServiceAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LinkNintendoServiceAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerLinkNintendoServiceAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerLinkNintendoSwitchDeviceId( + Entity const& entity, + const ServerLinkNintendoSwitchDeviceIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LinkNintendoSwitchDeviceId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerLinkNintendoSwitchDeviceId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerLinkPSNAccount( + Entity const& entity, + const ServerLinkPSNAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LinkPSNAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerLinkPSNAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerLinkPSNId( + Entity const& entity, + const LinkPSNIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LinkPSNId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerLinkPSNId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerLinkServerCustomId( + Entity const& entity, + const LinkServerCustomIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LinkServerCustomId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerLinkServerCustomId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerLinkSteamId( + Entity const& entity, + const LinkSteamIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LinkSteamId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerLinkSteamId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerLinkXboxAccount( + Entity const& entity, + const ServerLinkXboxAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/LinkXboxAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerLinkXboxAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerRevokeAllBansForUser( + Entity const& entity, + const RevokeAllBansForUserRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/RevokeAllBansForUser" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerRevokeAllBansForUser, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RevokeAllBansForUserResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerRevokeBans( + Entity const& entity, + const RevokeBansRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/RevokeBans" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerRevokeBans, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RevokeBansResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerSendCustomAccountRecoveryEmail( + Entity const& entity, + const SendCustomAccountRecoveryEmailRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SendCustomAccountRecoveryEmail" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerSendCustomAccountRecoveryEmail, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerSendEmailFromTemplate( + Entity const& entity, + const SendEmailFromTemplateRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SendEmailFromTemplate" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerSendEmailFromTemplate, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUnlinkNintendoServiceAccount( + Entity const& entity, + const ServerUnlinkNintendoServiceAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UnlinkNintendoServiceAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUnlinkNintendoServiceAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUnlinkNintendoSwitchDeviceId( + Entity const& entity, + const ServerUnlinkNintendoSwitchDeviceIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UnlinkNintendoSwitchDeviceId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUnlinkNintendoSwitchDeviceId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUnlinkPSNAccount( + Entity const& entity, + const ServerUnlinkPSNAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UnlinkPSNAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUnlinkPSNAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUnlinkServerCustomId( + Entity const& entity, + const UnlinkServerCustomIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UnlinkServerCustomId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUnlinkServerCustomId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUnlinkSteamId( + Entity const& entity, + const UnlinkSteamIdRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UnlinkSteamId" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUnlinkSteamId, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUnlinkXboxAccount( + Entity const& entity, + const ServerUnlinkXboxAccountRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UnlinkXboxAccount" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUnlinkXboxAccount, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUpdateAvatarUrl( + Entity const& entity, + const ServerUpdateAvatarUrlRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateAvatarUrl" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUpdateAvatarUrl, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::ServerUpdateBans( + Entity const& entity, + const UpdateBansRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateBans" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::AccountManagementServerUpdateBans, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateBansResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp AccountManagementAPI::GetTitlePlayersFromXboxLiveIDs( + Entity const& entity, + const GetTitlePlayersFromXboxLiveIDsRequest& request, + RunContext rc +) +{ + const char* path{ "/Profile/GetTitlePlayersFromXboxLiveIDs" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::AccountManagementGetTitlePlayersFromXboxLiveIDs, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitlePlayersFromProviderIDsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace AccountManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/AccountManagement.h b/Source/PlayFabServices/Source/Generated/AccountManagement.h new file mode 100644 index 0000000..243aa8d --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/AccountManagement.h @@ -0,0 +1,117 @@ +#pragma once + +#include +#include +#include "AccountManagementTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace AccountManagement +{ + +class AccountManagementAPI +{ +public: + AccountManagementAPI() = delete; + AccountManagementAPI(const AccountManagementAPI& source) = delete; + AccountManagementAPI& operator=(const AccountManagementAPI& source) = delete; + ~AccountManagementAPI() = default; + + // ------------ Generated API calls + static AsyncOp ClientAddOrUpdateContactEmail(Entity const& entity, const AddOrUpdateContactEmailRequest& request, RunContext rc); + static AsyncOp ClientAddUsernamePassword(Entity const& entity, const AddUsernamePasswordRequest& request, RunContext rc); + static AsyncOp ClientGetAccountInfo(Entity const& entity, const GetAccountInfoRequest& request, RunContext rc); + static AsyncOp ClientGetPlayerCombinedInfo(Entity const& entity, const GetPlayerCombinedInfoRequest& request, RunContext rc); + static AsyncOp ClientGetPlayerProfile(Entity const& entity, const GetPlayerProfileRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromFacebookIDs(Entity const& entity, const GetPlayFabIDsFromFacebookIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromFacebookInstantGamesIds(Entity const& entity, const GetPlayFabIDsFromFacebookInstantGamesIdsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromGameCenterIDs(Entity const& entity, const GetPlayFabIDsFromGameCenterIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromGoogleIDs(Entity const& entity, const GetPlayFabIDsFromGoogleIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs(Entity const& entity, const GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromKongregateIDs(Entity const& entity, const GetPlayFabIDsFromKongregateIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromNintendoServiceAccountIds(Entity const& entity, const GetPlayFabIDsFromNintendoServiceAccountIdsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromNintendoSwitchDeviceIds(Entity const& entity, const GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromPSNAccountIDs(Entity const& entity, const GetPlayFabIDsFromPSNAccountIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromSteamIDs(Entity const& entity, const GetPlayFabIDsFromSteamIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromTwitchIDs(Entity const& entity, const GetPlayFabIDsFromTwitchIDsRequest& request, RunContext rc); + static AsyncOp ClientGetPlayFabIDsFromXboxLiveIDs(Entity const& entity, const GetPlayFabIDsFromXboxLiveIDsRequest& request, RunContext rc); + static AsyncOp ClientLinkAndroidDeviceID(Entity const& entity, const LinkAndroidDeviceIDRequest& request, RunContext rc); + static AsyncOp ClientLinkApple(Entity const& entity, const LinkAppleRequest& request, RunContext rc); + static AsyncOp ClientLinkCustomID(Entity const& entity, const LinkCustomIDRequest& request, RunContext rc); + static AsyncOp ClientLinkFacebookAccount(Entity const& entity, const LinkFacebookAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkFacebookInstantGamesId(Entity const& entity, const LinkFacebookInstantGamesIdRequest& request, RunContext rc); + static AsyncOp ClientLinkGameCenterAccount(Entity const& entity, const LinkGameCenterAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkGoogleAccount(Entity const& entity, const LinkGoogleAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkGooglePlayGamesServicesAccount(Entity const& entity, const LinkGooglePlayGamesServicesAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkIOSDeviceID(Entity const& entity, const LinkIOSDeviceIDRequest& request, RunContext rc); + static AsyncOp ClientLinkKongregate(Entity const& entity, const LinkKongregateAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkNintendoServiceAccount(Entity const& entity, const ClientLinkNintendoServiceAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkNintendoSwitchDeviceId(Entity const& entity, const ClientLinkNintendoSwitchDeviceIdRequest& request, RunContext rc); + static AsyncOp ClientLinkOpenIdConnect(Entity const& entity, const LinkOpenIdConnectRequest& request, RunContext rc); + static AsyncOp ClientLinkPSNAccount(Entity const& entity, const ClientLinkPSNAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkSteamAccount(Entity const& entity, const LinkSteamAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkTwitch(Entity const& entity, const LinkTwitchAccountRequest& request, RunContext rc); + static AsyncOp ClientLinkXboxAccount(Entity const& entity, const ClientLinkXboxAccountRequest& request, RunContext rc); + static AsyncOp ClientRemoveContactEmail(Entity const& entity, const RemoveContactEmailRequest& request, RunContext rc); + static AsyncOp ClientReportPlayer(Entity const& entity, const ReportPlayerClientRequest& request, RunContext rc); + static AsyncOp ClientSendAccountRecoveryEmail(ServiceConfig const& serviceConfig, const SendAccountRecoveryEmailRequest& request, RunContext rc); + static AsyncOp ClientUnlinkAndroidDeviceID(Entity const& entity, const UnlinkAndroidDeviceIDRequest& request, RunContext rc); + static AsyncOp ClientUnlinkApple(Entity const& entity, const UnlinkAppleRequest& request, RunContext rc); + static AsyncOp ClientUnlinkCustomID(Entity const& entity, const UnlinkCustomIDRequest& request, RunContext rc); + static AsyncOp ClientUnlinkFacebookAccount(Entity const& entity, const UnlinkFacebookAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkFacebookInstantGamesId(Entity const& entity, const UnlinkFacebookInstantGamesIdRequest& request, RunContext rc); + static AsyncOp ClientUnlinkGameCenterAccount(Entity const& entity, const UnlinkGameCenterAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkGoogleAccount(Entity const& entity, const UnlinkGoogleAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkGooglePlayGamesServicesAccount(Entity const& entity, const UnlinkGooglePlayGamesServicesAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkIOSDeviceID(Entity const& entity, const UnlinkIOSDeviceIDRequest& request, RunContext rc); + static AsyncOp ClientUnlinkKongregate(Entity const& entity, const UnlinkKongregateAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkNintendoServiceAccount(Entity const& entity, const ClientUnlinkNintendoServiceAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkNintendoSwitchDeviceId(Entity const& entity, const ClientUnlinkNintendoSwitchDeviceIdRequest& request, RunContext rc); + static AsyncOp ClientUnlinkOpenIdConnect(Entity const& entity, const UnlinkOpenIdConnectRequest& request, RunContext rc); + static AsyncOp ClientUnlinkPSNAccount(Entity const& entity, const ClientUnlinkPSNAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkSteamAccount(Entity const& entity, const UnlinkSteamAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkTwitch(Entity const& entity, const UnlinkTwitchAccountRequest& request, RunContext rc); + static AsyncOp ClientUnlinkXboxAccount(Entity const& entity, const ClientUnlinkXboxAccountRequest& request, RunContext rc); + static AsyncOp ClientUpdateAvatarUrl(Entity const& entity, const ClientUpdateAvatarUrlRequest& request, RunContext rc); + static AsyncOp ClientUpdateUserTitleDisplayName(Entity const& entity, const UpdateUserTitleDisplayNameRequest& request, RunContext rc); + static AsyncOp ServerBanUsers(Entity const& entity, const BanUsersRequest& request, RunContext rc); + static AsyncOp ServerDeletePlayer(Entity const& entity, const DeletePlayerRequest& request, RunContext rc); + static AsyncOp ServerGetPlayerCombinedInfo(Entity const& entity, const GetPlayerCombinedInfoRequest& request, RunContext rc); + static AsyncOp ServerGetPlayerProfile(Entity const& entity, const GetPlayerProfileRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromFacebookIDs(Entity const& entity, const GetPlayFabIDsFromFacebookIDsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromFacebookInstantGamesIds(Entity const& entity, const GetPlayFabIDsFromFacebookInstantGamesIdsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromNintendoServiceAccountIds(Entity const& entity, const GetPlayFabIDsFromNintendoServiceAccountIdsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromNintendoSwitchDeviceIds(Entity const& entity, const GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromPSNAccountIDs(Entity const& entity, const GetPlayFabIDsFromPSNAccountIDsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromSteamIDs(Entity const& entity, const GetPlayFabIDsFromSteamIDsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromTwitchIDs(Entity const& entity, const GetPlayFabIDsFromTwitchIDsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayFabIDsFromXboxLiveIDs(Entity const& entity, const GetPlayFabIDsFromXboxLiveIDsRequest& request, RunContext rc); + static AsyncOp ServerGetServerCustomIDsFromPlayFabIDs(Entity const& entity, const GetServerCustomIDsFromPlayFabIDsRequest& request, RunContext rc); + static AsyncOp ServerGetUserAccountInfo(Entity const& entity, const GetUserAccountInfoRequest& request, RunContext rc); + static AsyncOp ServerGetUserBans(Entity const& entity, const GetUserBansRequest& request, RunContext rc); + static AsyncOp ServerLinkNintendoServiceAccount(Entity const& entity, const ServerLinkNintendoServiceAccountRequest& request, RunContext rc); + static AsyncOp ServerLinkNintendoSwitchDeviceId(Entity const& entity, const ServerLinkNintendoSwitchDeviceIdRequest& request, RunContext rc); + static AsyncOp ServerLinkPSNAccount(Entity const& entity, const ServerLinkPSNAccountRequest& request, RunContext rc); + static AsyncOp ServerLinkPSNId(Entity const& entity, const LinkPSNIdRequest& request, RunContext rc); + static AsyncOp ServerLinkServerCustomId(Entity const& entity, const LinkServerCustomIdRequest& request, RunContext rc); + static AsyncOp ServerLinkSteamId(Entity const& entity, const LinkSteamIdRequest& request, RunContext rc); + static AsyncOp ServerLinkXboxAccount(Entity const& entity, const ServerLinkXboxAccountRequest& request, RunContext rc); + static AsyncOp ServerRevokeAllBansForUser(Entity const& entity, const RevokeAllBansForUserRequest& request, RunContext rc); + static AsyncOp ServerRevokeBans(Entity const& entity, const RevokeBansRequest& request, RunContext rc); + static AsyncOp ServerSendCustomAccountRecoveryEmail(Entity const& entity, const SendCustomAccountRecoveryEmailRequest& request, RunContext rc); + static AsyncOp ServerSendEmailFromTemplate(Entity const& entity, const SendEmailFromTemplateRequest& request, RunContext rc); + static AsyncOp ServerUnlinkNintendoServiceAccount(Entity const& entity, const ServerUnlinkNintendoServiceAccountRequest& request, RunContext rc); + static AsyncOp ServerUnlinkNintendoSwitchDeviceId(Entity const& entity, const ServerUnlinkNintendoSwitchDeviceIdRequest& request, RunContext rc); + static AsyncOp ServerUnlinkPSNAccount(Entity const& entity, const ServerUnlinkPSNAccountRequest& request, RunContext rc); + static AsyncOp ServerUnlinkServerCustomId(Entity const& entity, const UnlinkServerCustomIdRequest& request, RunContext rc); + static AsyncOp ServerUnlinkSteamId(Entity const& entity, const UnlinkSteamIdRequest& request, RunContext rc); + static AsyncOp ServerUnlinkXboxAccount(Entity const& entity, const ServerUnlinkXboxAccountRequest& request, RunContext rc); + static AsyncOp ServerUpdateAvatarUrl(Entity const& entity, const ServerUpdateAvatarUrlRequest& request, RunContext rc); + static AsyncOp ServerUpdateBans(Entity const& entity, const UpdateBansRequest& request, RunContext rc); + static AsyncOp GetTitlePlayersFromXboxLiveIDs(Entity const& entity, const GetTitlePlayersFromXboxLiveIDsRequest& request, RunContext rc); +}; + +} // namespace AccountManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/AccountManagementTypes.cpp b/Source/PlayFabServices/Source/Generated/AccountManagementTypes.cpp new file mode 100644 index 0000000..4595fbe --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/AccountManagementTypes.cpp @@ -0,0 +1,3004 @@ +#include "stdafx.h" +#include "AccountManagementTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace AccountManagement +{ + +JsonValue AddOrUpdateContactEmailRequest::ToJson() const +{ + return AddOrUpdateContactEmailRequest::ToJson(this->Model()); +} + +JsonValue AddOrUpdateContactEmailRequest::ToJson(const PFAccountManagementAddOrUpdateContactEmailRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "EmailAddress", input.emailAddress); + return output; +} + +JsonValue AddUsernamePasswordRequest::ToJson() const +{ + return AddUsernamePasswordRequest::ToJson(this->Model()); +} + +JsonValue AddUsernamePasswordRequest::ToJson(const PFAccountManagementAddUsernamePasswordRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Email", input.email); + JsonUtils::ObjectAddMember(output, "Password", input.password); + JsonUtils::ObjectAddMember(output, "Username", input.username); + return output; +} + +HRESULT AddUsernamePasswordResult::FromJson(const JsonValue& input) +{ + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + return S_OK; +} + +size_t AddUsernamePasswordResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AddUsernamePasswordResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AddUsernamePasswordResult::RequiredBufferSize(const PFAccountManagementAddUsernamePasswordResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + return requiredSize; +} + +HRESULT AddUsernamePasswordResult::Copy(const PFAccountManagementAddUsernamePasswordResult& input, PFAccountManagementAddUsernamePasswordResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetAccountInfoRequest::ToJson() const +{ + return GetAccountInfoRequest::ToJson(this->Model()); +} + +JsonValue GetAccountInfoRequest::ToJson(const PFAccountManagementGetAccountInfoRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Email", input.email); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "TitleDisplayName", input.titleDisplayName); + JsonUtils::ObjectAddMember(output, "Username", input.username); + return output; +} + +HRESULT GetAccountInfoResult::FromJson(const JsonValue& input) +{ + std::optional accountInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AccountInfo", accountInfo)); + if (accountInfo) + { + this->SetAccountInfo(std::move(*accountInfo)); + } + + return S_OK; +} + +size_t GetAccountInfoResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetAccountInfoResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetAccountInfoResult::RequiredBufferSize(const PFAccountManagementGetAccountInfoResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.accountInfo) + { + requiredSize += UserAccountInfo::RequiredBufferSize(*model.accountInfo); + } + return requiredSize; +} + +HRESULT GetAccountInfoResult::Copy(const PFAccountManagementGetAccountInfoResult& input, PFAccountManagementGetAccountInfoResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.accountInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.accountInfo = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayerCombinedInfoRequest::ToJson() const +{ + return GetPlayerCombinedInfoRequest::ToJson(this->Model()); +} + +JsonValue GetPlayerCombinedInfoRequest::ToJson(const PFAccountManagementGetPlayerCombinedInfoRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "InfoRequestParameters", input.infoRequestParameters); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT GetPlayerCombinedInfoResult::FromJson(const JsonValue& input) +{ + std::optional infoResultPayload{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "InfoResultPayload", infoResultPayload)); + if (infoResultPayload) + { + this->SetInfoResultPayload(std::move(*infoResultPayload)); + } + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t GetPlayerCombinedInfoResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayerCombinedInfoResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayerCombinedInfoResult::RequiredBufferSize(const PFAccountManagementGetPlayerCombinedInfoResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.infoResultPayload) + { + requiredSize += GetPlayerCombinedInfoResultPayload::RequiredBufferSize(*model.infoResultPayload); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT GetPlayerCombinedInfoResult::Copy(const PFAccountManagementGetPlayerCombinedInfoResult& input, PFAccountManagementGetPlayerCombinedInfoResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.infoResultPayload); + RETURN_IF_FAILED(propCopyResult.hr); + output.infoResultPayload = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayerProfileRequest::ToJson() const +{ + return GetPlayerProfileRequest::ToJson(this->Model()); +} + +JsonValue GetPlayerProfileRequest::ToJson(const PFAccountManagementGetPlayerProfileRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "ProfileConstraints", input.profileConstraints); + return output; +} + +HRESULT GetPlayerProfileResult::FromJson(const JsonValue& input) +{ + std::optional playerProfile{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerProfile", playerProfile)); + if (playerProfile) + { + this->SetPlayerProfile(std::move(*playerProfile)); + } + + return S_OK; +} + +size_t GetPlayerProfileResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayerProfileResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayerProfileResult::RequiredBufferSize(const PFAccountManagementGetPlayerProfileResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playerProfile) + { + requiredSize += PlayerProfileModel::RequiredBufferSize(*model.playerProfile); + } + return requiredSize; +} + +HRESULT GetPlayerProfileResult::Copy(const PFAccountManagementGetPlayerProfileResult& input, PFAccountManagementGetPlayerProfileResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playerProfile); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerProfile = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromFacebookIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromFacebookIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromFacebookIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "FacebookIDs", input.facebookIDs, input.facebookIDsCount); + return output; +} + +HRESULT FacebookPlayFabIdPair::FromJson(const JsonValue& input) +{ + String facebookId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookId", facebookId)); + this->SetFacebookId(std::move(facebookId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t FacebookPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result FacebookPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t FacebookPlayFabIdPair::RequiredBufferSize(const PFAccountManagementFacebookPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.facebookId) + { + requiredSize += (std::strlen(model.facebookId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT FacebookPlayFabIdPair::Copy(const PFAccountManagementFacebookPlayFabIdPair& input, PFAccountManagementFacebookPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.facebookId); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromFacebookIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromFacebookIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromFacebookIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromFacebookIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromFacebookIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementFacebookPlayFabIdPair*) + sizeof(PFAccountManagementFacebookPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += FacebookPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromFacebookIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromFacebookIDsResult& input, PFAccountManagementGetPlayFabIDsFromFacebookIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromFacebookInstantGamesIdsRequest::ToJson() const +{ + return GetPlayFabIDsFromFacebookInstantGamesIdsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromFacebookInstantGamesIdsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "FacebookInstantGamesIds", input.facebookInstantGamesIds, input.facebookInstantGamesIdsCount); + return output; +} + +HRESULT FacebookInstantGamesPlayFabIdPair::FromJson(const JsonValue& input) +{ + String facebookInstantGamesId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInstantGamesId", facebookInstantGamesId)); + this->SetFacebookInstantGamesId(std::move(facebookInstantGamesId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t FacebookInstantGamesPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result FacebookInstantGamesPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t FacebookInstantGamesPlayFabIdPair::RequiredBufferSize(const PFAccountManagementFacebookInstantGamesPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.facebookInstantGamesId) + { + requiredSize += (std::strlen(model.facebookInstantGamesId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT FacebookInstantGamesPlayFabIdPair::Copy(const PFAccountManagementFacebookInstantGamesPlayFabIdPair& input, PFAccountManagementFacebookInstantGamesPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.facebookInstantGamesId); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInstantGamesId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromFacebookInstantGamesIdsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromFacebookInstantGamesIdsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromFacebookInstantGamesIdsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromFacebookInstantGamesIdsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementFacebookInstantGamesPlayFabIdPair*) + sizeof(PFAccountManagementFacebookInstantGamesPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += FacebookInstantGamesPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromFacebookInstantGamesIdsResult::Copy(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult& input, PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromGameCenterIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromGameCenterIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromGameCenterIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "GameCenterIDs", input.gameCenterIDs, input.gameCenterIDsCount); + return output; +} + +HRESULT GameCenterPlayFabIdPair::FromJson(const JsonValue& input) +{ + String gameCenterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GameCenterId", gameCenterId)); + this->SetGameCenterId(std::move(gameCenterId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t GameCenterPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GameCenterPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GameCenterPlayFabIdPair::RequiredBufferSize(const PFAccountManagementGameCenterPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.gameCenterId) + { + requiredSize += (std::strlen(model.gameCenterId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT GameCenterPlayFabIdPair::Copy(const PFAccountManagementGameCenterPlayFabIdPair& input, PFAccountManagementGameCenterPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.gameCenterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.gameCenterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromGameCenterIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromGameCenterIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromGameCenterIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromGameCenterIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementGameCenterPlayFabIdPair*) + sizeof(PFAccountManagementGameCenterPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += GameCenterPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromGameCenterIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult& input, PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromGoogleIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromGoogleIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromGoogleIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "GoogleIDs", input.googleIDs, input.googleIDsCount); + return output; +} + +HRESULT GooglePlayFabIdPair::FromJson(const JsonValue& input) +{ + String googleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleId", googleId)); + this->SetGoogleId(std::move(googleId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t GooglePlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GooglePlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GooglePlayFabIdPair::RequiredBufferSize(const PFAccountManagementGooglePlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.googleId) + { + requiredSize += (std::strlen(model.googleId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT GooglePlayFabIdPair::Copy(const PFAccountManagementGooglePlayFabIdPair& input, PFAccountManagementGooglePlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.googleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromGoogleIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromGoogleIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromGoogleIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromGoogleIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromGoogleIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementGooglePlayFabIdPair*) + sizeof(PFAccountManagementGooglePlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += GooglePlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromGoogleIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromGoogleIDsResult& input, PFAccountManagementGetPlayFabIDsFromGoogleIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "GooglePlayGamesPlayerIDs", input.googlePlayGamesPlayerIDs, input.googlePlayGamesPlayerIDsCount); + return output; +} + +HRESULT GooglePlayGamesPlayFabIdPair::FromJson(const JsonValue& input) +{ + String googlePlayGamesPlayerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesPlayerId", googlePlayGamesPlayerId)); + this->SetGooglePlayGamesPlayerId(std::move(googlePlayGamesPlayerId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t GooglePlayGamesPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GooglePlayGamesPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GooglePlayGamesPlayFabIdPair::RequiredBufferSize(const PFAccountManagementGooglePlayGamesPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.googlePlayGamesPlayerId) + { + requiredSize += (std::strlen(model.googlePlayGamesPlayerId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT GooglePlayGamesPlayFabIdPair::Copy(const PFAccountManagementGooglePlayGamesPlayFabIdPair& input, PFAccountManagementGooglePlayGamesPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesPlayerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesPlayerId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementGooglePlayGamesPlayFabIdPair*) + sizeof(PFAccountManagementGooglePlayGamesPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += GooglePlayGamesPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult& input, PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromKongregateIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromKongregateIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromKongregateIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "KongregateIDs", input.kongregateIDs, input.kongregateIDsCount); + return output; +} + +HRESULT KongregatePlayFabIdPair::FromJson(const JsonValue& input) +{ + String kongregateId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KongregateId", kongregateId)); + this->SetKongregateId(std::move(kongregateId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t KongregatePlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result KongregatePlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t KongregatePlayFabIdPair::RequiredBufferSize(const PFAccountManagementKongregatePlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.kongregateId) + { + requiredSize += (std::strlen(model.kongregateId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT KongregatePlayFabIdPair::Copy(const PFAccountManagementKongregatePlayFabIdPair& input, PFAccountManagementKongregatePlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.kongregateId); + RETURN_IF_FAILED(propCopyResult.hr); + output.kongregateId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromKongregateIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromKongregateIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromKongregateIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromKongregateIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromKongregateIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementKongregatePlayFabIdPair*) + sizeof(PFAccountManagementKongregatePlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += KongregatePlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromKongregateIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromKongregateIDsResult& input, PFAccountManagementGetPlayFabIDsFromKongregateIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromNintendoServiceAccountIdsRequest::ToJson() const +{ + return GetPlayFabIDsFromNintendoServiceAccountIdsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromNintendoServiceAccountIdsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "NintendoAccountIds", input.nintendoAccountIds, input.nintendoAccountIdsCount); + return output; +} + +HRESULT NintendoServiceAccountPlayFabIdPair::FromJson(const JsonValue& input) +{ + String nintendoServiceAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoServiceAccountId", nintendoServiceAccountId)); + this->SetNintendoServiceAccountId(std::move(nintendoServiceAccountId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t NintendoServiceAccountPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result NintendoServiceAccountPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t NintendoServiceAccountPlayFabIdPair::RequiredBufferSize(const PFAccountManagementNintendoServiceAccountPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.nintendoServiceAccountId) + { + requiredSize += (std::strlen(model.nintendoServiceAccountId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT NintendoServiceAccountPlayFabIdPair::Copy(const PFAccountManagementNintendoServiceAccountPlayFabIdPair& input, PFAccountManagementNintendoServiceAccountPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.nintendoServiceAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoServiceAccountId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromNintendoServiceAccountIdsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromNintendoServiceAccountIdsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromNintendoServiceAccountIdsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromNintendoServiceAccountIdsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementNintendoServiceAccountPlayFabIdPair*) + sizeof(PFAccountManagementNintendoServiceAccountPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += NintendoServiceAccountPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromNintendoServiceAccountIdsResult::Copy(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult& input, PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest::ToJson() const +{ + return GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "NintendoSwitchDeviceIds", input.nintendoSwitchDeviceIds, input.nintendoSwitchDeviceIdsCount); + return output; +} + +HRESULT NintendoSwitchPlayFabIdPair::FromJson(const JsonValue& input) +{ + String nintendoSwitchDeviceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchDeviceId", nintendoSwitchDeviceId)); + this->SetNintendoSwitchDeviceId(std::move(nintendoSwitchDeviceId)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t NintendoSwitchPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result NintendoSwitchPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t NintendoSwitchPlayFabIdPair::RequiredBufferSize(const PFAccountManagementNintendoSwitchPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.nintendoSwitchDeviceId) + { + requiredSize += (std::strlen(model.nintendoSwitchDeviceId) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT NintendoSwitchPlayFabIdPair::Copy(const PFAccountManagementNintendoSwitchPlayFabIdPair& input, PFAccountManagementNintendoSwitchPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchDeviceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchDeviceId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromNintendoSwitchDeviceIdsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromNintendoSwitchDeviceIdsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromNintendoSwitchDeviceIdsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromNintendoSwitchDeviceIdsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementNintendoSwitchPlayFabIdPair*) + sizeof(PFAccountManagementNintendoSwitchPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += NintendoSwitchPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromNintendoSwitchDeviceIdsResult::Copy(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult& input, PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromPSNAccountIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromPSNAccountIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromPSNAccountIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "IssuerId", input.issuerId); + JsonUtils::ObjectAddMemberArray(output, "PSNAccountIDs", input.PSNAccountIDs, input.PSNAccountIDsCount); + return output; +} + +HRESULT PSNAccountPlayFabIdPair::FromJson(const JsonValue& input) +{ + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + String PSNAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PSNAccountId", PSNAccountId)); + this->SetPSNAccountId(std::move(PSNAccountId)); + + return S_OK; +} + +size_t PSNAccountPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PSNAccountPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PSNAccountPlayFabIdPair::RequiredBufferSize(const PFAccountManagementPSNAccountPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.PSNAccountId) + { + requiredSize += (std::strlen(model.PSNAccountId) + 1); + } + return requiredSize; +} + +HRESULT PSNAccountPlayFabIdPair::Copy(const PFAccountManagementPSNAccountPlayFabIdPair& input, PFAccountManagementPSNAccountPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.PSNAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.PSNAccountId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromPSNAccountIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromPSNAccountIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromPSNAccountIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromPSNAccountIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementPSNAccountPlayFabIdPair*) + sizeof(PFAccountManagementPSNAccountPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += PSNAccountPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromPSNAccountIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult& input, PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromSteamIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromSteamIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromSteamIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromSteamIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "SteamStringIDs", input.steamStringIDs, input.steamStringIDsCount); + return output; +} + +HRESULT SteamPlayFabIdPair::FromJson(const JsonValue& input) +{ + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + String steamStringId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamStringId", steamStringId)); + this->SetSteamStringId(std::move(steamStringId)); + + return S_OK; +} + +size_t SteamPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SteamPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SteamPlayFabIdPair::RequiredBufferSize(const PFAccountManagementSteamPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.steamStringId) + { + requiredSize += (std::strlen(model.steamStringId) + 1); + } + return requiredSize; +} + +HRESULT SteamPlayFabIdPair::Copy(const PFAccountManagementSteamPlayFabIdPair& input, PFAccountManagementSteamPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamStringId); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamStringId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromSteamIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromSteamIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromSteamIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromSteamIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromSteamIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementSteamPlayFabIdPair*) + sizeof(PFAccountManagementSteamPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += SteamPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromSteamIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromSteamIDsResult& input, PFAccountManagementGetPlayFabIDsFromSteamIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromTwitchIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromTwitchIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromTwitchIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "TwitchIds", input.twitchIds, input.twitchIdsCount); + return output; +} + +HRESULT TwitchPlayFabIdPair::FromJson(const JsonValue& input) +{ + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + String twitchId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TwitchId", twitchId)); + this->SetTwitchId(std::move(twitchId)); + + return S_OK; +} + +size_t TwitchPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TwitchPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TwitchPlayFabIdPair::RequiredBufferSize(const PFAccountManagementTwitchPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.twitchId) + { + requiredSize += (std::strlen(model.twitchId) + 1); + } + return requiredSize; +} + +HRESULT TwitchPlayFabIdPair::Copy(const PFAccountManagementTwitchPlayFabIdPair& input, PFAccountManagementTwitchPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.twitchId); + RETURN_IF_FAILED(propCopyResult.hr); + output.twitchId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromTwitchIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromTwitchIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromTwitchIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromTwitchIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromTwitchIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementTwitchPlayFabIdPair*) + sizeof(PFAccountManagementTwitchPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += TwitchPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromTwitchIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromTwitchIDsResult& input, PFAccountManagementGetPlayFabIDsFromTwitchIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayFabIDsFromXboxLiveIDsRequest::ToJson() const +{ + return GetPlayFabIDsFromXboxLiveIDsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayFabIDsFromXboxLiveIDsRequest::ToJson(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Sandbox", input.sandbox); + JsonUtils::ObjectAddMemberArray(output, "XboxLiveAccountIDs", input.xboxLiveAccountIDs, input.xboxLiveAccountIDsCount); + return output; +} + +HRESULT XboxLiveAccountPlayFabIdPair::FromJson(const JsonValue& input) +{ + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + String xboxLiveAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxLiveAccountId", xboxLiveAccountId)); + this->SetXboxLiveAccountId(std::move(xboxLiveAccountId)); + + return S_OK; +} + +size_t XboxLiveAccountPlayFabIdPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result XboxLiveAccountPlayFabIdPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t XboxLiveAccountPlayFabIdPair::RequiredBufferSize(const PFAccountManagementXboxLiveAccountPlayFabIdPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.xboxLiveAccountId) + { + requiredSize += (std::strlen(model.xboxLiveAccountId) + 1); + } + return requiredSize; +} + +HRESULT XboxLiveAccountPlayFabIdPair::Copy(const PFAccountManagementXboxLiveAccountPlayFabIdPair& input, PFAccountManagementXboxLiveAccountPlayFabIdPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.xboxLiveAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxLiveAccountId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayFabIDsFromXboxLiveIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPlayFabIDsFromXboxLiveIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayFabIDsFromXboxLiveIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayFabIDsFromXboxLiveIDsResult::RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementXboxLiveAccountPlayFabIdPair*) + sizeof(PFAccountManagementXboxLiveAccountPlayFabIdPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += XboxLiveAccountPlayFabIdPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetPlayFabIDsFromXboxLiveIDsResult::Copy(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult& input, PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue LinkAndroidDeviceIDRequest::ToJson() const +{ + return LinkAndroidDeviceIDRequest::ToJson(this->Model()); +} + +JsonValue LinkAndroidDeviceIDRequest::ToJson(const PFAccountManagementLinkAndroidDeviceIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AndroidDevice", input.androidDevice); + JsonUtils::ObjectAddMember(output, "AndroidDeviceId", input.androidDeviceId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "OS", input.OS); + return output; +} + +JsonValue LinkAppleRequest::ToJson() const +{ + return LinkAppleRequest::ToJson(this->Model()); +} + +JsonValue LinkAppleRequest::ToJson(const PFAccountManagementLinkAppleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "IdentityToken", input.identityToken); + return output; +} + +JsonValue LinkCustomIDRequest::ToJson() const +{ + return LinkCustomIDRequest::ToJson(this->Model()); +} + +JsonValue LinkCustomIDRequest::ToJson(const PFAccountManagementLinkCustomIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CustomId", input.customId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + return output; +} + +JsonValue LinkFacebookAccountRequest::ToJson() const +{ + return LinkFacebookAccountRequest::ToJson(this->Model()); +} + +JsonValue LinkFacebookAccountRequest::ToJson(const PFAccountManagementLinkFacebookAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AccessToken", input.accessToken); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + return output; +} + +JsonValue LinkFacebookInstantGamesIdRequest::ToJson() const +{ + return LinkFacebookInstantGamesIdRequest::ToJson(this->Model()); +} + +JsonValue LinkFacebookInstantGamesIdRequest::ToJson(const PFAccountManagementLinkFacebookInstantGamesIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "FacebookInstantGamesSignature", input.facebookInstantGamesSignature); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + return output; +} + +JsonValue LinkGameCenterAccountRequest::ToJson() const +{ + return LinkGameCenterAccountRequest::ToJson(this->Model()); +} + +JsonValue LinkGameCenterAccountRequest::ToJson(const PFAccountManagementLinkGameCenterAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "GameCenterId", input.gameCenterId); + JsonUtils::ObjectAddMember(output, "PublicKeyUrl", input.publicKeyUrl); + JsonUtils::ObjectAddMember(output, "Salt", input.salt); + JsonUtils::ObjectAddMember(output, "Signature", input.signature); + JsonUtils::ObjectAddMember(output, "Timestamp", input.timestamp); + return output; +} + +JsonValue LinkGoogleAccountRequest::ToJson() const +{ + return LinkGoogleAccountRequest::ToJson(this->Model()); +} + +JsonValue LinkGoogleAccountRequest::ToJson(const PFAccountManagementLinkGoogleAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "ServerAuthCode", input.serverAuthCode); + return output; +} + +JsonValue LinkGooglePlayGamesServicesAccountRequest::ToJson() const +{ + return LinkGooglePlayGamesServicesAccountRequest::ToJson(this->Model()); +} + +JsonValue LinkGooglePlayGamesServicesAccountRequest::ToJson(const PFAccountManagementLinkGooglePlayGamesServicesAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "ServerAuthCode", input.serverAuthCode); + return output; +} + +JsonValue LinkIOSDeviceIDRequest::ToJson() const +{ + return LinkIOSDeviceIDRequest::ToJson(this->Model()); +} + +JsonValue LinkIOSDeviceIDRequest::ToJson(const PFAccountManagementLinkIOSDeviceIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DeviceId", input.deviceId); + JsonUtils::ObjectAddMember(output, "DeviceModel", input.deviceModel); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "OS", input.OS); + return output; +} + +JsonValue LinkKongregateAccountRequest::ToJson() const +{ + return LinkKongregateAccountRequest::ToJson(this->Model()); +} + +JsonValue LinkKongregateAccountRequest::ToJson(const PFAccountManagementLinkKongregateAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AuthTicket", input.authTicket); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "KongregateId", input.kongregateId); + return output; +} + +JsonValue ClientLinkNintendoServiceAccountRequest::ToJson() const +{ + return ClientLinkNintendoServiceAccountRequest::ToJson(this->Model()); +} + +JsonValue ClientLinkNintendoServiceAccountRequest::ToJson(const PFAccountManagementClientLinkNintendoServiceAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "IdentityToken", input.identityToken); + return output; +} + +JsonValue ClientLinkNintendoSwitchDeviceIdRequest::ToJson() const +{ + return ClientLinkNintendoSwitchDeviceIdRequest::ToJson(this->Model()); +} + +JsonValue ClientLinkNintendoSwitchDeviceIdRequest::ToJson(const PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "NintendoSwitchDeviceId", input.nintendoSwitchDeviceId); + return output; +} + +JsonValue LinkOpenIdConnectRequest::ToJson() const +{ + return LinkOpenIdConnectRequest::ToJson(this->Model()); +} + +JsonValue LinkOpenIdConnectRequest::ToJson(const PFAccountManagementLinkOpenIdConnectRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ConnectionId", input.connectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "IdToken", input.idToken); + return output; +} + +JsonValue ClientLinkPSNAccountRequest::ToJson() const +{ + return ClientLinkPSNAccountRequest::ToJson(this->Model()); +} + +JsonValue ClientLinkPSNAccountRequest::ToJson(const PFAccountManagementClientLinkPSNAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AuthCode", input.authCode); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "IssuerId", input.issuerId); + JsonUtils::ObjectAddMember(output, "RedirectUri", input.redirectUri); + return output; +} + +JsonValue LinkSteamAccountRequest::ToJson() const +{ + return LinkSteamAccountRequest::ToJson(this->Model()); +} + +JsonValue LinkSteamAccountRequest::ToJson(const PFAccountManagementLinkSteamAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "SteamTicket", input.steamTicket); + JsonUtils::ObjectAddMember(output, "TicketIsServiceSpecific", input.ticketIsServiceSpecific); + return output; +} + +JsonValue LinkTwitchAccountRequest::ToJson() const +{ + return LinkTwitchAccountRequest::ToJson(this->Model()); +} + +JsonValue LinkTwitchAccountRequest::ToJson(const PFAccountManagementLinkTwitchAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AccessToken", input.accessToken); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + return output; +} + +JsonValue ClientLinkXboxAccountRequest::ToJson() const +{ + return ClientLinkXboxAccountRequest::ToJson(this->Model()); +} + +JsonValue ClientLinkXboxAccountRequest::ToJson(const PFAccountManagementClientLinkXboxAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); +#if HC_PLATFORM != HC_PLATFORM_GDK + JsonUtils::ObjectAddMember(output, "XboxToken", input.xboxToken); +#endif + return output; +} + +JsonValue RemoveContactEmailRequest::ToJson() const +{ + return RemoveContactEmailRequest::ToJson(this->Model()); +} + +JsonValue RemoveContactEmailRequest::ToJson(const PFAccountManagementRemoveContactEmailRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue ReportPlayerClientRequest::ToJson() const +{ + return ReportPlayerClientRequest::ToJson(this->Model()); +} + +JsonValue ReportPlayerClientRequest::ToJson(const PFAccountManagementReportPlayerClientRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Comment", input.comment); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ReporteeId", input.reporteeId); + return output; +} + +HRESULT ReportPlayerClientResult::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SubmissionsRemaining", this->m_model.submissionsRemaining)); + + return S_OK; +} + +size_t ReportPlayerClientResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ReportPlayerClientResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ReportPlayerClientResult::RequiredBufferSize(const PFAccountManagementReportPlayerClientResult& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT ReportPlayerClientResult::Copy(const PFAccountManagementReportPlayerClientResult& input, PFAccountManagementReportPlayerClientResult& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +JsonValue SendAccountRecoveryEmailRequest::ToJson() const +{ + return SendAccountRecoveryEmailRequest::ToJson(this->Model()); +} + +JsonValue SendAccountRecoveryEmailRequest::ToJson(const PFAccountManagementSendAccountRecoveryEmailRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Email", input.email); + JsonUtils::ObjectAddMember(output, "EmailTemplateId", input.emailTemplateId); + JsonUtils::ObjectAddMember(output, "TitleId", input.titleId); + return output; +} + +JsonValue UnlinkAndroidDeviceIDRequest::ToJson() const +{ + return UnlinkAndroidDeviceIDRequest::ToJson(this->Model()); +} + +JsonValue UnlinkAndroidDeviceIDRequest::ToJson(const PFAccountManagementUnlinkAndroidDeviceIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AndroidDeviceId", input.androidDeviceId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkAppleRequest::ToJson() const +{ + return UnlinkAppleRequest::ToJson(this->Model()); +} + +JsonValue UnlinkAppleRequest::ToJson(const PFAccountManagementUnlinkAppleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkCustomIDRequest::ToJson() const +{ + return UnlinkCustomIDRequest::ToJson(this->Model()); +} + +JsonValue UnlinkCustomIDRequest::ToJson(const PFAccountManagementUnlinkCustomIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CustomId", input.customId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkFacebookAccountRequest::ToJson() const +{ + return UnlinkFacebookAccountRequest::ToJson(this->Model()); +} + +JsonValue UnlinkFacebookAccountRequest::ToJson(const PFAccountManagementUnlinkFacebookAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkFacebookInstantGamesIdRequest::ToJson() const +{ + return UnlinkFacebookInstantGamesIdRequest::ToJson(this->Model()); +} + +JsonValue UnlinkFacebookInstantGamesIdRequest::ToJson(const PFAccountManagementUnlinkFacebookInstantGamesIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "FacebookInstantGamesId", input.facebookInstantGamesId); + return output; +} + +JsonValue UnlinkGameCenterAccountRequest::ToJson() const +{ + return UnlinkGameCenterAccountRequest::ToJson(this->Model()); +} + +JsonValue UnlinkGameCenterAccountRequest::ToJson(const PFAccountManagementUnlinkGameCenterAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkGoogleAccountRequest::ToJson() const +{ + return UnlinkGoogleAccountRequest::ToJson(this->Model()); +} + +JsonValue UnlinkGoogleAccountRequest::ToJson(const PFAccountManagementUnlinkGoogleAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkGooglePlayGamesServicesAccountRequest::ToJson() const +{ + return UnlinkGooglePlayGamesServicesAccountRequest::ToJson(this->Model()); +} + +JsonValue UnlinkGooglePlayGamesServicesAccountRequest::ToJson(const PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkIOSDeviceIDRequest::ToJson() const +{ + return UnlinkIOSDeviceIDRequest::ToJson(this->Model()); +} + +JsonValue UnlinkIOSDeviceIDRequest::ToJson(const PFAccountManagementUnlinkIOSDeviceIDRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DeviceId", input.deviceId); + return output; +} + +JsonValue UnlinkKongregateAccountRequest::ToJson() const +{ + return UnlinkKongregateAccountRequest::ToJson(this->Model()); +} + +JsonValue UnlinkKongregateAccountRequest::ToJson(const PFAccountManagementUnlinkKongregateAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue ClientUnlinkNintendoServiceAccountRequest::ToJson() const +{ + return ClientUnlinkNintendoServiceAccountRequest::ToJson(this->Model()); +} + +JsonValue ClientUnlinkNintendoServiceAccountRequest::ToJson(const PFAccountManagementClientUnlinkNintendoServiceAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue ClientUnlinkNintendoSwitchDeviceIdRequest::ToJson() const +{ + return ClientUnlinkNintendoSwitchDeviceIdRequest::ToJson(this->Model()); +} + +JsonValue ClientUnlinkNintendoSwitchDeviceIdRequest::ToJson(const PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "NintendoSwitchDeviceId", input.nintendoSwitchDeviceId); + return output; +} + +JsonValue UnlinkOpenIdConnectRequest::ToJson() const +{ + return UnlinkOpenIdConnectRequest::ToJson(this->Model()); +} + +JsonValue UnlinkOpenIdConnectRequest::ToJson(const PFAccountManagementUnlinkOpenIdConnectRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ConnectionId", input.connectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue ClientUnlinkPSNAccountRequest::ToJson() const +{ + return ClientUnlinkPSNAccountRequest::ToJson(this->Model()); +} + +JsonValue ClientUnlinkPSNAccountRequest::ToJson(const PFAccountManagementClientUnlinkPSNAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkSteamAccountRequest::ToJson() const +{ + return UnlinkSteamAccountRequest::ToJson(this->Model()); +} + +JsonValue UnlinkSteamAccountRequest::ToJson(const PFAccountManagementUnlinkSteamAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UnlinkTwitchAccountRequest::ToJson() const +{ + return UnlinkTwitchAccountRequest::ToJson(this->Model()); +} + +JsonValue UnlinkTwitchAccountRequest::ToJson(const PFAccountManagementUnlinkTwitchAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AccessToken", input.accessToken); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue ClientUnlinkXboxAccountRequest::ToJson() const +{ + return ClientUnlinkXboxAccountRequest::ToJson(this->Model()); +} + +JsonValue ClientUnlinkXboxAccountRequest::ToJson(const PFAccountManagementClientUnlinkXboxAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue ClientUpdateAvatarUrlRequest::ToJson() const +{ + return ClientUpdateAvatarUrlRequest::ToJson(this->Model()); +} + +JsonValue ClientUpdateAvatarUrlRequest::ToJson(const PFAccountManagementClientUpdateAvatarUrlRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ImageUrl", input.imageUrl); + return output; +} + +JsonValue UpdateUserTitleDisplayNameRequest::ToJson() const +{ + return UpdateUserTitleDisplayNameRequest::ToJson(this->Model()); +} + +JsonValue UpdateUserTitleDisplayNameRequest::ToJson(const PFAccountManagementUpdateUserTitleDisplayNameRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DisplayName", input.displayName); + return output; +} + +HRESULT UpdateUserTitleDisplayNameResult::FromJson(const JsonValue& input) +{ + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + return S_OK; +} + +size_t UpdateUserTitleDisplayNameResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateUserTitleDisplayNameResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateUserTitleDisplayNameResult::RequiredBufferSize(const PFAccountManagementUpdateUserTitleDisplayNameResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + return requiredSize; +} + +HRESULT UpdateUserTitleDisplayNameResult::Copy(const PFAccountManagementUpdateUserTitleDisplayNameResult& input, PFAccountManagementUpdateUserTitleDisplayNameResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue BanRequest::ToJson() const +{ + return BanRequest::ToJson(this->Model()); +} + +JsonValue BanRequest::ToJson(const PFAccountManagementBanRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "DurationInHours", input.durationInHours); + JsonUtils::ObjectAddMember(output, "IPAddress", input.IPAddress); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "Reason", input.reason); + return output; +} + +JsonValue BanUsersRequest::ToJson() const +{ + return BanUsersRequest::ToJson(this->Model()); +} + +JsonValue BanUsersRequest::ToJson(const PFAccountManagementBanUsersRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Bans", input.bans, input.bansCount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +HRESULT BanInfo::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Active", this->m_model.active)); + + String banId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BanId", banId)); + this->SetBanId(std::move(banId)); + + std::optional created{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", created)); + this->SetCreated(std::move(created)); + + std::optional expires{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expires", expires)); + this->SetExpires(std::move(expires)); + + String IPAddress{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IPAddress", IPAddress)); + this->SetIPAddress(std::move(IPAddress)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + String reason{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Reason", reason)); + this->SetReason(std::move(reason)); + + return S_OK; +} + +size_t BanInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result BanInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t BanInfo::RequiredBufferSize(const PFAccountManagementBanInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.banId) + { + requiredSize += (std::strlen(model.banId) + 1); + } + if (model.created) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.expires) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.IPAddress) + { + requiredSize += (std::strlen(model.IPAddress) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.reason) + { + requiredSize += (std::strlen(model.reason) + 1); + } + return requiredSize; +} + +HRESULT BanInfo::Copy(const PFAccountManagementBanInfo& input, PFAccountManagementBanInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.banId); + RETURN_IF_FAILED(propCopyResult.hr); + output.banId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.created); + RETURN_IF_FAILED(propCopyResult.hr); + output.created = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.expires); + RETURN_IF_FAILED(propCopyResult.hr); + output.expires = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.IPAddress); + RETURN_IF_FAILED(propCopyResult.hr); + output.IPAddress = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.reason); + RETURN_IF_FAILED(propCopyResult.hr); + output.reason = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT BanUsersResult::FromJson(const JsonValue& input) +{ + ModelVector banData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BanData", banData)); + this->SetBanData(std::move(banData)); + + return S_OK; +} + +size_t BanUsersResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result BanUsersResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t BanUsersResult::RequiredBufferSize(const PFAccountManagementBanUsersResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementBanInfo*) + sizeof(PFAccountManagementBanInfo*) * model.banDataCount); + for (size_t i = 0; i < model.banDataCount; ++i) + { + requiredSize += BanInfo::RequiredBufferSize(*model.banData[i]); + } + return requiredSize; +} + +HRESULT BanUsersResult::Copy(const PFAccountManagementBanUsersResult& input, PFAccountManagementBanUsersResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.banData, input.banDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.banData = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeletePlayerRequest::ToJson() const +{ + return DeletePlayerRequest::ToJson(this->Model()); +} + +JsonValue DeletePlayerRequest::ToJson(const PFAccountManagementDeletePlayerRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue GetServerCustomIDsFromPlayFabIDsRequest::ToJson() const +{ + return GetServerCustomIDsFromPlayFabIDsRequest::ToJson(this->Model()); +} + +JsonValue GetServerCustomIDsFromPlayFabIDsRequest::ToJson(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "PlayFabIDs", input.playFabIDs, input.playFabIDsCount); + return output; +} + +HRESULT ServerCustomIDPlayFabIDPair::FromJson(const JsonValue& input) +{ + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + String serverCustomId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ServerCustomId", serverCustomId)); + this->SetServerCustomId(std::move(serverCustomId)); + + return S_OK; +} + +size_t ServerCustomIDPlayFabIDPair::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ServerCustomIDPlayFabIDPair::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ServerCustomIDPlayFabIDPair::RequiredBufferSize(const PFAccountManagementServerCustomIDPlayFabIDPair& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.serverCustomId) + { + requiredSize += (std::strlen(model.serverCustomId) + 1); + } + return requiredSize; +} + +HRESULT ServerCustomIDPlayFabIDPair::Copy(const PFAccountManagementServerCustomIDPlayFabIDPair& input, PFAccountManagementServerCustomIDPlayFabIDPair& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.serverCustomId); + RETURN_IF_FAILED(propCopyResult.hr); + output.serverCustomId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetServerCustomIDsFromPlayFabIDsResult::FromJson(const JsonValue& input) +{ + ModelVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetServerCustomIDsFromPlayFabIDsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetServerCustomIDsFromPlayFabIDsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetServerCustomIDsFromPlayFabIDsResult::RequiredBufferSize(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementServerCustomIDPlayFabIDPair*) + sizeof(PFAccountManagementServerCustomIDPlayFabIDPair*) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += ServerCustomIDPlayFabIDPair::RequiredBufferSize(*model.data[i]); + } + return requiredSize; +} + +HRESULT GetServerCustomIDsFromPlayFabIDsResult::Copy(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult& input, PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetUserAccountInfoRequest::ToJson() const +{ + return GetUserAccountInfoRequest::ToJson(this->Model()); +} + +JsonValue GetUserAccountInfoRequest::ToJson(const PFAccountManagementGetUserAccountInfoRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT GetUserAccountInfoResult::FromJson(const JsonValue& input) +{ + std::optional userInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserInfo", userInfo)); + if (userInfo) + { + this->SetUserInfo(std::move(*userInfo)); + } + + return S_OK; +} + +size_t GetUserAccountInfoResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetUserAccountInfoResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetUserAccountInfoResult::RequiredBufferSize(const PFAccountManagementGetUserAccountInfoResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.userInfo) + { + requiredSize += UserAccountInfo::RequiredBufferSize(*model.userInfo); + } + return requiredSize; +} + +HRESULT GetUserAccountInfoResult::Copy(const PFAccountManagementGetUserAccountInfoResult& input, PFAccountManagementGetUserAccountInfoResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.userInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.userInfo = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetUserBansRequest::ToJson() const +{ + return GetUserBansRequest::ToJson(this->Model()); +} + +JsonValue GetUserBansRequest::ToJson(const PFAccountManagementGetUserBansRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT GetUserBansResult::FromJson(const JsonValue& input) +{ + ModelVector banData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BanData", banData)); + this->SetBanData(std::move(banData)); + + return S_OK; +} + +size_t GetUserBansResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetUserBansResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetUserBansResult::RequiredBufferSize(const PFAccountManagementGetUserBansResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementBanInfo*) + sizeof(PFAccountManagementBanInfo*) * model.banDataCount); + for (size_t i = 0; i < model.banDataCount; ++i) + { + requiredSize += BanInfo::RequiredBufferSize(*model.banData[i]); + } + return requiredSize; +} + +HRESULT GetUserBansResult::Copy(const PFAccountManagementGetUserBansResult& input, PFAccountManagementGetUserBansResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.banData, input.banDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.banData = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ServerLinkNintendoServiceAccountRequest::ToJson() const +{ + return ServerLinkNintendoServiceAccountRequest::ToJson(this->Model()); +} + +JsonValue ServerLinkNintendoServiceAccountRequest::ToJson(const PFAccountManagementServerLinkNintendoServiceAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "IdentityToken", input.identityToken); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerLinkNintendoSwitchDeviceIdRequest::ToJson() const +{ + return ServerLinkNintendoSwitchDeviceIdRequest::ToJson(this->Model()); +} + +JsonValue ServerLinkNintendoSwitchDeviceIdRequest::ToJson(const PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "NintendoSwitchDeviceId", input.nintendoSwitchDeviceId); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerLinkPSNAccountRequest::ToJson() const +{ + return ServerLinkPSNAccountRequest::ToJson(this->Model()); +} + +JsonValue ServerLinkPSNAccountRequest::ToJson(const PFAccountManagementServerLinkPSNAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AuthCode", input.authCode); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "IssuerId", input.issuerId); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "RedirectUri", input.redirectUri); + return output; +} + +JsonValue LinkPSNIdRequest::ToJson() const +{ + return LinkPSNIdRequest::ToJson(this->Model()); +} + +JsonValue LinkPSNIdRequest::ToJson(const PFAccountManagementLinkPSNIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "IssuerId", input.issuerId); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "PSNUserId", input.PSNUserId); + return output; +} + +JsonValue LinkServerCustomIdRequest::ToJson() const +{ + return LinkServerCustomIdRequest::ToJson(this->Model()); +} + +JsonValue LinkServerCustomIdRequest::ToJson(const PFAccountManagementLinkServerCustomIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "ServerCustomId", input.serverCustomId); + return output; +} + +JsonValue LinkSteamIdRequest::ToJson() const +{ + return LinkSteamIdRequest::ToJson(this->Model()); +} + +JsonValue LinkSteamIdRequest::ToJson(const PFAccountManagementLinkSteamIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "SteamId", input.steamId); + return output; +} + +JsonValue ServerLinkXboxAccountRequest::ToJson() const +{ + return ServerLinkXboxAccountRequest::ToJson(this->Model()); +} + +JsonValue ServerLinkXboxAccountRequest::ToJson(const PFAccountManagementServerLinkXboxAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ForceLink", input.forceLink); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "XboxToken", input.xboxToken); + return output; +} + +JsonValue RevokeAllBansForUserRequest::ToJson() const +{ + return RevokeAllBansForUserRequest::ToJson(this->Model()); +} + +JsonValue RevokeAllBansForUserRequest::ToJson(const PFAccountManagementRevokeAllBansForUserRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT RevokeAllBansForUserResult::FromJson(const JsonValue& input) +{ + ModelVector banData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BanData", banData)); + this->SetBanData(std::move(banData)); + + return S_OK; +} + +size_t RevokeAllBansForUserResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RevokeAllBansForUserResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RevokeAllBansForUserResult::RequiredBufferSize(const PFAccountManagementRevokeAllBansForUserResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementBanInfo*) + sizeof(PFAccountManagementBanInfo*) * model.banDataCount); + for (size_t i = 0; i < model.banDataCount; ++i) + { + requiredSize += BanInfo::RequiredBufferSize(*model.banData[i]); + } + return requiredSize; +} + +HRESULT RevokeAllBansForUserResult::Copy(const PFAccountManagementRevokeAllBansForUserResult& input, PFAccountManagementRevokeAllBansForUserResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.banData, input.banDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.banData = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RevokeBansRequest::ToJson() const +{ + return RevokeBansRequest::ToJson(this->Model()); +} + +JsonValue RevokeBansRequest::ToJson(const PFAccountManagementRevokeBansRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "BanIds", input.banIds, input.banIdsCount); + return output; +} + +HRESULT RevokeBansResult::FromJson(const JsonValue& input) +{ + ModelVector banData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BanData", banData)); + this->SetBanData(std::move(banData)); + + return S_OK; +} + +size_t RevokeBansResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RevokeBansResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RevokeBansResult::RequiredBufferSize(const PFAccountManagementRevokeBansResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementBanInfo*) + sizeof(PFAccountManagementBanInfo*) * model.banDataCount); + for (size_t i = 0; i < model.banDataCount; ++i) + { + requiredSize += BanInfo::RequiredBufferSize(*model.banData[i]); + } + return requiredSize; +} + +HRESULT RevokeBansResult::Copy(const PFAccountManagementRevokeBansResult& input, PFAccountManagementRevokeBansResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.banData, input.banDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.banData = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SendCustomAccountRecoveryEmailRequest::ToJson() const +{ + return SendCustomAccountRecoveryEmailRequest::ToJson(this->Model()); +} + +JsonValue SendCustomAccountRecoveryEmailRequest::ToJson(const PFAccountManagementSendCustomAccountRecoveryEmailRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Email", input.email); + JsonUtils::ObjectAddMember(output, "EmailTemplateId", input.emailTemplateId); + JsonUtils::ObjectAddMember(output, "Username", input.username); + return output; +} + +JsonValue SendEmailFromTemplateRequest::ToJson() const +{ + return SendEmailFromTemplateRequest::ToJson(this->Model()); +} + +JsonValue SendEmailFromTemplateRequest::ToJson(const PFAccountManagementSendEmailFromTemplateRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "EmailTemplateId", input.emailTemplateId); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerUnlinkNintendoServiceAccountRequest::ToJson() const +{ + return ServerUnlinkNintendoServiceAccountRequest::ToJson(this->Model()); +} + +JsonValue ServerUnlinkNintendoServiceAccountRequest::ToJson(const PFAccountManagementServerUnlinkNintendoServiceAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerUnlinkNintendoSwitchDeviceIdRequest::ToJson() const +{ + return ServerUnlinkNintendoSwitchDeviceIdRequest::ToJson(this->Model()); +} + +JsonValue ServerUnlinkNintendoSwitchDeviceIdRequest::ToJson(const PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "NintendoSwitchDeviceId", input.nintendoSwitchDeviceId); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerUnlinkPSNAccountRequest::ToJson() const +{ + return ServerUnlinkPSNAccountRequest::ToJson(this->Model()); +} + +JsonValue ServerUnlinkPSNAccountRequest::ToJson(const PFAccountManagementServerUnlinkPSNAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue UnlinkServerCustomIdRequest::ToJson() const +{ + return UnlinkServerCustomIdRequest::ToJson(this->Model()); +} + +JsonValue UnlinkServerCustomIdRequest::ToJson(const PFAccountManagementUnlinkServerCustomIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "ServerCustomId", input.serverCustomId); + return output; +} + +JsonValue UnlinkSteamIdRequest::ToJson() const +{ + return UnlinkSteamIdRequest::ToJson(this->Model()); +} + +JsonValue UnlinkSteamIdRequest::ToJson(const PFAccountManagementUnlinkSteamIdRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerUnlinkXboxAccountRequest::ToJson() const +{ + return ServerUnlinkXboxAccountRequest::ToJson(this->Model()); +} + +JsonValue ServerUnlinkXboxAccountRequest::ToJson(const PFAccountManagementServerUnlinkXboxAccountRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerUpdateAvatarUrlRequest::ToJson() const +{ + return ServerUpdateAvatarUrlRequest::ToJson(this->Model()); +} + +JsonValue ServerUpdateAvatarUrlRequest::ToJson(const PFAccountManagementServerUpdateAvatarUrlRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ImageUrl", input.imageUrl); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue UpdateBanRequest::ToJson() const +{ + return UpdateBanRequest::ToJson(this->Model()); +} + +JsonValue UpdateBanRequest::ToJson(const PFAccountManagementUpdateBanRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Active", input.active); + JsonUtils::ObjectAddMember(output, "BanId", input.banId); + JsonUtils::ObjectAddMemberTime(output, "Expires", input.expires); + JsonUtils::ObjectAddMember(output, "IPAddress", input.IPAddress); + JsonUtils::ObjectAddMember(output, "Permanent", input.permanent); + JsonUtils::ObjectAddMember(output, "Reason", input.reason); + return output; +} + +JsonValue UpdateBansRequest::ToJson() const +{ + return UpdateBansRequest::ToJson(this->Model()); +} + +JsonValue UpdateBansRequest::ToJson(const PFAccountManagementUpdateBansRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Bans", input.bans, input.bansCount); + return output; +} + +HRESULT UpdateBansResult::FromJson(const JsonValue& input) +{ + ModelVector banData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BanData", banData)); + this->SetBanData(std::move(banData)); + + return S_OK; +} + +size_t UpdateBansResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateBansResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateBansResult::RequiredBufferSize(const PFAccountManagementUpdateBansResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAccountManagementBanInfo*) + sizeof(PFAccountManagementBanInfo*) * model.banDataCount); + for (size_t i = 0; i < model.banDataCount; ++i) + { + requiredSize += BanInfo::RequiredBufferSize(*model.banData[i]); + } + return requiredSize; +} + +HRESULT UpdateBansResult::Copy(const PFAccountManagementUpdateBansResult& input, PFAccountManagementUpdateBansResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.banData, input.banDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.banData = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetTitlePlayersFromXboxLiveIDsRequest::ToJson() const +{ + return GetTitlePlayersFromXboxLiveIDsRequest::ToJson(this->Model()); +} + +JsonValue GetTitlePlayersFromXboxLiveIDsRequest::ToJson(const PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Sandbox", input.sandbox); + JsonUtils::ObjectAddMember(output, "TitleId", input.titleId); + JsonUtils::ObjectAddMemberArray(output, "XboxLiveIds", input.xboxLiveIds, input.xboxLiveIdsCount); + return output; +} + +HRESULT GetTitlePlayersFromProviderIDsResponse::FromJson(const JsonValue& input) +{ + ModelDictionaryEntryVector titlePlayerAccounts{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitlePlayerAccounts", titlePlayerAccounts)); + this->SetTitlePlayerAccounts(std::move(titlePlayerAccounts)); + + return S_OK; +} + +size_t GetTitlePlayersFromProviderIDsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTitlePlayersFromProviderIDsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTitlePlayersFromProviderIDsResponse::RequiredBufferSize(const PFAccountManagementGetTitlePlayersFromProviderIDsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFEntityLineageDictionaryEntry) + sizeof(PFEntityLineageDictionaryEntry) * model.titlePlayerAccountsCount); + for (size_t i = 0; i < model.titlePlayerAccountsCount; ++i) + { + requiredSize += (std::strlen(model.titlePlayerAccounts[i].key) + 1); + requiredSize += EntityLineage::RequiredBufferSize(*model.titlePlayerAccounts[i].value); + } + return requiredSize; +} + +HRESULT GetTitlePlayersFromProviderIDsResponse::Copy(const PFAccountManagementGetTitlePlayersFromProviderIDsResponse& input, PFAccountManagementGetTitlePlayersFromProviderIDsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToDictionary(input.titlePlayerAccounts, input.titlePlayerAccountsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.titlePlayerAccounts = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace AccountManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/AccountManagementTypes.h b/Source/PlayFabServices/Source/Generated/AccountManagementTypes.h new file mode 100644 index 0000000..1fe3cbb --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/AccountManagementTypes.h @@ -0,0 +1,1937 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace AccountManagement +{ + +// AccountManagement Classes +class AddOrUpdateContactEmailRequest : public Wrappers::PFAccountManagementAddOrUpdateContactEmailRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementAddOrUpdateContactEmailRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementAddOrUpdateContactEmailRequest& input); +}; + +class AddUsernamePasswordRequest : public Wrappers::PFAccountManagementAddUsernamePasswordRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementAddUsernamePasswordRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementAddUsernamePasswordRequest& input); +}; + +class AddUsernamePasswordResult : public Wrappers::PFAccountManagementAddUsernamePasswordResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementAddUsernamePasswordResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementAddUsernamePasswordResult& model); + static HRESULT Copy(const PFAccountManagementAddUsernamePasswordResult& input, PFAccountManagementAddUsernamePasswordResult& output, ModelBuffer& buffer); +}; + +class GetAccountInfoRequest : public Wrappers::PFAccountManagementGetAccountInfoRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetAccountInfoRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetAccountInfoRequest& input); +}; + +class GetAccountInfoResult : public Wrappers::PFAccountManagementGetAccountInfoResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetAccountInfoResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetAccountInfoResult& model); + static HRESULT Copy(const PFAccountManagementGetAccountInfoResult& input, PFAccountManagementGetAccountInfoResult& output, ModelBuffer& buffer); +}; + +class GetPlayerCombinedInfoRequest : public Wrappers::PFAccountManagementGetPlayerCombinedInfoRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayerCombinedInfoRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayerCombinedInfoRequest& input); +}; + +class GetPlayerCombinedInfoResult : public Wrappers::PFAccountManagementGetPlayerCombinedInfoResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayerCombinedInfoResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayerCombinedInfoResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayerCombinedInfoResult& input, PFAccountManagementGetPlayerCombinedInfoResult& output, ModelBuffer& buffer); +}; + +class GetPlayerProfileRequest : public Wrappers::PFAccountManagementGetPlayerProfileRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayerProfileRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayerProfileRequest& input); +}; + +class GetPlayerProfileResult : public Wrappers::PFAccountManagementGetPlayerProfileResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayerProfileResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayerProfileResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayerProfileResult& input, PFAccountManagementGetPlayerProfileResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromFacebookIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest& input); +}; + +class FacebookPlayFabIdPair : public Wrappers::PFAccountManagementFacebookPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementFacebookPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementFacebookPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementFacebookPlayFabIdPair& input, PFAccountManagementFacebookPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromFacebookIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromFacebookIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromFacebookIDsResult& input, PFAccountManagementGetPlayFabIDsFromFacebookIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromFacebookInstantGamesIdsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest& input); +}; + +class FacebookInstantGamesPlayFabIdPair : public Wrappers::PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementFacebookInstantGamesPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementFacebookInstantGamesPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementFacebookInstantGamesPlayFabIdPair& input, PFAccountManagementFacebookInstantGamesPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromFacebookInstantGamesIdsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult& input, PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromGameCenterIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest& input); +}; + +class GameCenterPlayFabIdPair : public Wrappers::PFAccountManagementGameCenterPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGameCenterPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGameCenterPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementGameCenterPlayFabIdPair& input, PFAccountManagementGameCenterPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromGameCenterIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult& input, PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromGoogleIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest& input); +}; + +class GooglePlayFabIdPair : public Wrappers::PFAccountManagementGooglePlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGooglePlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGooglePlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementGooglePlayFabIdPair& input, PFAccountManagementGooglePlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromGoogleIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromGoogleIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromGoogleIDsResult& input, PFAccountManagementGetPlayFabIDsFromGoogleIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest& input); +}; + +class GooglePlayGamesPlayFabIdPair : public Wrappers::PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGooglePlayGamesPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGooglePlayGamesPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementGooglePlayGamesPlayFabIdPair& input, PFAccountManagementGooglePlayGamesPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult& input, PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromKongregateIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest& input); +}; + +class KongregatePlayFabIdPair : public Wrappers::PFAccountManagementKongregatePlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementKongregatePlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementKongregatePlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementKongregatePlayFabIdPair& input, PFAccountManagementKongregatePlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromKongregateIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromKongregateIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromKongregateIDsResult& input, PFAccountManagementGetPlayFabIDsFromKongregateIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromNintendoServiceAccountIdsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest& input); +}; + +class NintendoServiceAccountPlayFabIdPair : public Wrappers::PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementNintendoServiceAccountPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementNintendoServiceAccountPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementNintendoServiceAccountPlayFabIdPair& input, PFAccountManagementNintendoServiceAccountPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromNintendoServiceAccountIdsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult& input, PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest& input); +}; + +class NintendoSwitchPlayFabIdPair : public Wrappers::PFAccountManagementNintendoSwitchPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementNintendoSwitchPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementNintendoSwitchPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementNintendoSwitchPlayFabIdPair& input, PFAccountManagementNintendoSwitchPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromNintendoSwitchDeviceIdsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult& input, PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromPSNAccountIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest& input); +}; + +class PSNAccountPlayFabIdPair : public Wrappers::PFAccountManagementPSNAccountPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementPSNAccountPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementPSNAccountPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementPSNAccountPlayFabIdPair& input, PFAccountManagementPSNAccountPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromPSNAccountIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult& input, PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromSteamIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromSteamIDsRequest& input); +}; + +class SteamPlayFabIdPair : public Wrappers::PFAccountManagementSteamPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementSteamPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementSteamPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementSteamPlayFabIdPair& input, PFAccountManagementSteamPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromSteamIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromSteamIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromSteamIDsResult& input, PFAccountManagementGetPlayFabIDsFromSteamIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromTwitchIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest& input); +}; + +class TwitchPlayFabIdPair : public Wrappers::PFAccountManagementTwitchPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementTwitchPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementTwitchPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementTwitchPlayFabIdPair& input, PFAccountManagementTwitchPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromTwitchIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromTwitchIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromTwitchIDsResult& input, PFAccountManagementGetPlayFabIDsFromTwitchIDsResult& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromXboxLiveIDsRequest : public Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest& input); +}; + +class XboxLiveAccountPlayFabIdPair : public Wrappers::PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementXboxLiveAccountPlayFabIdPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementXboxLiveAccountPlayFabIdPair& model); + static HRESULT Copy(const PFAccountManagementXboxLiveAccountPlayFabIdPair& input, PFAccountManagementXboxLiveAccountPlayFabIdPair& output, ModelBuffer& buffer); +}; + +class GetPlayFabIDsFromXboxLiveIDsResult : public Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult& input, PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult& output, ModelBuffer& buffer); +}; + +class LinkAndroidDeviceIDRequest : public Wrappers::PFAccountManagementLinkAndroidDeviceIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkAndroidDeviceIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkAndroidDeviceIDRequest& input); +}; + +class LinkAppleRequest : public Wrappers::PFAccountManagementLinkAppleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkAppleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkAppleRequest& input); +}; + +class LinkCustomIDRequest : public Wrappers::PFAccountManagementLinkCustomIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkCustomIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkCustomIDRequest& input); +}; + +class LinkFacebookAccountRequest : public Wrappers::PFAccountManagementLinkFacebookAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkFacebookAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkFacebookAccountRequest& input); +}; + +class LinkFacebookInstantGamesIdRequest : public Wrappers::PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkFacebookInstantGamesIdRequest& input); +}; + +class LinkGameCenterAccountRequest : public Wrappers::PFAccountManagementLinkGameCenterAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkGameCenterAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkGameCenterAccountRequest& input); +}; + +class LinkGoogleAccountRequest : public Wrappers::PFAccountManagementLinkGoogleAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkGoogleAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkGoogleAccountRequest& input); +}; + +class LinkGooglePlayGamesServicesAccountRequest : public Wrappers::PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkGooglePlayGamesServicesAccountRequest& input); +}; + +class LinkIOSDeviceIDRequest : public Wrappers::PFAccountManagementLinkIOSDeviceIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkIOSDeviceIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkIOSDeviceIDRequest& input); +}; + +class LinkKongregateAccountRequest : public Wrappers::PFAccountManagementLinkKongregateAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkKongregateAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkKongregateAccountRequest& input); +}; + +class ClientLinkNintendoServiceAccountRequest : public Wrappers::PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientLinkNintendoServiceAccountRequest& input); +}; + +class ClientLinkNintendoSwitchDeviceIdRequest : public Wrappers::PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest& input); +}; + +class LinkOpenIdConnectRequest : public Wrappers::PFAccountManagementLinkOpenIdConnectRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkOpenIdConnectRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkOpenIdConnectRequest& input); +}; + +class ClientLinkPSNAccountRequest : public Wrappers::PFAccountManagementClientLinkPSNAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientLinkPSNAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientLinkPSNAccountRequest& input); +}; + +class LinkSteamAccountRequest : public Wrappers::PFAccountManagementLinkSteamAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkSteamAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkSteamAccountRequest& input); +}; + +class LinkTwitchAccountRequest : public Wrappers::PFAccountManagementLinkTwitchAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkTwitchAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkTwitchAccountRequest& input); +}; + +class ClientLinkXboxAccountRequest : public Wrappers::PFAccountManagementClientLinkXboxAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientLinkXboxAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientLinkXboxAccountRequest& input); +}; + +class RemoveContactEmailRequest : public Wrappers::PFAccountManagementRemoveContactEmailRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementRemoveContactEmailRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementRemoveContactEmailRequest& input); +}; + +class ReportPlayerClientRequest : public Wrappers::PFAccountManagementReportPlayerClientRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementReportPlayerClientRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementReportPlayerClientRequest& input); +}; + +class ReportPlayerClientResult : public Wrappers::PFAccountManagementReportPlayerClientResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementReportPlayerClientResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementReportPlayerClientResult& model); + static HRESULT Copy(const PFAccountManagementReportPlayerClientResult& input, PFAccountManagementReportPlayerClientResult& output, ModelBuffer& buffer); +}; + +class SendAccountRecoveryEmailRequest : public Wrappers::PFAccountManagementSendAccountRecoveryEmailRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementSendAccountRecoveryEmailRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementSendAccountRecoveryEmailRequest& input); +}; + +class UnlinkAndroidDeviceIDRequest : public Wrappers::PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkAndroidDeviceIDRequest& input); +}; + +class UnlinkAppleRequest : public Wrappers::PFAccountManagementUnlinkAppleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkAppleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkAppleRequest& input); +}; + +class UnlinkCustomIDRequest : public Wrappers::PFAccountManagementUnlinkCustomIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkCustomIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkCustomIDRequest& input); +}; + +class UnlinkFacebookAccountRequest : public Wrappers::PFAccountManagementUnlinkFacebookAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkFacebookAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkFacebookAccountRequest& input); +}; + +class UnlinkFacebookInstantGamesIdRequest : public Wrappers::PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkFacebookInstantGamesIdRequest& input); +}; + +class UnlinkGameCenterAccountRequest : public Wrappers::PFAccountManagementUnlinkGameCenterAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkGameCenterAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkGameCenterAccountRequest& input); +}; + +class UnlinkGoogleAccountRequest : public Wrappers::PFAccountManagementUnlinkGoogleAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkGoogleAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkGoogleAccountRequest& input); +}; + +class UnlinkGooglePlayGamesServicesAccountRequest : public Wrappers::PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest& input); +}; + +class UnlinkIOSDeviceIDRequest : public Wrappers::PFAccountManagementUnlinkIOSDeviceIDRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkIOSDeviceIDRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkIOSDeviceIDRequest& input); +}; + +class UnlinkKongregateAccountRequest : public Wrappers::PFAccountManagementUnlinkKongregateAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkKongregateAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkKongregateAccountRequest& input); +}; + +class ClientUnlinkNintendoServiceAccountRequest : public Wrappers::PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientUnlinkNintendoServiceAccountRequest& input); +}; + +class ClientUnlinkNintendoSwitchDeviceIdRequest : public Wrappers::PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest& input); +}; + +class UnlinkOpenIdConnectRequest : public Wrappers::PFAccountManagementUnlinkOpenIdConnectRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkOpenIdConnectRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkOpenIdConnectRequest& input); +}; + +class ClientUnlinkPSNAccountRequest : public Wrappers::PFAccountManagementClientUnlinkPSNAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientUnlinkPSNAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientUnlinkPSNAccountRequest& input); +}; + +class UnlinkSteamAccountRequest : public Wrappers::PFAccountManagementUnlinkSteamAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkSteamAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkSteamAccountRequest& input); +}; + +class UnlinkTwitchAccountRequest : public Wrappers::PFAccountManagementUnlinkTwitchAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkTwitchAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkTwitchAccountRequest& input); +}; + +class ClientUnlinkXboxAccountRequest : public Wrappers::PFAccountManagementClientUnlinkXboxAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientUnlinkXboxAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientUnlinkXboxAccountRequest& input); +}; + +class ClientUpdateAvatarUrlRequest : public Wrappers::PFAccountManagementClientUpdateAvatarUrlRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementClientUpdateAvatarUrlRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementClientUpdateAvatarUrlRequest& input); +}; + +class UpdateUserTitleDisplayNameRequest : public Wrappers::PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUpdateUserTitleDisplayNameRequest& input); +}; + +class UpdateUserTitleDisplayNameResult : public Wrappers::PFAccountManagementUpdateUserTitleDisplayNameResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUpdateUserTitleDisplayNameResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementUpdateUserTitleDisplayNameResult& model); + static HRESULT Copy(const PFAccountManagementUpdateUserTitleDisplayNameResult& input, PFAccountManagementUpdateUserTitleDisplayNameResult& output, ModelBuffer& buffer); +}; + +class BanRequest : public Wrappers::PFAccountManagementBanRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementBanRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementBanRequest& input); +}; + +class BanUsersRequest : public Wrappers::PFAccountManagementBanUsersRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementBanUsersRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementBanUsersRequest& input); +}; + +class BanInfo : public Wrappers::PFAccountManagementBanInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementBanInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementBanInfo& model); + static HRESULT Copy(const PFAccountManagementBanInfo& input, PFAccountManagementBanInfo& output, ModelBuffer& buffer); +}; + +class BanUsersResult : public Wrappers::PFAccountManagementBanUsersResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementBanUsersResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementBanUsersResult& model); + static HRESULT Copy(const PFAccountManagementBanUsersResult& input, PFAccountManagementBanUsersResult& output, ModelBuffer& buffer); +}; + +class DeletePlayerRequest : public Wrappers::PFAccountManagementDeletePlayerRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementDeletePlayerRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementDeletePlayerRequest& input); +}; + +class GetServerCustomIDsFromPlayFabIDsRequest : public Wrappers::PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest& input); +}; + +class ServerCustomIDPlayFabIDPair : public Wrappers::PFAccountManagementServerCustomIDPlayFabIDPairWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerCustomIDPlayFabIDPairWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementServerCustomIDPlayFabIDPair& model); + static HRESULT Copy(const PFAccountManagementServerCustomIDPlayFabIDPair& input, PFAccountManagementServerCustomIDPlayFabIDPair& output, ModelBuffer& buffer); +}; + +class GetServerCustomIDsFromPlayFabIDsResult : public Wrappers::PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult& model); + static HRESULT Copy(const PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult& input, PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult& output, ModelBuffer& buffer); +}; + +class GetUserAccountInfoRequest : public Wrappers::PFAccountManagementGetUserAccountInfoRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetUserAccountInfoRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetUserAccountInfoRequest& input); +}; + +class GetUserAccountInfoResult : public Wrappers::PFAccountManagementGetUserAccountInfoResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetUserAccountInfoResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetUserAccountInfoResult& model); + static HRESULT Copy(const PFAccountManagementGetUserAccountInfoResult& input, PFAccountManagementGetUserAccountInfoResult& output, ModelBuffer& buffer); +}; + +class GetUserBansRequest : public Wrappers::PFAccountManagementGetUserBansRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetUserBansRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetUserBansRequest& input); +}; + +class GetUserBansResult : public Wrappers::PFAccountManagementGetUserBansResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetUserBansResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetUserBansResult& model); + static HRESULT Copy(const PFAccountManagementGetUserBansResult& input, PFAccountManagementGetUserBansResult& output, ModelBuffer& buffer); +}; + +class ServerLinkNintendoServiceAccountRequest : public Wrappers::PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerLinkNintendoServiceAccountRequest& input); +}; + +class ServerLinkNintendoSwitchDeviceIdRequest : public Wrappers::PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest& input); +}; + +class ServerLinkPSNAccountRequest : public Wrappers::PFAccountManagementServerLinkPSNAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerLinkPSNAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerLinkPSNAccountRequest& input); +}; + +class LinkPSNIdRequest : public Wrappers::PFAccountManagementLinkPSNIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkPSNIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkPSNIdRequest& input); +}; + +class LinkServerCustomIdRequest : public Wrappers::PFAccountManagementLinkServerCustomIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkServerCustomIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkServerCustomIdRequest& input); +}; + +class LinkSteamIdRequest : public Wrappers::PFAccountManagementLinkSteamIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementLinkSteamIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementLinkSteamIdRequest& input); +}; + +class ServerLinkXboxAccountRequest : public Wrappers::PFAccountManagementServerLinkXboxAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerLinkXboxAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerLinkXboxAccountRequest& input); +}; + +class RevokeAllBansForUserRequest : public Wrappers::PFAccountManagementRevokeAllBansForUserRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementRevokeAllBansForUserRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementRevokeAllBansForUserRequest& input); +}; + +class RevokeAllBansForUserResult : public Wrappers::PFAccountManagementRevokeAllBansForUserResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementRevokeAllBansForUserResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementRevokeAllBansForUserResult& model); + static HRESULT Copy(const PFAccountManagementRevokeAllBansForUserResult& input, PFAccountManagementRevokeAllBansForUserResult& output, ModelBuffer& buffer); +}; + +class RevokeBansRequest : public Wrappers::PFAccountManagementRevokeBansRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementRevokeBansRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementRevokeBansRequest& input); +}; + +class RevokeBansResult : public Wrappers::PFAccountManagementRevokeBansResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementRevokeBansResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementRevokeBansResult& model); + static HRESULT Copy(const PFAccountManagementRevokeBansResult& input, PFAccountManagementRevokeBansResult& output, ModelBuffer& buffer); +}; + +class SendCustomAccountRecoveryEmailRequest : public Wrappers::PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementSendCustomAccountRecoveryEmailRequest& input); +}; + +class SendEmailFromTemplateRequest : public Wrappers::PFAccountManagementSendEmailFromTemplateRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementSendEmailFromTemplateRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementSendEmailFromTemplateRequest& input); +}; + +class ServerUnlinkNintendoServiceAccountRequest : public Wrappers::PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerUnlinkNintendoServiceAccountRequest& input); +}; + +class ServerUnlinkNintendoSwitchDeviceIdRequest : public Wrappers::PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest& input); +}; + +class ServerUnlinkPSNAccountRequest : public Wrappers::PFAccountManagementServerUnlinkPSNAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerUnlinkPSNAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerUnlinkPSNAccountRequest& input); +}; + +class UnlinkServerCustomIdRequest : public Wrappers::PFAccountManagementUnlinkServerCustomIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkServerCustomIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkServerCustomIdRequest& input); +}; + +class UnlinkSteamIdRequest : public Wrappers::PFAccountManagementUnlinkSteamIdRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUnlinkSteamIdRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUnlinkSteamIdRequest& input); +}; + +class ServerUnlinkXboxAccountRequest : public Wrappers::PFAccountManagementServerUnlinkXboxAccountRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerUnlinkXboxAccountRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerUnlinkXboxAccountRequest& input); +}; + +class ServerUpdateAvatarUrlRequest : public Wrappers::PFAccountManagementServerUpdateAvatarUrlRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementServerUpdateAvatarUrlRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementServerUpdateAvatarUrlRequest& input); +}; + +class UpdateBanRequest : public Wrappers::PFAccountManagementUpdateBanRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUpdateBanRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUpdateBanRequest& input); +}; + +class UpdateBansRequest : public Wrappers::PFAccountManagementUpdateBansRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUpdateBansRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementUpdateBansRequest& input); +}; + +class UpdateBansResult : public Wrappers::PFAccountManagementUpdateBansResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementUpdateBansResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementUpdateBansResult& model); + static HRESULT Copy(const PFAccountManagementUpdateBansResult& input, PFAccountManagementUpdateBansResult& output, ModelBuffer& buffer); +}; + +class GetTitlePlayersFromXboxLiveIDsRequest : public Wrappers::PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest& input); +}; + +class GetTitlePlayersFromProviderIDsResponse : public Wrappers::PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAccountManagementGetTitlePlayersFromProviderIDsResponse& model); + static HRESULT Copy(const PFAccountManagementGetTitlePlayersFromProviderIDsResponse& input, PFAccountManagementGetTitlePlayersFromProviderIDsResponse& output, ModelBuffer& buffer); +}; + +} // namespace AccountManagement +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CacheId.h b/Source/PlayFabServices/Source/Generated/CacheId.h new file mode 100644 index 0000000..3f033f6 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CacheId.h @@ -0,0 +1,265 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#if !defined(__cplusplus) +#error C++11 required +#endif + +#pragma once + +namespace PlayFab +{ + +/// +/// Internal cacheId used by libHttpClient for Retry-After caching +/// +enum class ServicesCacheId : uint32_t +{ + FriendsClientAddFriend = 2001, + FriendsClientGetFriendsList = 2002, + FriendsClientRemoveFriend = 2003, + FriendsClientSetFriendTags = 2004, + FriendsServerAddFriend = 2005, + FriendsServerGetFriendsList = 2006, + FriendsServerRemoveFriend = 2007, + FriendsServerSetFriendTags = 2008, + AccountManagementClientAddOrUpdateContactEmail = 2009, + AccountManagementClientAddUsernamePassword = 2010, + AccountManagementClientGetAccountInfo = 2011, + AccountManagementClientGetPlayerCombinedInfo = 2012, + AccountManagementClientGetPlayerProfile = 2013, + AccountManagementClientGetPlayFabIDsFromFacebookIDs = 2014, + AccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIds = 2015, + AccountManagementClientGetPlayFabIDsFromGameCenterIDs = 2016, + AccountManagementClientGetPlayFabIDsFromGoogleIDs = 2017, + AccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs = 2018, + AccountManagementClientGetPlayFabIDsFromKongregateIDs = 2019, + AccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIds = 2020, + AccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIds = 2021, + AccountManagementClientGetPlayFabIDsFromPSNAccountIDs = 2022, + AccountManagementClientGetPlayFabIDsFromSteamIDs = 2023, + AccountManagementClientGetPlayFabIDsFromTwitchIDs = 2024, + AccountManagementClientGetPlayFabIDsFromXboxLiveIDs = 2025, + AccountManagementClientLinkAndroidDeviceID = 2026, + AccountManagementClientLinkApple = 2027, + AccountManagementClientLinkCustomID = 2028, + AccountManagementClientLinkFacebookAccount = 2029, + AccountManagementClientLinkFacebookInstantGamesId = 2030, + AccountManagementClientLinkGameCenterAccount = 2031, + AccountManagementClientLinkGoogleAccount = 2032, + AccountManagementClientLinkGooglePlayGamesServicesAccount = 2033, + AccountManagementClientLinkIOSDeviceID = 2034, + AccountManagementClientLinkKongregate = 2035, + AccountManagementClientLinkNintendoServiceAccount = 2036, + AccountManagementClientLinkNintendoSwitchDeviceId = 2037, + AccountManagementClientLinkOpenIdConnect = 2038, + AccountManagementClientLinkPSNAccount = 2039, + AccountManagementClientLinkSteamAccount = 2040, + AccountManagementClientLinkTwitch = 2041, + AccountManagementClientLinkXboxAccount = 2042, + AccountManagementClientRemoveContactEmail = 2043, + AccountManagementClientReportPlayer = 2044, + AccountManagementClientSendAccountRecoveryEmail = 2045, + AccountManagementClientUnlinkAndroidDeviceID = 2046, + AccountManagementClientUnlinkApple = 2047, + AccountManagementClientUnlinkCustomID = 2048, + AccountManagementClientUnlinkFacebookAccount = 2049, + AccountManagementClientUnlinkFacebookInstantGamesId = 2050, + AccountManagementClientUnlinkGameCenterAccount = 2051, + AccountManagementClientUnlinkGoogleAccount = 2052, + AccountManagementClientUnlinkGooglePlayGamesServicesAccount = 2053, + AccountManagementClientUnlinkIOSDeviceID = 2054, + AccountManagementClientUnlinkKongregate = 2055, + AccountManagementClientUnlinkNintendoServiceAccount = 2056, + AccountManagementClientUnlinkNintendoSwitchDeviceId = 2057, + AccountManagementClientUnlinkOpenIdConnect = 2058, + AccountManagementClientUnlinkPSNAccount = 2059, + AccountManagementClientUnlinkSteamAccount = 2060, + AccountManagementClientUnlinkTwitch = 2061, + AccountManagementClientUnlinkXboxAccount = 2062, + AccountManagementClientUpdateAvatarUrl = 2063, + AccountManagementClientUpdateUserTitleDisplayName = 2064, + AccountManagementServerBanUsers = 2065, + AccountManagementServerDeletePlayer = 2066, + AccountManagementServerGetPlayerCombinedInfo = 2067, + AccountManagementServerGetPlayerProfile = 2068, + AccountManagementServerGetPlayFabIDsFromFacebookIDs = 2069, + AccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIds = 2070, + AccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIds = 2071, + AccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIds = 2072, + AccountManagementServerGetPlayFabIDsFromPSNAccountIDs = 2073, + AccountManagementServerGetPlayFabIDsFromSteamIDs = 2074, + AccountManagementServerGetPlayFabIDsFromTwitchIDs = 2075, + AccountManagementServerGetPlayFabIDsFromXboxLiveIDs = 2076, + AccountManagementServerGetServerCustomIDsFromPlayFabIDs = 2077, + AccountManagementServerGetUserAccountInfo = 2078, + AccountManagementServerGetUserBans = 2079, + AccountManagementServerLinkNintendoServiceAccount = 2080, + AccountManagementServerLinkNintendoSwitchDeviceId = 2081, + AccountManagementServerLinkPSNAccount = 2082, + AccountManagementServerLinkPSNId = 2083, + AccountManagementServerLinkServerCustomId = 2084, + AccountManagementServerLinkSteamId = 2085, + AccountManagementServerLinkXboxAccount = 2086, + AccountManagementServerRevokeAllBansForUser = 2087, + AccountManagementServerRevokeBans = 2088, + AccountManagementServerSendCustomAccountRecoveryEmail = 2089, + AccountManagementServerSendEmailFromTemplate = 2090, + AccountManagementServerUnlinkNintendoServiceAccount = 2091, + AccountManagementServerUnlinkNintendoSwitchDeviceId = 2092, + AccountManagementServerUnlinkPSNAccount = 2093, + AccountManagementServerUnlinkServerCustomId = 2094, + AccountManagementServerUnlinkSteamId = 2095, + AccountManagementServerUnlinkXboxAccount = 2096, + AccountManagementServerUpdateAvatarUrl = 2097, + AccountManagementServerUpdateBans = 2098, + AccountManagementGetTitlePlayersFromXboxLiveIDs = 2099, + PlatformSpecificClientAndroidDevicePushNotificationRegistration = 2100, + PlatformSpecificClientRefreshPSNAuthToken = 2101, + PlatformSpecificClientRegisterForIOSPushNotification = 2102, + PlatformSpecificServerAwardSteamAchievement = 2103, + CharacterClientGetAllUsersCharacters = 2104, + CharacterClientGetCharacterData = 2105, + CharacterClientGetCharacterReadOnlyData = 2106, + CharacterClientGrantCharacterToUser = 2107, + CharacterClientUpdateCharacterData = 2108, + CharacterServerDeleteCharacterFromUser = 2109, + CharacterServerGetAllUsersCharacters = 2110, + CharacterServerGetCharacterData = 2111, + CharacterServerGetCharacterInternalData = 2112, + CharacterServerGetCharacterReadOnlyData = 2113, + CharacterServerGrantCharacterToUser = 2114, + CharacterServerUpdateCharacterData = 2115, + CharacterServerUpdateCharacterInternalData = 2116, + CharacterServerUpdateCharacterReadOnlyData = 2117, + SegmentsClientGetPlayerSegments = 2118, + SegmentsClientGetPlayerTags = 2119, + SegmentsServerAddPlayerTag = 2120, + SegmentsServerGetAllSegments = 2121, + SegmentsServerGetPlayerSegments = 2122, + SegmentsServerGetPlayersInSegment = 2123, + SegmentsServerGetPlayerTags = 2124, + SegmentsServerRemovePlayerTag = 2125, + TitleDataManagementClientGetPublisherData = 2126, + TitleDataManagementClientGetTime = 2127, + TitleDataManagementClientGetTitleData = 2128, + TitleDataManagementClientGetTitleNews = 2129, + TitleDataManagementServerGetPublisherData = 2130, + TitleDataManagementServerGetTime = 2131, + TitleDataManagementServerGetTitleData = 2132, + TitleDataManagementServerGetTitleInternalData = 2133, + TitleDataManagementServerGetTitleNews = 2134, + TitleDataManagementServerSetPublisherData = 2135, + TitleDataManagementServerSetTitleData = 2136, + TitleDataManagementServerSetTitleInternalData = 2137, + PlayerDataManagementClientGetUserData = 2138, + PlayerDataManagementClientGetUserPublisherData = 2139, + PlayerDataManagementClientGetUserPublisherReadOnlyData = 2140, + PlayerDataManagementClientGetUserReadOnlyData = 2141, + PlayerDataManagementClientUpdateUserData = 2142, + PlayerDataManagementClientUpdateUserPublisherData = 2143, + PlayerDataManagementServerGetUserData = 2144, + PlayerDataManagementServerGetUserInternalData = 2145, + PlayerDataManagementServerGetUserPublisherData = 2146, + PlayerDataManagementServerGetUserPublisherInternalData = 2147, + PlayerDataManagementServerGetUserPublisherReadOnlyData = 2148, + PlayerDataManagementServerGetUserReadOnlyData = 2149, + PlayerDataManagementServerUpdateUserData = 2150, + PlayerDataManagementServerUpdateUserInternalData = 2151, + PlayerDataManagementServerUpdateUserPublisherData = 2152, + PlayerDataManagementServerUpdateUserPublisherInternalData = 2153, + PlayerDataManagementServerUpdateUserPublisherReadOnlyData = 2154, + PlayerDataManagementServerUpdateUserReadOnlyData = 2155, + PushNotificationsServerSendPushNotification = 2156, + PushNotificationsServerSendPushNotificationFromTemplate = 2157, + CloudScriptExecuteFunction = 2158, + DataAbortFileUploads = 2159, + DataDeleteFiles = 2160, + DataFinalizeFileUploads = 2161, + DataGetFiles = 2162, + DataGetObjects = 2163, + DataInitiateFileUploads = 2164, + DataSetObjects = 2165, + InventoryAddInventoryItems = 2166, + InventoryDeleteInventoryCollection = 2167, + InventoryDeleteInventoryItems = 2168, + InventoryExecuteInventoryOperations = 2169, + InventoryGetInventoryCollectionIds = 2170, + InventoryGetInventoryItems = 2171, + InventoryGetMicrosoftStoreAccessTokens = 2172, + InventoryGetTransactionHistory = 2173, + InventoryPurchaseInventoryItems = 2174, + InventoryRedeemAppleAppStoreInventoryItems = 2175, + InventoryRedeemGooglePlayInventoryItems = 2176, + InventoryRedeemMicrosoftStoreInventoryItems = 2177, + InventoryRedeemNintendoEShopInventoryItems = 2178, + InventoryRedeemPlayStationStoreInventoryItems = 2179, + InventoryRedeemSteamInventoryItems = 2180, + InventorySubtractInventoryItems = 2181, + InventoryTransferInventoryItems = 2182, + InventoryUpdateInventoryItems = 2183, + CatalogCreateDraftItem = 2184, + CatalogCreateUploadUrls = 2185, + CatalogDeleteEntityItemReviews = 2186, + CatalogDeleteItem = 2187, + CatalogGetCatalogConfig = 2188, + CatalogGetDraftItem = 2189, + CatalogGetDraftItems = 2190, + CatalogGetEntityDraftItems = 2191, + CatalogGetEntityItemReview = 2192, + CatalogGetItem = 2193, + CatalogGetItemContainers = 2194, + CatalogGetItemModerationState = 2195, + CatalogGetItemPublishStatus = 2196, + CatalogGetItemReviews = 2197, + CatalogGetItemReviewSummary = 2198, + CatalogGetItems = 2199, + CatalogPublishDraftItem = 2200, + CatalogReportItem = 2201, + CatalogReportItemReview = 2202, + CatalogReviewItem = 2203, + CatalogSearchItems = 2204, + CatalogSetItemModerationState = 2205, + CatalogSubmitItemReviewVote = 2206, + CatalogTakedownItemReviews = 2207, + CatalogUpdateCatalogConfig = 2208, + CatalogUpdateDraftItem = 2209, + ExperimentationGetTreatmentAssignment = 2210, + GroupsAcceptGroupApplication = 2211, + GroupsAcceptGroupInvitation = 2212, + GroupsAddMembers = 2213, + GroupsApplyToGroup = 2214, + GroupsBlockEntity = 2215, + GroupsChangeMemberRole = 2216, + GroupsCreateGroup = 2217, + GroupsCreateRole = 2218, + GroupsDeleteGroup = 2219, + GroupsDeleteRole = 2220, + GroupsGetGroup = 2221, + GroupsInviteToGroup = 2222, + GroupsIsMember = 2223, + GroupsListGroupApplications = 2224, + GroupsListGroupBlocks = 2225, + GroupsListGroupInvitations = 2226, + GroupsListGroupMembers = 2227, + GroupsListMembership = 2228, + GroupsListMembershipOpportunities = 2229, + GroupsRemoveGroupApplication = 2230, + GroupsRemoveGroupInvitation = 2231, + GroupsRemoveMembers = 2232, + GroupsUnblockEntity = 2233, + GroupsUpdateGroup = 2234, + GroupsUpdateRole = 2235, + LocalizationGetLanguageList = 2236, + MultiplayerServerListBuildAliases = 2237, + MultiplayerServerListBuildSummariesV2 = 2238, + MultiplayerServerListQosServersForTitle = 2239, + MultiplayerServerRequestMultiplayerServer = 2240, + ProfilesGetProfile = 2241, + ProfilesGetProfiles = 2242, + ProfilesGetTitlePlayersFromMasterPlayerAccountIds = 2243, + ProfilesSetProfileLanguage = 2244, + ProfilesSetProfilePolicy = 2245, +}; + +} // namespace PlayFab \ No newline at end of file diff --git a/Source/PlayFabServices/Source/Generated/Catalog.cpp b/Source/PlayFabServices/Source/Generated/Catalog.cpp new file mode 100644 index 0000000..3240426 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Catalog.cpp @@ -0,0 +1,902 @@ +#include "stdafx.h" +#include "Catalog.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Catalog +{ + + +AsyncOp CatalogAPI::CreateDraftItem( + Entity const& entity, + const CreateDraftItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/CreateDraftItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogCreateDraftItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + CreateDraftItemResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::CreateUploadUrls( + Entity const& entity, + const CreateUploadUrlsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/CreateUploadUrls" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogCreateUploadUrls, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + CreateUploadUrlsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::DeleteEntityItemReviews( + Entity const& entity, + const DeleteEntityItemReviewsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/DeleteEntityItemReviews" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogDeleteEntityItemReviews, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::DeleteItem( + Entity const& entity, + const DeleteItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/DeleteItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogDeleteItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetCatalogConfig( + Entity const& entity, + const GetCatalogConfigRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetCatalogConfig" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetCatalogConfig, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetCatalogConfigResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetDraftItem( + Entity const& entity, + const GetDraftItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetDraftItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetDraftItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetDraftItemResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetDraftItems( + Entity const& entity, + const GetDraftItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetDraftItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetDraftItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetDraftItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetEntityDraftItems( + Entity const& entity, + const GetEntityDraftItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetEntityDraftItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetEntityDraftItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetEntityDraftItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetEntityItemReview( + Entity const& entity, + const GetEntityItemReviewRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetEntityItemReview" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetEntityItemReview, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetEntityItemReviewResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetItem( + Entity const& entity, + const GetItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetItemResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetItemContainers( + Entity const& entity, + const GetItemContainersRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetItemContainers" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetItemContainers, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetItemContainersResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetItemModerationState( + Entity const& entity, + const GetItemModerationStateRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetItemModerationState" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetItemModerationState, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetItemModerationStateResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetItemPublishStatus( + Entity const& entity, + const GetItemPublishStatusRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetItemPublishStatus" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetItemPublishStatus, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetItemPublishStatusResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetItemReviews( + Entity const& entity, + const GetItemReviewsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetItemReviews" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetItemReviews, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetItemReviewsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetItemReviewSummary( + Entity const& entity, + const GetItemReviewSummaryRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetItemReviewSummary" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetItemReviewSummary, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetItemReviewSummaryResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::GetItems( + Entity const& entity, + const GetItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/GetItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogGetItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::PublishDraftItem( + Entity const& entity, + const PublishDraftItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/PublishDraftItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogPublishDraftItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::ReportItem( + Entity const& entity, + const ReportItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/ReportItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogReportItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::ReportItemReview( + Entity const& entity, + const ReportItemReviewRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/ReportItemReview" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogReportItemReview, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::ReviewItem( + Entity const& entity, + const ReviewItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/ReviewItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogReviewItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::SearchItems( + Entity const& entity, + const SearchItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/SearchItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogSearchItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + SearchItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::SetItemModerationState( + Entity const& entity, + const SetItemModerationStateRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/SetItemModerationState" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogSetItemModerationState, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::SubmitItemReviewVote( + Entity const& entity, + const SubmitItemReviewVoteRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/SubmitItemReviewVote" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogSubmitItemReviewVote, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::TakedownItemReviews( + Entity const& entity, + const TakedownItemReviewsRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/TakedownItemReviews" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogTakedownItemReviews, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::UpdateCatalogConfig( + Entity const& entity, + const UpdateCatalogConfigRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/UpdateCatalogConfig" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogUpdateCatalogConfig, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CatalogAPI::UpdateDraftItem( + Entity const& entity, + const UpdateDraftItemRequest& request, + RunContext rc +) +{ + const char* path{ "/Catalog/UpdateDraftItem" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CatalogUpdateDraftItem, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateDraftItemResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Catalog +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Catalog.h b/Source/PlayFabServices/Source/Generated/Catalog.h new file mode 100644 index 0000000..7dd3ac4 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Catalog.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include "CatalogTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Catalog +{ + +class CatalogAPI +{ +public: + CatalogAPI() = delete; + CatalogAPI(const CatalogAPI& source) = delete; + CatalogAPI& operator=(const CatalogAPI& source) = delete; + ~CatalogAPI() = default; + + // ------------ Generated API calls + static AsyncOp CreateDraftItem(Entity const& entity, const CreateDraftItemRequest& request, RunContext rc); + static AsyncOp CreateUploadUrls(Entity const& entity, const CreateUploadUrlsRequest& request, RunContext rc); + static AsyncOp DeleteEntityItemReviews(Entity const& entity, const DeleteEntityItemReviewsRequest& request, RunContext rc); + static AsyncOp DeleteItem(Entity const& entity, const DeleteItemRequest& request, RunContext rc); + static AsyncOp GetCatalogConfig(Entity const& entity, const GetCatalogConfigRequest& request, RunContext rc); + static AsyncOp GetDraftItem(Entity const& entity, const GetDraftItemRequest& request, RunContext rc); + static AsyncOp GetDraftItems(Entity const& entity, const GetDraftItemsRequest& request, RunContext rc); + static AsyncOp GetEntityDraftItems(Entity const& entity, const GetEntityDraftItemsRequest& request, RunContext rc); + static AsyncOp GetEntityItemReview(Entity const& entity, const GetEntityItemReviewRequest& request, RunContext rc); + static AsyncOp GetItem(Entity const& entity, const GetItemRequest& request, RunContext rc); + static AsyncOp GetItemContainers(Entity const& entity, const GetItemContainersRequest& request, RunContext rc); + static AsyncOp GetItemModerationState(Entity const& entity, const GetItemModerationStateRequest& request, RunContext rc); + static AsyncOp GetItemPublishStatus(Entity const& entity, const GetItemPublishStatusRequest& request, RunContext rc); + static AsyncOp GetItemReviews(Entity const& entity, const GetItemReviewsRequest& request, RunContext rc); + static AsyncOp GetItemReviewSummary(Entity const& entity, const GetItemReviewSummaryRequest& request, RunContext rc); + static AsyncOp GetItems(Entity const& entity, const GetItemsRequest& request, RunContext rc); + static AsyncOp PublishDraftItem(Entity const& entity, const PublishDraftItemRequest& request, RunContext rc); + static AsyncOp ReportItem(Entity const& entity, const ReportItemRequest& request, RunContext rc); + static AsyncOp ReportItemReview(Entity const& entity, const ReportItemReviewRequest& request, RunContext rc); + static AsyncOp ReviewItem(Entity const& entity, const ReviewItemRequest& request, RunContext rc); + static AsyncOp SearchItems(Entity const& entity, const SearchItemsRequest& request, RunContext rc); + static AsyncOp SetItemModerationState(Entity const& entity, const SetItemModerationStateRequest& request, RunContext rc); + static AsyncOp SubmitItemReviewVote(Entity const& entity, const SubmitItemReviewVoteRequest& request, RunContext rc); + static AsyncOp TakedownItemReviews(Entity const& entity, const TakedownItemReviewsRequest& request, RunContext rc); + static AsyncOp UpdateCatalogConfig(Entity const& entity, const UpdateCatalogConfigRequest& request, RunContext rc); + static AsyncOp UpdateDraftItem(Entity const& entity, const UpdateDraftItemRequest& request, RunContext rc); +}; + +} // namespace Catalog +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CatalogTypes.cpp b/Source/PlayFabServices/Source/Generated/CatalogTypes.cpp new file mode 100644 index 0000000..836b161 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CatalogTypes.cpp @@ -0,0 +1,3695 @@ +#include "stdafx.h" +#include "CatalogTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Catalog +{ + +JsonValue CatalogAlternateId::ToJson() const +{ + return CatalogAlternateId::ToJson(this->Model()); +} + +JsonValue CatalogAlternateId::ToJson(const PFCatalogCatalogAlternateId& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Type", input.type); + JsonUtils::ObjectAddMember(output, "Value", input.value); + return output; +} + +HRESULT CatalogAlternateId::FromJson(const JsonValue& input) +{ + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + String value{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", value)); + this->SetValue(std::move(value)); + + return S_OK; +} + +size_t CatalogAlternateId::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogAlternateId::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogAlternateId::RequiredBufferSize(const PFCatalogCatalogAlternateId& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + if (model.value) + { + requiredSize += (std::strlen(model.value) + 1); + } + return requiredSize; +} + +HRESULT CatalogAlternateId::Copy(const PFCatalogCatalogAlternateId& input, PFCatalogCatalogAlternateId& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.value); + RETURN_IF_FAILED(propCopyResult.hr); + output.value = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue Content::ToJson() const +{ + return Content::ToJson(this->Model()); +} + +JsonValue Content::ToJson(const PFCatalogContent& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "MaxClientVersion", input.maxClientVersion); + JsonUtils::ObjectAddMember(output, "MinClientVersion", input.minClientVersion); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + JsonUtils::ObjectAddMember(output, "Type", input.type); + JsonUtils::ObjectAddMember(output, "Url", input.url); + return output; +} + +HRESULT Content::FromJson(const JsonValue& input) +{ + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String maxClientVersion{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MaxClientVersion", maxClientVersion)); + this->SetMaxClientVersion(std::move(maxClientVersion)); + + String minClientVersion{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MinClientVersion", minClientVersion)); + this->SetMinClientVersion(std::move(minClientVersion)); + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + String url{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Url", url)); + this->SetUrl(std::move(url)); + + return S_OK; +} + +size_t Content::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Content::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Content::RequiredBufferSize(const PFCatalogContent& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.maxClientVersion) + { + requiredSize += (std::strlen(model.maxClientVersion) + 1); + } + if (model.minClientVersion) + { + requiredSize += (std::strlen(model.minClientVersion) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + if (model.url) + { + requiredSize += (std::strlen(model.url) + 1); + } + return requiredSize; +} + +HRESULT Content::Copy(const PFCatalogContent& input, PFCatalogContent& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.maxClientVersion); + RETURN_IF_FAILED(propCopyResult.hr); + output.maxClientVersion = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.minClientVersion); + RETURN_IF_FAILED(propCopyResult.hr); + output.minClientVersion = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.url); + RETURN_IF_FAILED(propCopyResult.hr); + output.url = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeepLink::ToJson() const +{ + return DeepLink::ToJson(this->Model()); +} + +JsonValue DeepLink::ToJson(const PFCatalogDeepLink& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Platform", input.platform); + JsonUtils::ObjectAddMember(output, "Url", input.url); + return output; +} + +HRESULT DeepLink::FromJson(const JsonValue& input) +{ + String platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + String url{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Url", url)); + this->SetUrl(std::move(url)); + + return S_OK; +} + +size_t DeepLink::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DeepLink::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DeepLink::RequiredBufferSize(const PFCatalogDeepLink& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.platform) + { + requiredSize += (std::strlen(model.platform) + 1); + } + if (model.url) + { + requiredSize += (std::strlen(model.url) + 1); + } + return requiredSize; +} + +HRESULT DeepLink::Copy(const PFCatalogDeepLink& input, PFCatalogDeepLink& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.url); + RETURN_IF_FAILED(propCopyResult.hr); + output.url = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue Image::ToJson() const +{ + return Image::ToJson(this->Model()); +} + +JsonValue Image::ToJson(const PFCatalogImage& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "Tag", input.tag); + JsonUtils::ObjectAddMember(output, "Type", input.type); + JsonUtils::ObjectAddMember(output, "Url", input.url); + return output; +} + +HRESULT Image::FromJson(const JsonValue& input) +{ + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String tag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tag", tag)); + this->SetTag(std::move(tag)); + + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + String url{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Url", url)); + this->SetUrl(std::move(url)); + + return S_OK; +} + +size_t Image::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Image::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Image::RequiredBufferSize(const PFCatalogImage& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.tag) + { + requiredSize += (std::strlen(model.tag) + 1); + } + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + if (model.url) + { + requiredSize += (std::strlen(model.url) + 1); + } + return requiredSize; +} + +HRESULT Image::Copy(const PFCatalogImage& input, PFCatalogImage& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.tag); + RETURN_IF_FAILED(propCopyResult.hr); + output.tag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.url); + RETURN_IF_FAILED(propCopyResult.hr); + output.url = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogPriceAmount::ToJson() const +{ + return CatalogPriceAmount::ToJson(this->Model()); +} + +JsonValue CatalogPriceAmount::ToJson(const PFCatalogCatalogPriceAmount& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + return output; +} + +HRESULT CatalogPriceAmount::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Amount", this->m_model.amount)); + + String itemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemId", itemId)); + this->SetItemId(std::move(itemId)); + + return S_OK; +} + +size_t CatalogPriceAmount::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogPriceAmount::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogPriceAmount::RequiredBufferSize(const PFCatalogCatalogPriceAmount& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.itemId) + { + requiredSize += (std::strlen(model.itemId) + 1); + } + return requiredSize; +} + +HRESULT CatalogPriceAmount::Copy(const PFCatalogCatalogPriceAmount& input, PFCatalogCatalogPriceAmount& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.itemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogPrice::ToJson() const +{ + return CatalogPrice::ToJson(this->Model()); +} + +JsonValue CatalogPrice::ToJson(const PFCatalogCatalogPrice& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Amounts", input.amounts, input.amountsCount); + JsonUtils::ObjectAddMember(output, "UnitAmount", input.unitAmount); + JsonUtils::ObjectAddMember(output, "UnitDurationInSeconds", input.unitDurationInSeconds); + return output; +} + +HRESULT CatalogPrice::FromJson(const JsonValue& input) +{ + ModelVector amounts{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Amounts", amounts)); + this->SetAmounts(std::move(amounts)); + + std::optional unitAmount{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UnitAmount", unitAmount)); + this->SetUnitAmount(std::move(unitAmount)); + + std::optional unitDurationInSeconds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UnitDurationInSeconds", unitDurationInSeconds)); + this->SetUnitDurationInSeconds(std::move(unitDurationInSeconds)); + + return S_OK; +} + +size_t CatalogPrice::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogPrice::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogPrice::RequiredBufferSize(const PFCatalogCatalogPrice& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogCatalogPriceAmount*) + sizeof(PFCatalogCatalogPriceAmount*) * model.amountsCount); + for (size_t i = 0; i < model.amountsCount; ++i) + { + requiredSize += CatalogPriceAmount::RequiredBufferSize(*model.amounts[i]); + } + if (model.unitAmount) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.unitDurationInSeconds) + { + requiredSize += (alignof(double) + sizeof(double)); + } + return requiredSize; +} + +HRESULT CatalogPrice::Copy(const PFCatalogCatalogPrice& input, PFCatalogCatalogPrice& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.amounts, input.amountsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.amounts = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.unitAmount); + RETURN_IF_FAILED(propCopyResult.hr); + output.unitAmount = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.unitDurationInSeconds); + RETURN_IF_FAILED(propCopyResult.hr); + output.unitDurationInSeconds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogPriceOptions::ToJson() const +{ + return CatalogPriceOptions::ToJson(this->Model()); +} + +JsonValue CatalogPriceOptions::ToJson(const PFCatalogCatalogPriceOptions& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Prices", input.prices, input.pricesCount); + return output; +} + +HRESULT CatalogPriceOptions::FromJson(const JsonValue& input) +{ + ModelVector prices{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Prices", prices)); + this->SetPrices(std::move(prices)); + + return S_OK; +} + +size_t CatalogPriceOptions::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogPriceOptions::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogPriceOptions::RequiredBufferSize(const PFCatalogCatalogPriceOptions& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogCatalogPrice*) + sizeof(PFCatalogCatalogPrice*) * model.pricesCount); + for (size_t i = 0; i < model.pricesCount; ++i) + { + requiredSize += CatalogPrice::RequiredBufferSize(*model.prices[i]); + } + return requiredSize; +} + +HRESULT CatalogPriceOptions::Copy(const PFCatalogCatalogPriceOptions& input, PFCatalogCatalogPriceOptions& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.prices, input.pricesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.prices = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogItemReference::ToJson() const +{ + return CatalogItemReference::ToJson(this->Model()); +} + +JsonValue CatalogItemReference::ToJson(const PFCatalogCatalogItemReference& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "PriceOptions", input.priceOptions); + return output; +} + +HRESULT CatalogItemReference::FromJson(const JsonValue& input) +{ + std::optional amount{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Amount", amount)); + this->SetAmount(std::move(amount)); + + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + std::optional priceOptions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PriceOptions", priceOptions)); + if (priceOptions) + { + this->SetPriceOptions(std::move(*priceOptions)); + } + + return S_OK; +} + +size_t CatalogItemReference::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogItemReference::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogItemReference::RequiredBufferSize(const PFCatalogCatalogItemReference& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.amount) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.priceOptions) + { + requiredSize += CatalogPriceOptions::RequiredBufferSize(*model.priceOptions); + } + return requiredSize; +} + +HRESULT CatalogItemReference::Copy(const PFCatalogCatalogItemReference& input, PFCatalogCatalogItemReference& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.amount); + RETURN_IF_FAILED(propCopyResult.hr); + output.amount = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.priceOptions); + RETURN_IF_FAILED(propCopyResult.hr); + output.priceOptions = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue KeywordSet::ToJson() const +{ + return KeywordSet::ToJson(this->Model()); +} + +JsonValue KeywordSet::ToJson(const PFCatalogKeywordSet& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Values", input.values, input.valuesCount); + return output; +} + +HRESULT KeywordSet::FromJson(const JsonValue& input) +{ + CStringVector values{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Values", values)); + this->SetValues(std::move(values)); + + return S_OK; +} + +size_t KeywordSet::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result KeywordSet::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t KeywordSet::RequiredBufferSize(const PFCatalogKeywordSet& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.valuesCount); + for (size_t i = 0; i < model.valuesCount; ++i) + { + requiredSize += (std::strlen(model.values[i]) + 1); + } + return requiredSize; +} + +HRESULT KeywordSet::Copy(const PFCatalogKeywordSet& input, PFCatalogKeywordSet& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.values, input.valuesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.values = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ModerationState::ToJson() const +{ + return ModerationState::ToJson(this->Model()); +} + +JsonValue ModerationState::ToJson(const PFCatalogModerationState& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberTime(output, "LastModifiedDate", input.lastModifiedDate); + JsonUtils::ObjectAddMember(output, "Reason", input.reason); + JsonUtils::ObjectAddMember(output, "Status", input.status); + return output; +} + +HRESULT ModerationState::FromJson(const JsonValue& input) +{ + std::optional lastModifiedDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastModifiedDate", lastModifiedDate)); + this->SetLastModifiedDate(std::move(lastModifiedDate)); + + String reason{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Reason", reason)); + this->SetReason(std::move(reason)); + + std::optional status{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Status", status)); + this->SetStatus(std::move(status)); + + return S_OK; +} + +size_t ModerationState::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ModerationState::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ModerationState::RequiredBufferSize(const PFCatalogModerationState& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.lastModifiedDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.reason) + { + requiredSize += (std::strlen(model.reason) + 1); + } + if (model.status) + { + requiredSize += (alignof(PFCatalogModerationStatus) + sizeof(PFCatalogModerationStatus)); + } + return requiredSize; +} + +HRESULT ModerationState::Copy(const PFCatalogModerationState& input, PFCatalogModerationState& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.lastModifiedDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastModifiedDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.reason); + RETURN_IF_FAILED(propCopyResult.hr); + output.reason = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.status); + RETURN_IF_FAILED(propCopyResult.hr); + output.status = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue Rating::ToJson() const +{ + return Rating::ToJson(this->Model()); +} + +JsonValue Rating::ToJson(const PFCatalogRating& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Average", input.average); + JsonUtils::ObjectAddMember(output, "Count1Star", input.count1Star); + JsonUtils::ObjectAddMember(output, "Count2Star", input.count2Star); + JsonUtils::ObjectAddMember(output, "Count3Star", input.count3Star); + JsonUtils::ObjectAddMember(output, "Count4Star", input.count4Star); + JsonUtils::ObjectAddMember(output, "Count5Star", input.count5Star); + JsonUtils::ObjectAddMember(output, "TotalCount", input.totalCount); + return output; +} + +HRESULT Rating::FromJson(const JsonValue& input) +{ + std::optional average{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Average", average)); + this->SetAverage(std::move(average)); + + std::optional count1Star{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Count1Star", count1Star)); + this->SetCount1Star(std::move(count1Star)); + + std::optional count2Star{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Count2Star", count2Star)); + this->SetCount2Star(std::move(count2Star)); + + std::optional count3Star{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Count3Star", count3Star)); + this->SetCount3Star(std::move(count3Star)); + + std::optional count4Star{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Count4Star", count4Star)); + this->SetCount4Star(std::move(count4Star)); + + std::optional count5Star{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Count5Star", count5Star)); + this->SetCount5Star(std::move(count5Star)); + + std::optional totalCount{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalCount", totalCount)); + this->SetTotalCount(std::move(totalCount)); + + return S_OK; +} + +size_t Rating::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Rating::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Rating::RequiredBufferSize(const PFCatalogRating& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.average) + { + requiredSize += (alignof(float) + sizeof(float)); + } + if (model.count1Star) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.count2Star) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.count3Star) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.count4Star) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.count5Star) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.totalCount) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + return requiredSize; +} + +HRESULT Rating::Copy(const PFCatalogRating& input, PFCatalogRating& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.average); + RETURN_IF_FAILED(propCopyResult.hr); + output.average = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.count1Star); + RETURN_IF_FAILED(propCopyResult.hr); + output.count1Star = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.count2Star); + RETURN_IF_FAILED(propCopyResult.hr); + output.count2Star = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.count3Star); + RETURN_IF_FAILED(propCopyResult.hr); + output.count3Star = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.count4Star); + RETURN_IF_FAILED(propCopyResult.hr); + output.count4Star = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.count5Star); + RETURN_IF_FAILED(propCopyResult.hr); + output.count5Star = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.totalCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.totalCount = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue FilterOptions::ToJson() const +{ + return FilterOptions::ToJson(this->Model()); +} + +JsonValue FilterOptions::ToJson(const PFCatalogFilterOptions& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Filter", input.filter); + JsonUtils::ObjectAddMember(output, "IncludeAllItems", input.includeAllItems); + return output; +} + +HRESULT FilterOptions::FromJson(const JsonValue& input) +{ + String filter{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Filter", filter)); + this->SetFilter(std::move(filter)); + + std::optional includeAllItems{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IncludeAllItems", includeAllItems)); + this->SetIncludeAllItems(std::move(includeAllItems)); + + return S_OK; +} + +size_t FilterOptions::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result FilterOptions::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t FilterOptions::RequiredBufferSize(const PFCatalogFilterOptions& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.filter) + { + requiredSize += (std::strlen(model.filter) + 1); + } + if (model.includeAllItems) + { + requiredSize += (alignof(bool) + sizeof(bool)); + } + return requiredSize; +} + +HRESULT FilterOptions::Copy(const PFCatalogFilterOptions& input, PFCatalogFilterOptions& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.filter); + RETURN_IF_FAILED(propCopyResult.hr); + output.filter = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.includeAllItems); + RETURN_IF_FAILED(propCopyResult.hr); + output.includeAllItems = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogPriceAmountOverride::ToJson() const +{ + return CatalogPriceAmountOverride::ToJson(this->Model()); +} + +JsonValue CatalogPriceAmountOverride::ToJson(const PFCatalogCatalogPriceAmountOverride& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FixedValue", input.fixedValue); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + JsonUtils::ObjectAddMember(output, "Multiplier", input.multiplier); + return output; +} + +HRESULT CatalogPriceAmountOverride::FromJson(const JsonValue& input) +{ + std::optional fixedValue{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FixedValue", fixedValue)); + this->SetFixedValue(std::move(fixedValue)); + + String itemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemId", itemId)); + this->SetItemId(std::move(itemId)); + + std::optional multiplier{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Multiplier", multiplier)); + this->SetMultiplier(std::move(multiplier)); + + return S_OK; +} + +size_t CatalogPriceAmountOverride::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogPriceAmountOverride::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogPriceAmountOverride::RequiredBufferSize(const PFCatalogCatalogPriceAmountOverride& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.fixedValue) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.itemId) + { + requiredSize += (std::strlen(model.itemId) + 1); + } + if (model.multiplier) + { + requiredSize += (alignof(double) + sizeof(double)); + } + return requiredSize; +} + +HRESULT CatalogPriceAmountOverride::Copy(const PFCatalogCatalogPriceAmountOverride& input, PFCatalogCatalogPriceAmountOverride& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.fixedValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.fixedValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.multiplier); + RETURN_IF_FAILED(propCopyResult.hr); + output.multiplier = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogPriceOverride::ToJson() const +{ + return CatalogPriceOverride::ToJson(this->Model()); +} + +JsonValue CatalogPriceOverride::ToJson(const PFCatalogCatalogPriceOverride& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Amounts", input.amounts, input.amountsCount); + return output; +} + +HRESULT CatalogPriceOverride::FromJson(const JsonValue& input) +{ + ModelVector amounts{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Amounts", amounts)); + this->SetAmounts(std::move(amounts)); + + return S_OK; +} + +size_t CatalogPriceOverride::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogPriceOverride::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogPriceOverride::RequiredBufferSize(const PFCatalogCatalogPriceOverride& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogCatalogPriceAmountOverride*) + sizeof(PFCatalogCatalogPriceAmountOverride*) * model.amountsCount); + for (size_t i = 0; i < model.amountsCount; ++i) + { + requiredSize += CatalogPriceAmountOverride::RequiredBufferSize(*model.amounts[i]); + } + return requiredSize; +} + +HRESULT CatalogPriceOverride::Copy(const PFCatalogCatalogPriceOverride& input, PFCatalogCatalogPriceOverride& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.amounts, input.amountsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.amounts = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogPriceOptionsOverride::ToJson() const +{ + return CatalogPriceOptionsOverride::ToJson(this->Model()); +} + +JsonValue CatalogPriceOptionsOverride::ToJson(const PFCatalogCatalogPriceOptionsOverride& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Prices", input.prices, input.pricesCount); + return output; +} + +HRESULT CatalogPriceOptionsOverride::FromJson(const JsonValue& input) +{ + ModelVector prices{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Prices", prices)); + this->SetPrices(std::move(prices)); + + return S_OK; +} + +size_t CatalogPriceOptionsOverride::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogPriceOptionsOverride::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogPriceOptionsOverride::RequiredBufferSize(const PFCatalogCatalogPriceOptionsOverride& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogCatalogPriceOverride*) + sizeof(PFCatalogCatalogPriceOverride*) * model.pricesCount); + for (size_t i = 0; i < model.pricesCount; ++i) + { + requiredSize += CatalogPriceOverride::RequiredBufferSize(*model.prices[i]); + } + return requiredSize; +} + +HRESULT CatalogPriceOptionsOverride::Copy(const PFCatalogCatalogPriceOptionsOverride& input, PFCatalogCatalogPriceOptionsOverride& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.prices, input.pricesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.prices = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue StoreDetails::ToJson() const +{ + return StoreDetails::ToJson(this->Model()); +} + +JsonValue StoreDetails::ToJson(const PFCatalogStoreDetails& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FilterOptions", input.filterOptions); + JsonUtils::ObjectAddMember(output, "PriceOptionsOverride", input.priceOptionsOverride); + return output; +} + +HRESULT StoreDetails::FromJson(const JsonValue& input) +{ + std::optional filterOptions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FilterOptions", filterOptions)); + if (filterOptions) + { + this->SetFilterOptions(std::move(*filterOptions)); + } + + std::optional priceOptionsOverride{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PriceOptionsOverride", priceOptionsOverride)); + if (priceOptionsOverride) + { + this->SetPriceOptionsOverride(std::move(*priceOptionsOverride)); + } + + return S_OK; +} + +size_t StoreDetails::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result StoreDetails::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t StoreDetails::RequiredBufferSize(const PFCatalogStoreDetails& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.filterOptions) + { + requiredSize += FilterOptions::RequiredBufferSize(*model.filterOptions); + } + if (model.priceOptionsOverride) + { + requiredSize += CatalogPriceOptionsOverride::RequiredBufferSize(*model.priceOptionsOverride); + } + return requiredSize; +} + +HRESULT StoreDetails::Copy(const PFCatalogStoreDetails& input, PFCatalogStoreDetails& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.filterOptions); + RETURN_IF_FAILED(propCopyResult.hr); + output.filterOptions = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.priceOptionsOverride); + RETURN_IF_FAILED(propCopyResult.hr); + output.priceOptionsOverride = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogItem::ToJson() const +{ + return CatalogItem::ToJson(this->Model()); +} + +JsonValue CatalogItem::ToJson(const PFCatalogCatalogItem& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "AlternateIds", input.alternateIds, input.alternateIdsCount); + JsonUtils::ObjectAddMemberArray(output, "Contents", input.contents, input.contentsCount); + JsonUtils::ObjectAddMember(output, "ContentType", input.contentType); + JsonUtils::ObjectAddMemberTime(output, "CreationDate", input.creationDate); + JsonUtils::ObjectAddMember(output, "CreatorEntity", input.creatorEntity); + JsonUtils::ObjectAddMemberArray(output, "DeepLinks", input.deepLinks, input.deepLinksCount); + JsonUtils::ObjectAddMember(output, "DefaultStackId", input.defaultStackId); + JsonUtils::ObjectAddMemberDictionary(output, "Description", input.description, input.descriptionCount); + JsonUtils::ObjectAddMember(output, "DisplayProperties", input.displayProperties); + JsonUtils::ObjectAddMember(output, "DisplayVersion", input.displayVersion); + JsonUtils::ObjectAddMemberTime(output, "EndDate", input.endDate); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMemberArray(output, "Images", input.images, input.imagesCount); + JsonUtils::ObjectAddMember(output, "IsHidden", input.isHidden); + JsonUtils::ObjectAddMemberArray(output, "ItemReferences", input.itemReferences, input.itemReferencesCount); + JsonUtils::ObjectAddMemberDictionary(output, "Keywords", input.keywords, input.keywordsCount); + JsonUtils::ObjectAddMemberTime(output, "LastModifiedDate", input.lastModifiedDate); + JsonUtils::ObjectAddMember(output, "Moderation", input.moderation); + JsonUtils::ObjectAddMemberArray(output, "Platforms", input.platforms, input.platformsCount); + JsonUtils::ObjectAddMember(output, "PriceOptions", input.priceOptions); + JsonUtils::ObjectAddMember(output, "Rating", input.rating); + JsonUtils::ObjectAddMemberTime(output, "StartDate", input.startDate); + JsonUtils::ObjectAddMember(output, "StoreDetails", input.storeDetails); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + JsonUtils::ObjectAddMemberDictionary(output, "Title", input.title, input.titleCount); + JsonUtils::ObjectAddMember(output, "Type", input.type); + return output; +} + +HRESULT CatalogItem::FromJson(const JsonValue& input) +{ + ModelVector alternateIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AlternateIds", alternateIds)); + this->SetAlternateIds(std::move(alternateIds)); + + ModelVector contents{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Contents", contents)); + this->SetContents(std::move(contents)); + + String contentType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContentType", contentType)); + this->SetContentType(std::move(contentType)); + + std::optional creationDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "CreationDate", creationDate)); + this->SetCreationDate(std::move(creationDate)); + + std::optional creatorEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CreatorEntity", creatorEntity)); + if (creatorEntity) + { + this->SetCreatorEntity(std::move(*creatorEntity)); + } + + ModelVector deepLinks{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DeepLinks", deepLinks)); + this->SetDeepLinks(std::move(deepLinks)); + + String defaultStackId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DefaultStackId", defaultStackId)); + this->SetDefaultStackId(std::move(defaultStackId)); + + StringDictionaryEntryVector description{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Description", description)); + this->SetDescription(std::move(description)); + + JsonObject displayProperties{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayProperties", displayProperties)); + this->SetDisplayProperties(std::move(displayProperties)); + + String displayVersion{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayVersion", displayVersion)); + this->SetDisplayVersion(std::move(displayVersion)); + + std::optional endDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "EndDate", endDate)); + this->SetEndDate(std::move(endDate)); + + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + ModelVector images{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Images", images)); + this->SetImages(std::move(images)); + + std::optional isHidden{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsHidden", isHidden)); + this->SetIsHidden(std::move(isHidden)); + + ModelVector itemReferences{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemReferences", itemReferences)); + this->SetItemReferences(std::move(itemReferences)); + + ModelDictionaryEntryVector keywords{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Keywords", keywords)); + this->SetKeywords(std::move(keywords)); + + std::optional lastModifiedDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastModifiedDate", lastModifiedDate)); + this->SetLastModifiedDate(std::move(lastModifiedDate)); + + std::optional moderation{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Moderation", moderation)); + if (moderation) + { + this->SetModeration(std::move(*moderation)); + } + + CStringVector platforms{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platforms", platforms)); + this->SetPlatforms(std::move(platforms)); + + std::optional priceOptions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PriceOptions", priceOptions)); + if (priceOptions) + { + this->SetPriceOptions(std::move(*priceOptions)); + } + + std::optional rating{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Rating", rating)); + if (rating) + { + this->SetRating(std::move(*rating)); + } + + std::optional startDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "StartDate", startDate)); + this->SetStartDate(std::move(startDate)); + + std::optional storeDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StoreDetails", storeDetails)); + if (storeDetails) + { + this->SetStoreDetails(std::move(*storeDetails)); + } + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + StringDictionaryEntryVector title{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Title", title)); + this->SetTitle(std::move(title)); + + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + return S_OK; +} + +size_t CatalogItem::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogItem::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogItem::RequiredBufferSize(const PFCatalogCatalogItem& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogCatalogAlternateId*) + sizeof(PFCatalogCatalogAlternateId*) * model.alternateIdsCount); + for (size_t i = 0; i < model.alternateIdsCount; ++i) + { + requiredSize += CatalogAlternateId::RequiredBufferSize(*model.alternateIds[i]); + } + requiredSize += (alignof(PFCatalogContent*) + sizeof(PFCatalogContent*) * model.contentsCount); + for (size_t i = 0; i < model.contentsCount; ++i) + { + requiredSize += Content::RequiredBufferSize(*model.contents[i]); + } + if (model.contentType) + { + requiredSize += (std::strlen(model.contentType) + 1); + } + if (model.creationDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.creatorEntity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.creatorEntity); + } + requiredSize += (alignof(PFCatalogDeepLink*) + sizeof(PFCatalogDeepLink*) * model.deepLinksCount); + for (size_t i = 0; i < model.deepLinksCount; ++i) + { + requiredSize += DeepLink::RequiredBufferSize(*model.deepLinks[i]); + } + if (model.defaultStackId) + { + requiredSize += (std::strlen(model.defaultStackId) + 1); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.descriptionCount); + for (size_t i = 0; i < model.descriptionCount; ++i) + { + requiredSize += (std::strlen(model.description[i].key) + 1); + requiredSize += (std::strlen(model.description[i].value) + 1); + } + if (model.displayProperties.stringValue) + { + requiredSize += (std::strlen(model.displayProperties.stringValue) + 1); + } + if (model.displayVersion) + { + requiredSize += (std::strlen(model.displayVersion) + 1); + } + if (model.endDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + requiredSize += (alignof(PFCatalogImage*) + sizeof(PFCatalogImage*) * model.imagesCount); + for (size_t i = 0; i < model.imagesCount; ++i) + { + requiredSize += Image::RequiredBufferSize(*model.images[i]); + } + if (model.isHidden) + { + requiredSize += (alignof(bool) + sizeof(bool)); + } + requiredSize += (alignof(PFCatalogCatalogItemReference*) + sizeof(PFCatalogCatalogItemReference*) * model.itemReferencesCount); + for (size_t i = 0; i < model.itemReferencesCount; ++i) + { + requiredSize += CatalogItemReference::RequiredBufferSize(*model.itemReferences[i]); + } + requiredSize += (alignof(PFCatalogKeywordSetDictionaryEntry) + sizeof(PFCatalogKeywordSetDictionaryEntry) * model.keywordsCount); + for (size_t i = 0; i < model.keywordsCount; ++i) + { + requiredSize += (std::strlen(model.keywords[i].key) + 1); + requiredSize += KeywordSet::RequiredBufferSize(*model.keywords[i].value); + } + if (model.lastModifiedDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.moderation) + { + requiredSize += ModerationState::RequiredBufferSize(*model.moderation); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.platformsCount); + for (size_t i = 0; i < model.platformsCount; ++i) + { + requiredSize += (std::strlen(model.platforms[i]) + 1); + } + if (model.priceOptions) + { + requiredSize += CatalogPriceOptions::RequiredBufferSize(*model.priceOptions); + } + if (model.rating) + { + requiredSize += Rating::RequiredBufferSize(*model.rating); + } + if (model.startDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.storeDetails) + { + requiredSize += StoreDetails::RequiredBufferSize(*model.storeDetails); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.titleCount); + for (size_t i = 0; i < model.titleCount; ++i) + { + requiredSize += (std::strlen(model.title[i].key) + 1); + requiredSize += (std::strlen(model.title[i].value) + 1); + } + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + return requiredSize; +} + +HRESULT CatalogItem::Copy(const PFCatalogCatalogItem& input, PFCatalogCatalogItem& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.alternateIds, input.alternateIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.alternateIds = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.contents, input.contentsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.contents = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.contentType); + RETURN_IF_FAILED(propCopyResult.hr); + output.contentType = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.creationDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.creationDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.creatorEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.creatorEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.deepLinks, input.deepLinksCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.deepLinks = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.defaultStackId); + RETURN_IF_FAILED(propCopyResult.hr); + output.defaultStackId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.description, input.descriptionCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.description = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayProperties.stringValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayProperties.stringValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayVersion); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayVersion = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.endDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.endDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.images, input.imagesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.images = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.isHidden); + RETURN_IF_FAILED(propCopyResult.hr); + output.isHidden = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.itemReferences, input.itemReferencesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemReferences = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.keywords, input.keywordsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.keywords = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastModifiedDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastModifiedDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.moderation); + RETURN_IF_FAILED(propCopyResult.hr); + output.moderation = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.platforms, input.platformsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.platforms = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.priceOptions); + RETURN_IF_FAILED(propCopyResult.hr); + output.priceOptions = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.rating); + RETURN_IF_FAILED(propCopyResult.hr); + output.rating = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.startDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.startDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.storeDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.storeDetails = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.title, input.titleCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.title = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CreateDraftItemRequest::ToJson() const +{ + return CreateDraftItemRequest::ToJson(this->Model()); +} + +JsonValue CreateDraftItemRequest::ToJson(const PFCatalogCreateDraftItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Item", input.item); + JsonUtils::ObjectAddMember(output, "Publish", input.publish); + return output; +} + +HRESULT CreateDraftItemResponse::FromJson(const JsonValue& input) +{ + std::optional item{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Item", item)); + if (item) + { + this->SetItem(std::move(*item)); + } + + return S_OK; +} + +size_t CreateDraftItemResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CreateDraftItemResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CreateDraftItemResponse::RequiredBufferSize(const PFCatalogCreateDraftItemResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.item) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.item); + } + return requiredSize; +} + +HRESULT CreateDraftItemResponse::Copy(const PFCatalogCreateDraftItemResponse& input, PFCatalogCreateDraftItemResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.item); + RETURN_IF_FAILED(propCopyResult.hr); + output.item = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue UploadInfo::ToJson() const +{ + return UploadInfo::ToJson(this->Model()); +} + +JsonValue UploadInfo::ToJson(const PFCatalogUploadInfo& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FileName", input.fileName); + return output; +} + +JsonValue CreateUploadUrlsRequest::ToJson() const +{ + return CreateUploadUrlsRequest::ToJson(this->Model()); +} + +JsonValue CreateUploadUrlsRequest::ToJson(const PFCatalogCreateUploadUrlsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberArray(output, "Files", input.files, input.filesCount); + return output; +} + +HRESULT UploadUrlMetadata::FromJson(const JsonValue& input) +{ + String fileName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FileName", fileName)); + this->SetFileName(std::move(fileName)); + + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String url{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Url", url)); + this->SetUrl(std::move(url)); + + return S_OK; +} + +size_t UploadUrlMetadata::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UploadUrlMetadata::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UploadUrlMetadata::RequiredBufferSize(const PFCatalogUploadUrlMetadata& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.fileName) + { + requiredSize += (std::strlen(model.fileName) + 1); + } + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.url) + { + requiredSize += (std::strlen(model.url) + 1); + } + return requiredSize; +} + +HRESULT UploadUrlMetadata::Copy(const PFCatalogUploadUrlMetadata& input, PFCatalogUploadUrlMetadata& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.fileName); + RETURN_IF_FAILED(propCopyResult.hr); + output.fileName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.url); + RETURN_IF_FAILED(propCopyResult.hr); + output.url = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT CreateUploadUrlsResponse::FromJson(const JsonValue& input) +{ + ModelVector uploadUrls{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UploadUrls", uploadUrls)); + this->SetUploadUrls(std::move(uploadUrls)); + + return S_OK; +} + +size_t CreateUploadUrlsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CreateUploadUrlsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CreateUploadUrlsResponse::RequiredBufferSize(const PFCatalogCreateUploadUrlsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogUploadUrlMetadata*) + sizeof(PFCatalogUploadUrlMetadata*) * model.uploadUrlsCount); + for (size_t i = 0; i < model.uploadUrlsCount; ++i) + { + requiredSize += UploadUrlMetadata::RequiredBufferSize(*model.uploadUrls[i]); + } + return requiredSize; +} + +HRESULT CreateUploadUrlsResponse::Copy(const PFCatalogCreateUploadUrlsResponse& input, PFCatalogCreateUploadUrlsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.uploadUrls, input.uploadUrlsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.uploadUrls = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeleteEntityItemReviewsRequest::ToJson() const +{ + return DeleteEntityItemReviewsRequest::ToJson(this->Model()); +} + +JsonValue DeleteEntityItemReviewsRequest::ToJson(const PFCatalogDeleteEntityItemReviewsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +JsonValue DeleteItemRequest::ToJson() const +{ + return DeleteItemRequest::ToJson(this->Model()); +} + +JsonValue DeleteItemRequest::ToJson(const PFCatalogDeleteItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +JsonValue GetCatalogConfigRequest::ToJson() const +{ + return GetCatalogConfigRequest::ToJson(this->Model()); +} + +JsonValue GetCatalogConfigRequest::ToJson(const PFCatalogGetCatalogConfigRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue CatalogSpecificConfig::ToJson() const +{ + return CatalogSpecificConfig::ToJson(this->Model()); +} + +JsonValue CatalogSpecificConfig::ToJson(const PFCatalogCatalogSpecificConfig& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "ContentTypes", input.contentTypes, input.contentTypesCount); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + return output; +} + +HRESULT CatalogSpecificConfig::FromJson(const JsonValue& input) +{ + CStringVector contentTypes{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContentTypes", contentTypes)); + this->SetContentTypes(std::move(contentTypes)); + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + return S_OK; +} + +size_t CatalogSpecificConfig::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogSpecificConfig::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogSpecificConfig::RequiredBufferSize(const PFCatalogCatalogSpecificConfig& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.contentTypesCount); + for (size_t i = 0; i < model.contentTypesCount; ++i) + { + requiredSize += (std::strlen(model.contentTypes[i]) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + return requiredSize; +} + +HRESULT CatalogSpecificConfig::Copy(const PFCatalogCatalogSpecificConfig& input, PFCatalogCatalogSpecificConfig& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.contentTypes, input.contentTypesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.contentTypes = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeepLinkFormat::ToJson() const +{ + return DeepLinkFormat::ToJson(this->Model()); +} + +JsonValue DeepLinkFormat::ToJson(const PFCatalogDeepLinkFormat& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Format", input.format); + JsonUtils::ObjectAddMember(output, "Platform", input.platform); + return output; +} + +HRESULT DeepLinkFormat::FromJson(const JsonValue& input) +{ + String format{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Format", format)); + this->SetFormat(std::move(format)); + + String platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + return S_OK; +} + +size_t DeepLinkFormat::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DeepLinkFormat::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DeepLinkFormat::RequiredBufferSize(const PFCatalogDeepLinkFormat& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.format) + { + requiredSize += (std::strlen(model.format) + 1); + } + if (model.platform) + { + requiredSize += (std::strlen(model.platform) + 1); + } + return requiredSize; +} + +HRESULT DeepLinkFormat::Copy(const PFCatalogDeepLinkFormat& input, PFCatalogDeepLinkFormat& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.format); + RETURN_IF_FAILED(propCopyResult.hr); + output.format = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DisplayPropertyIndexInfo::ToJson() const +{ + return DisplayPropertyIndexInfo::ToJson(this->Model()); +} + +JsonValue DisplayPropertyIndexInfo::ToJson(const PFCatalogDisplayPropertyIndexInfo& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Name", input.name); + JsonUtils::ObjectAddMember(output, "Type", input.type); + return output; +} + +HRESULT DisplayPropertyIndexInfo::FromJson(const JsonValue& input) +{ + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + std::optional type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + return S_OK; +} + +size_t DisplayPropertyIndexInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DisplayPropertyIndexInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DisplayPropertyIndexInfo::RequiredBufferSize(const PFCatalogDisplayPropertyIndexInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + if (model.type) + { + requiredSize += (alignof(PFCatalogDisplayPropertyType) + sizeof(PFCatalogDisplayPropertyType)); + } + return requiredSize; +} + +HRESULT DisplayPropertyIndexInfo::Copy(const PFCatalogDisplayPropertyIndexInfo& input, PFCatalogDisplayPropertyIndexInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue FileConfig::ToJson() const +{ + return FileConfig::ToJson(this->Model()); +} + +JsonValue FileConfig::ToJson(const PFCatalogFileConfig& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "ContentTypes", input.contentTypes, input.contentTypesCount); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + return output; +} + +HRESULT FileConfig::FromJson(const JsonValue& input) +{ + CStringVector contentTypes{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContentTypes", contentTypes)); + this->SetContentTypes(std::move(contentTypes)); + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + return S_OK; +} + +size_t FileConfig::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result FileConfig::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t FileConfig::RequiredBufferSize(const PFCatalogFileConfig& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.contentTypesCount); + for (size_t i = 0; i < model.contentTypesCount; ++i) + { + requiredSize += (std::strlen(model.contentTypes[i]) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + return requiredSize; +} + +HRESULT FileConfig::Copy(const PFCatalogFileConfig& input, PFCatalogFileConfig& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.contentTypes, input.contentTypesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.contentTypes = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ImageConfig::ToJson() const +{ + return ImageConfig::ToJson(this->Model()); +} + +JsonValue ImageConfig::ToJson(const PFCatalogImageConfig& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + return output; +} + +HRESULT ImageConfig::FromJson(const JsonValue& input) +{ + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + return S_OK; +} + +size_t ImageConfig::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ImageConfig::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ImageConfig::RequiredBufferSize(const PFCatalogImageConfig& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + return requiredSize; +} + +HRESULT ImageConfig::Copy(const PFCatalogImageConfig& input, PFCatalogImageConfig& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue UserGeneratedContentSpecificConfig::ToJson() const +{ + return UserGeneratedContentSpecificConfig::ToJson(this->Model()); +} + +JsonValue UserGeneratedContentSpecificConfig::ToJson(const PFCatalogUserGeneratedContentSpecificConfig& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "ContentTypes", input.contentTypes, input.contentTypesCount); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + return output; +} + +HRESULT UserGeneratedContentSpecificConfig::FromJson(const JsonValue& input) +{ + CStringVector contentTypes{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContentTypes", contentTypes)); + this->SetContentTypes(std::move(contentTypes)); + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + return S_OK; +} + +size_t UserGeneratedContentSpecificConfig::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserGeneratedContentSpecificConfig::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserGeneratedContentSpecificConfig::RequiredBufferSize(const PFCatalogUserGeneratedContentSpecificConfig& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.contentTypesCount); + for (size_t i = 0; i < model.contentTypesCount; ++i) + { + requiredSize += (std::strlen(model.contentTypes[i]) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + return requiredSize; +} + +HRESULT UserGeneratedContentSpecificConfig::Copy(const PFCatalogUserGeneratedContentSpecificConfig& input, PFCatalogUserGeneratedContentSpecificConfig& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.contentTypes, input.contentTypesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.contentTypes = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CatalogConfig::ToJson() const +{ + return CatalogConfig::ToJson(this->Model()); +} + +JsonValue CatalogConfig::ToJson(const PFCatalogCatalogConfig& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "AdminEntities", input.adminEntities, input.adminEntitiesCount); + JsonUtils::ObjectAddMember(output, "Catalog", input.catalog); + JsonUtils::ObjectAddMemberArray(output, "DeepLinkFormats", input.deepLinkFormats, input.deepLinkFormatsCount); + JsonUtils::ObjectAddMemberArray(output, "DisplayPropertyIndexInfos", input.displayPropertyIndexInfos, input.displayPropertyIndexInfosCount); + JsonUtils::ObjectAddMember(output, "File", input.file); + JsonUtils::ObjectAddMember(output, "Image", input.image); + JsonUtils::ObjectAddMember(output, "IsCatalogEnabled", input.isCatalogEnabled); + JsonUtils::ObjectAddMemberArray(output, "Platforms", input.platforms, input.platformsCount); + JsonUtils::ObjectAddMemberArray(output, "ReviewerEntities", input.reviewerEntities, input.reviewerEntitiesCount); + JsonUtils::ObjectAddMember(output, "UserGeneratedContent", input.userGeneratedContent); + return output; +} + +HRESULT CatalogConfig::FromJson(const JsonValue& input) +{ + ModelVector adminEntities{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AdminEntities", adminEntities)); + this->SetAdminEntities(std::move(adminEntities)); + + std::optional catalog{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Catalog", catalog)); + if (catalog) + { + this->SetCatalog(std::move(*catalog)); + } + + ModelVector deepLinkFormats{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DeepLinkFormats", deepLinkFormats)); + this->SetDeepLinkFormats(std::move(deepLinkFormats)); + + ModelVector displayPropertyIndexInfos{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayPropertyIndexInfos", displayPropertyIndexInfos)); + this->SetDisplayPropertyIndexInfos(std::move(displayPropertyIndexInfos)); + + std::optional file{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "File", file)); + if (file) + { + this->SetFile(std::move(*file)); + } + + std::optional image{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Image", image)); + if (image) + { + this->SetImage(std::move(*image)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsCatalogEnabled", this->m_model.isCatalogEnabled)); + + CStringVector platforms{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platforms", platforms)); + this->SetPlatforms(std::move(platforms)); + + ModelVector reviewerEntities{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReviewerEntities", reviewerEntities)); + this->SetReviewerEntities(std::move(reviewerEntities)); + + std::optional userGeneratedContent{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserGeneratedContent", userGeneratedContent)); + if (userGeneratedContent) + { + this->SetUserGeneratedContent(std::move(*userGeneratedContent)); + } + + return S_OK; +} + +size_t CatalogConfig::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CatalogConfig::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CatalogConfig::RequiredBufferSize(const PFCatalogCatalogConfig& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFEntityKey*) + sizeof(PFEntityKey*) * model.adminEntitiesCount); + for (size_t i = 0; i < model.adminEntitiesCount; ++i) + { + requiredSize += EntityKey::RequiredBufferSize(*model.adminEntities[i]); + } + if (model.catalog) + { + requiredSize += CatalogSpecificConfig::RequiredBufferSize(*model.catalog); + } + requiredSize += (alignof(PFCatalogDeepLinkFormat*) + sizeof(PFCatalogDeepLinkFormat*) * model.deepLinkFormatsCount); + for (size_t i = 0; i < model.deepLinkFormatsCount; ++i) + { + requiredSize += DeepLinkFormat::RequiredBufferSize(*model.deepLinkFormats[i]); + } + requiredSize += (alignof(PFCatalogDisplayPropertyIndexInfo*) + sizeof(PFCatalogDisplayPropertyIndexInfo*) * model.displayPropertyIndexInfosCount); + for (size_t i = 0; i < model.displayPropertyIndexInfosCount; ++i) + { + requiredSize += DisplayPropertyIndexInfo::RequiredBufferSize(*model.displayPropertyIndexInfos[i]); + } + if (model.file) + { + requiredSize += FileConfig::RequiredBufferSize(*model.file); + } + if (model.image) + { + requiredSize += ImageConfig::RequiredBufferSize(*model.image); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.platformsCount); + for (size_t i = 0; i < model.platformsCount; ++i) + { + requiredSize += (std::strlen(model.platforms[i]) + 1); + } + requiredSize += (alignof(PFEntityKey*) + sizeof(PFEntityKey*) * model.reviewerEntitiesCount); + for (size_t i = 0; i < model.reviewerEntitiesCount; ++i) + { + requiredSize += EntityKey::RequiredBufferSize(*model.reviewerEntities[i]); + } + if (model.userGeneratedContent) + { + requiredSize += UserGeneratedContentSpecificConfig::RequiredBufferSize(*model.userGeneratedContent); + } + return requiredSize; +} + +HRESULT CatalogConfig::Copy(const PFCatalogCatalogConfig& input, PFCatalogCatalogConfig& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.adminEntities, input.adminEntitiesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.adminEntities = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.catalog); + RETURN_IF_FAILED(propCopyResult.hr); + output.catalog = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.deepLinkFormats, input.deepLinkFormatsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.deepLinkFormats = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.displayPropertyIndexInfos, input.displayPropertyIndexInfosCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayPropertyIndexInfos = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.file); + RETURN_IF_FAILED(propCopyResult.hr); + output.file = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.image); + RETURN_IF_FAILED(propCopyResult.hr); + output.image = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.platforms, input.platformsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.platforms = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.reviewerEntities, input.reviewerEntitiesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.reviewerEntities = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.userGeneratedContent); + RETURN_IF_FAILED(propCopyResult.hr); + output.userGeneratedContent = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetCatalogConfigResponse::FromJson(const JsonValue& input) +{ + std::optional config{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Config", config)); + if (config) + { + this->SetConfig(std::move(*config)); + } + + return S_OK; +} + +size_t GetCatalogConfigResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetCatalogConfigResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetCatalogConfigResponse::RequiredBufferSize(const PFCatalogGetCatalogConfigResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.config) + { + requiredSize += CatalogConfig::RequiredBufferSize(*model.config); + } + return requiredSize; +} + +HRESULT GetCatalogConfigResponse::Copy(const PFCatalogGetCatalogConfigResponse& input, PFCatalogGetCatalogConfigResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.config); + RETURN_IF_FAILED(propCopyResult.hr); + output.config = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetDraftItemRequest::ToJson() const +{ + return GetDraftItemRequest::ToJson(this->Model()); +} + +JsonValue GetDraftItemRequest::ToJson(const PFCatalogGetDraftItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +HRESULT GetDraftItemResponse::FromJson(const JsonValue& input) +{ + std::optional item{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Item", item)); + if (item) + { + this->SetItem(std::move(*item)); + } + + return S_OK; +} + +size_t GetDraftItemResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetDraftItemResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetDraftItemResponse::RequiredBufferSize(const PFCatalogGetDraftItemResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.item) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.item); + } + return requiredSize; +} + +HRESULT GetDraftItemResponse::Copy(const PFCatalogGetDraftItemResponse& input, PFCatalogGetDraftItemResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.item); + RETURN_IF_FAILED(propCopyResult.hr); + output.item = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetDraftItemsRequest::ToJson() const +{ + return GetDraftItemsRequest::ToJson(this->Model()); +} + +JsonValue GetDraftItemsRequest::ToJson(const PFCatalogGetDraftItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "AlternateIds", input.alternateIds, input.alternateIdsCount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "Ids", input.ids, input.idsCount); + return output; +} + +HRESULT GetDraftItemsResponse::FromJson(const JsonValue& input) +{ + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + ModelVector items{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Items", items)); + this->SetItems(std::move(items)); + + return S_OK; +} + +size_t GetDraftItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetDraftItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetDraftItemsResponse::RequiredBufferSize(const PFCatalogGetDraftItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + requiredSize += (alignof(PFCatalogCatalogItem*) + sizeof(PFCatalogCatalogItem*) * model.itemsCount); + for (size_t i = 0; i < model.itemsCount; ++i) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.items[i]); + } + return requiredSize; +} + +HRESULT GetDraftItemsResponse::Copy(const PFCatalogGetDraftItemsResponse& input, PFCatalogGetDraftItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.items, input.itemsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.items = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetEntityDraftItemsRequest::ToJson() const +{ + return GetEntityDraftItemsRequest::ToJson(this->Model()); +} + +JsonValue GetEntityDraftItemsRequest::ToJson(const PFCatalogGetEntityDraftItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMember(output, "Count", input.count); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Filter", input.filter); + return output; +} + +HRESULT GetEntityDraftItemsResponse::FromJson(const JsonValue& input) +{ + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + ModelVector items{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Items", items)); + this->SetItems(std::move(items)); + + return S_OK; +} + +size_t GetEntityDraftItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetEntityDraftItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetEntityDraftItemsResponse::RequiredBufferSize(const PFCatalogGetEntityDraftItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + requiredSize += (alignof(PFCatalogCatalogItem*) + sizeof(PFCatalogCatalogItem*) * model.itemsCount); + for (size_t i = 0; i < model.itemsCount; ++i) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.items[i]); + } + return requiredSize; +} + +HRESULT GetEntityDraftItemsResponse::Copy(const PFCatalogGetEntityDraftItemsResponse& input, PFCatalogGetEntityDraftItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.items, input.itemsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.items = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetEntityItemReviewRequest::ToJson() const +{ + return GetEntityItemReviewRequest::ToJson(this->Model()); +} + +JsonValue GetEntityItemReviewRequest::ToJson(const PFCatalogGetEntityItemReviewRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +JsonValue Review::ToJson() const +{ + return Review::ToJson(this->Model()); +} + +JsonValue Review::ToJson(const PFCatalogReview& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "HelpfulNegative", input.helpfulNegative); + JsonUtils::ObjectAddMember(output, "HelpfulPositive", input.helpfulPositive); + JsonUtils::ObjectAddMember(output, "IsInstalled", input.isInstalled); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + JsonUtils::ObjectAddMember(output, "ItemVersion", input.itemVersion); + JsonUtils::ObjectAddMember(output, "Locale", input.locale); + JsonUtils::ObjectAddMember(output, "Rating", input.rating); + JsonUtils::ObjectAddMember(output, "ReviewerEntity", input.reviewerEntity); + JsonUtils::ObjectAddMember(output, "ReviewerId", input.reviewerId); + JsonUtils::ObjectAddMember(output, "ReviewId", input.reviewId); + JsonUtils::ObjectAddMember(output, "ReviewText", input.reviewText); + JsonUtils::ObjectAddMemberTime(output, "Submitted", input.submitted); + JsonUtils::ObjectAddMember(output, "Title", input.title); + return output; +} + +HRESULT Review::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "HelpfulNegative", this->m_model.helpfulNegative)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "HelpfulPositive", this->m_model.helpfulPositive)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsInstalled", this->m_model.isInstalled)); + + String itemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemId", itemId)); + this->SetItemId(std::move(itemId)); + + String itemVersion{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemVersion", itemVersion)); + this->SetItemVersion(std::move(itemVersion)); + + String locale{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Locale", locale)); + this->SetLocale(std::move(locale)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Rating", this->m_model.rating)); + + std::optional reviewerEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReviewerEntity", reviewerEntity)); + if (reviewerEntity) + { + this->SetReviewerEntity(std::move(*reviewerEntity)); + } + + String reviewerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReviewerId", reviewerId)); + this->SetReviewerId(std::move(reviewerId)); + + String reviewId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReviewId", reviewId)); + this->SetReviewId(std::move(reviewId)); + + String reviewText{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReviewText", reviewText)); + this->SetReviewText(std::move(reviewText)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Submitted", this->m_model.submitted)); + + String title{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Title", title)); + this->SetTitle(std::move(title)); + + return S_OK; +} + +size_t Review::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Review::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Review::RequiredBufferSize(const PFCatalogReview& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.itemId) + { + requiredSize += (std::strlen(model.itemId) + 1); + } + if (model.itemVersion) + { + requiredSize += (std::strlen(model.itemVersion) + 1); + } + if (model.locale) + { + requiredSize += (std::strlen(model.locale) + 1); + } + if (model.reviewerEntity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.reviewerEntity); + } + if (model.reviewerId) + { + requiredSize += (std::strlen(model.reviewerId) + 1); + } + if (model.reviewId) + { + requiredSize += (std::strlen(model.reviewId) + 1); + } + if (model.reviewText) + { + requiredSize += (std::strlen(model.reviewText) + 1); + } + if (model.title) + { + requiredSize += (std::strlen(model.title) + 1); + } + return requiredSize; +} + +HRESULT Review::Copy(const PFCatalogReview& input, PFCatalogReview& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.itemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemVersion); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemVersion = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.locale); + RETURN_IF_FAILED(propCopyResult.hr); + output.locale = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.reviewerEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.reviewerEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.reviewerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.reviewerId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.reviewId); + RETURN_IF_FAILED(propCopyResult.hr); + output.reviewId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.reviewText); + RETURN_IF_FAILED(propCopyResult.hr); + output.reviewText = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.title); + RETURN_IF_FAILED(propCopyResult.hr); + output.title = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetEntityItemReviewResponse::FromJson(const JsonValue& input) +{ + std::optional review{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Review", review)); + if (review) + { + this->SetReview(std::move(*review)); + } + + return S_OK; +} + +size_t GetEntityItemReviewResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetEntityItemReviewResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetEntityItemReviewResponse::RequiredBufferSize(const PFCatalogGetEntityItemReviewResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.review) + { + requiredSize += Review::RequiredBufferSize(*model.review); + } + return requiredSize; +} + +HRESULT GetEntityItemReviewResponse::Copy(const PFCatalogGetEntityItemReviewResponse& input, PFCatalogGetEntityItemReviewResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.review); + RETURN_IF_FAILED(propCopyResult.hr); + output.review = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetItemRequest::ToJson() const +{ + return GetItemRequest::ToJson(this->Model()); +} + +JsonValue GetItemRequest::ToJson(const PFCatalogGetItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +HRESULT GetItemResponse::FromJson(const JsonValue& input) +{ + std::optional item{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Item", item)); + if (item) + { + this->SetItem(std::move(*item)); + } + + return S_OK; +} + +size_t GetItemResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetItemResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetItemResponse::RequiredBufferSize(const PFCatalogGetItemResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.item) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.item); + } + return requiredSize; +} + +HRESULT GetItemResponse::Copy(const PFCatalogGetItemResponse& input, PFCatalogGetItemResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.item); + RETURN_IF_FAILED(propCopyResult.hr); + output.item = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetItemContainersRequest::ToJson() const +{ + return GetItemContainersRequest::ToJson(this->Model()); +} + +JsonValue GetItemContainersRequest::ToJson(const PFCatalogGetItemContainersRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMember(output, "Count", input.count); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +HRESULT GetItemContainersResponse::FromJson(const JsonValue& input) +{ + ModelVector containers{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Containers", containers)); + this->SetContainers(std::move(containers)); + + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + return S_OK; +} + +size_t GetItemContainersResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetItemContainersResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetItemContainersResponse::RequiredBufferSize(const PFCatalogGetItemContainersResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogCatalogItem*) + sizeof(PFCatalogCatalogItem*) * model.containersCount); + for (size_t i = 0; i < model.containersCount; ++i) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.containers[i]); + } + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + return requiredSize; +} + +HRESULT GetItemContainersResponse::Copy(const PFCatalogGetItemContainersResponse& input, PFCatalogGetItemContainersResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.containers, input.containersCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.containers = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetItemModerationStateRequest::ToJson() const +{ + return GetItemModerationStateRequest::ToJson(this->Model()); +} + +JsonValue GetItemModerationStateRequest::ToJson(const PFCatalogGetItemModerationStateRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +HRESULT GetItemModerationStateResponse::FromJson(const JsonValue& input) +{ + std::optional state{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "State", state)); + if (state) + { + this->SetState(std::move(*state)); + } + + return S_OK; +} + +size_t GetItemModerationStateResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetItemModerationStateResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetItemModerationStateResponse::RequiredBufferSize(const PFCatalogGetItemModerationStateResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.state) + { + requiredSize += ModerationState::RequiredBufferSize(*model.state); + } + return requiredSize; +} + +HRESULT GetItemModerationStateResponse::Copy(const PFCatalogGetItemModerationStateResponse& input, PFCatalogGetItemModerationStateResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.state); + RETURN_IF_FAILED(propCopyResult.hr); + output.state = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetItemPublishStatusRequest::ToJson() const +{ + return GetItemPublishStatusRequest::ToJson(this->Model()); +} + +JsonValue GetItemPublishStatusRequest::ToJson(const PFCatalogGetItemPublishStatusRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +HRESULT GetItemPublishStatusResponse::FromJson(const JsonValue& input) +{ + std::optional result{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Result", result)); + this->SetResult(std::move(result)); + + String statusMessage{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StatusMessage", statusMessage)); + this->SetStatusMessage(std::move(statusMessage)); + + return S_OK; +} + +size_t GetItemPublishStatusResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetItemPublishStatusResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetItemPublishStatusResponse::RequiredBufferSize(const PFCatalogGetItemPublishStatusResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.result) + { + requiredSize += (alignof(PFCatalogPublishResult) + sizeof(PFCatalogPublishResult)); + } + if (model.statusMessage) + { + requiredSize += (std::strlen(model.statusMessage) + 1); + } + return requiredSize; +} + +HRESULT GetItemPublishStatusResponse::Copy(const PFCatalogGetItemPublishStatusResponse& input, PFCatalogGetItemPublishStatusResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.result); + RETURN_IF_FAILED(propCopyResult.hr); + output.result = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.statusMessage); + RETURN_IF_FAILED(propCopyResult.hr); + output.statusMessage = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetItemReviewsRequest::ToJson() const +{ + return GetItemReviewsRequest::ToJson(this->Model()); +} + +JsonValue GetItemReviewsRequest::ToJson(const PFCatalogGetItemReviewsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMember(output, "Count", input.count); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "OrderBy", input.orderBy); + return output; +} + +HRESULT GetItemReviewsResponse::FromJson(const JsonValue& input) +{ + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + ModelVector reviews{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Reviews", reviews)); + this->SetReviews(std::move(reviews)); + + return S_OK; +} + +size_t GetItemReviewsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetItemReviewsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetItemReviewsResponse::RequiredBufferSize(const PFCatalogGetItemReviewsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + requiredSize += (alignof(PFCatalogReview*) + sizeof(PFCatalogReview*) * model.reviewsCount); + for (size_t i = 0; i < model.reviewsCount; ++i) + { + requiredSize += Review::RequiredBufferSize(*model.reviews[i]); + } + return requiredSize; +} + +HRESULT GetItemReviewsResponse::Copy(const PFCatalogGetItemReviewsResponse& input, PFCatalogGetItemReviewsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.reviews, input.reviewsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.reviews = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetItemReviewSummaryRequest::ToJson() const +{ + return GetItemReviewSummaryRequest::ToJson(this->Model()); +} + +JsonValue GetItemReviewSummaryRequest::ToJson(const PFCatalogGetItemReviewSummaryRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +HRESULT GetItemReviewSummaryResponse::FromJson(const JsonValue& input) +{ + std::optional leastFavorableReview{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "LeastFavorableReview", leastFavorableReview)); + if (leastFavorableReview) + { + this->SetLeastFavorableReview(std::move(*leastFavorableReview)); + } + + std::optional mostFavorableReview{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MostFavorableReview", mostFavorableReview)); + if (mostFavorableReview) + { + this->SetMostFavorableReview(std::move(*mostFavorableReview)); + } + + std::optional rating{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Rating", rating)); + if (rating) + { + this->SetRating(std::move(*rating)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReviewsCount", this->m_model.reviewsCount)); + + return S_OK; +} + +size_t GetItemReviewSummaryResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetItemReviewSummaryResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetItemReviewSummaryResponse::RequiredBufferSize(const PFCatalogGetItemReviewSummaryResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.leastFavorableReview) + { + requiredSize += Review::RequiredBufferSize(*model.leastFavorableReview); + } + if (model.mostFavorableReview) + { + requiredSize += Review::RequiredBufferSize(*model.mostFavorableReview); + } + if (model.rating) + { + requiredSize += Rating::RequiredBufferSize(*model.rating); + } + return requiredSize; +} + +HRESULT GetItemReviewSummaryResponse::Copy(const PFCatalogGetItemReviewSummaryResponse& input, PFCatalogGetItemReviewSummaryResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.leastFavorableReview); + RETURN_IF_FAILED(propCopyResult.hr); + output.leastFavorableReview = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.mostFavorableReview); + RETURN_IF_FAILED(propCopyResult.hr); + output.mostFavorableReview = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.rating); + RETURN_IF_FAILED(propCopyResult.hr); + output.rating = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetItemsRequest::ToJson() const +{ + return GetItemsRequest::ToJson(this->Model()); +} + +JsonValue GetItemsRequest::ToJson(const PFCatalogGetItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "AlternateIds", input.alternateIds, input.alternateIdsCount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "Ids", input.ids, input.idsCount); + return output; +} + +HRESULT GetItemsResponse::FromJson(const JsonValue& input) +{ + ModelVector items{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Items", items)); + this->SetItems(std::move(items)); + + return S_OK; +} + +size_t GetItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetItemsResponse::RequiredBufferSize(const PFCatalogGetItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCatalogCatalogItem*) + sizeof(PFCatalogCatalogItem*) * model.itemsCount); + for (size_t i = 0; i < model.itemsCount; ++i) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.items[i]); + } + return requiredSize; +} + +HRESULT GetItemsResponse::Copy(const PFCatalogGetItemsResponse& input, PFCatalogGetItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.items, input.itemsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.items = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue PublishDraftItemRequest::ToJson() const +{ + return PublishDraftItemRequest::ToJson(this->Model()); +} + +JsonValue PublishDraftItemRequest::ToJson(const PFCatalogPublishDraftItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +JsonValue ReportItemRequest::ToJson() const +{ + return ReportItemRequest::ToJson(this->Model()); +} + +JsonValue ReportItemRequest::ToJson(const PFCatalogReportItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMember(output, "ConcernCategory", input.concernCategory); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "Reason", input.reason); + return output; +} + +JsonValue ReportItemReviewRequest::ToJson() const +{ + return ReportItemReviewRequest::ToJson(this->Model()); +} + +JsonValue ReportItemReviewRequest::ToJson(const PFCatalogReportItemReviewRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMember(output, "ConcernCategory", input.concernCategory); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + JsonUtils::ObjectAddMember(output, "Reason", input.reason); + JsonUtils::ObjectAddMember(output, "ReviewId", input.reviewId); + return output; +} + +JsonValue ReviewItemRequest::ToJson() const +{ + return ReviewItemRequest::ToJson(this->Model()); +} + +JsonValue ReviewItemRequest::ToJson(const PFCatalogReviewItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "Review", input.review); + return output; +} + +JsonValue StoreReference::ToJson() const +{ + return StoreReference::ToJson(this->Model()); +} + +JsonValue StoreReference::ToJson(const PFCatalogStoreReference& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMember(output, "Id", input.id); + return output; +} + +JsonValue SearchItemsRequest::ToJson() const +{ + return SearchItemsRequest::ToJson(this->Model()); +} + +JsonValue SearchItemsRequest::ToJson(const PFCatalogSearchItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMember(output, "Count", input.count); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Filter", input.filter); + JsonUtils::ObjectAddMember(output, "Language", input.language); + JsonUtils::ObjectAddMember(output, "OrderBy", input.orderBy); + JsonUtils::ObjectAddMember(output, "Search", input.search); + JsonUtils::ObjectAddMember(output, "Select", input.select); + JsonUtils::ObjectAddMember(output, "Store", input.store); + return output; +} + +HRESULT SearchItemsResponse::FromJson(const JsonValue& input) +{ + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + ModelVector items{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Items", items)); + this->SetItems(std::move(items)); + + return S_OK; +} + +size_t SearchItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SearchItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SearchItemsResponse::RequiredBufferSize(const PFCatalogSearchItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + requiredSize += (alignof(PFCatalogCatalogItem*) + sizeof(PFCatalogCatalogItem*) * model.itemsCount); + for (size_t i = 0; i < model.itemsCount; ++i) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.items[i]); + } + return requiredSize; +} + +HRESULT SearchItemsResponse::Copy(const PFCatalogSearchItemsResponse& input, PFCatalogSearchItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.items, input.itemsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.items = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SetItemModerationStateRequest::ToJson() const +{ + return SetItemModerationStateRequest::ToJson(this->Model()); +} + +JsonValue SetItemModerationStateRequest::ToJson(const PFCatalogSetItemModerationStateRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "Reason", input.reason); + JsonUtils::ObjectAddMember(output, "Status", input.status); + return output; +} + +JsonValue SubmitItemReviewVoteRequest::ToJson() const +{ + return SubmitItemReviewVoteRequest::ToJson(this->Model()); +} + +JsonValue SubmitItemReviewVoteRequest::ToJson(const PFCatalogSubmitItemReviewVoteRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + JsonUtils::ObjectAddMember(output, "ReviewId", input.reviewId); + JsonUtils::ObjectAddMember(output, "Vote", input.vote); + return output; +} + +JsonValue ReviewTakedown::ToJson() const +{ + return ReviewTakedown::ToJson(this->Model()); +} + +JsonValue ReviewTakedown::ToJson(const PFCatalogReviewTakedown& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + JsonUtils::ObjectAddMember(output, "ReviewId", input.reviewId); + return output; +} + +JsonValue TakedownItemReviewsRequest::ToJson() const +{ + return TakedownItemReviewsRequest::ToJson(this->Model()); +} + +JsonValue TakedownItemReviewsRequest::ToJson(const PFCatalogTakedownItemReviewsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberArray(output, "Reviews", input.reviews, input.reviewsCount); + return output; +} + +JsonValue UpdateCatalogConfigRequest::ToJson() const +{ + return UpdateCatalogConfigRequest::ToJson(this->Model()); +} + +JsonValue UpdateCatalogConfigRequest::ToJson(const PFCatalogUpdateCatalogConfigRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Config", input.config); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +JsonValue UpdateDraftItemRequest::ToJson() const +{ + return UpdateDraftItemRequest::ToJson(this->Model()); +} + +JsonValue UpdateDraftItemRequest::ToJson(const PFCatalogUpdateDraftItemRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Item", input.item); + JsonUtils::ObjectAddMember(output, "Publish", input.publish); + return output; +} + +HRESULT UpdateDraftItemResponse::FromJson(const JsonValue& input) +{ + std::optional item{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Item", item)); + if (item) + { + this->SetItem(std::move(*item)); + } + + return S_OK; +} + +size_t UpdateDraftItemResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateDraftItemResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateDraftItemResponse::RequiredBufferSize(const PFCatalogUpdateDraftItemResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.item) + { + requiredSize += CatalogItem::RequiredBufferSize(*model.item); + } + return requiredSize; +} + +HRESULT UpdateDraftItemResponse::Copy(const PFCatalogUpdateDraftItemResponse& input, PFCatalogUpdateDraftItemResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.item); + RETURN_IF_FAILED(propCopyResult.hr); + output.item = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Catalog +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CatalogTypes.h b/Source/PlayFabServices/Source/Generated/CatalogTypes.h new file mode 100644 index 0000000..a6f0558 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CatalogTypes.h @@ -0,0 +1,1295 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Catalog +{ + +// Catalog Classes +class CatalogAlternateId : public Wrappers::PFCatalogCatalogAlternateIdWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogAlternateIdWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogAlternateId& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogAlternateId& model); + static HRESULT Copy(const PFCatalogCatalogAlternateId& input, PFCatalogCatalogAlternateId& output, ModelBuffer& buffer); +}; + +class Content : public Wrappers::PFCatalogContentWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogContentWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogContent& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogContent& model); + static HRESULT Copy(const PFCatalogContent& input, PFCatalogContent& output, ModelBuffer& buffer); +}; + +class DeepLink : public Wrappers::PFCatalogDeepLinkWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogDeepLinkWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogDeepLink& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogDeepLink& model); + static HRESULT Copy(const PFCatalogDeepLink& input, PFCatalogDeepLink& output, ModelBuffer& buffer); +}; + +class Image : public Wrappers::PFCatalogImageWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogImageWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogImage& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogImage& model); + static HRESULT Copy(const PFCatalogImage& input, PFCatalogImage& output, ModelBuffer& buffer); +}; + +class CatalogPriceAmount : public Wrappers::PFCatalogCatalogPriceAmountWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogPriceAmountWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogPriceAmount& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogPriceAmount& model); + static HRESULT Copy(const PFCatalogCatalogPriceAmount& input, PFCatalogCatalogPriceAmount& output, ModelBuffer& buffer); +}; + +class CatalogPrice : public Wrappers::PFCatalogCatalogPriceWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogPriceWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogPrice& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogPrice& model); + static HRESULT Copy(const PFCatalogCatalogPrice& input, PFCatalogCatalogPrice& output, ModelBuffer& buffer); +}; + +class CatalogPriceOptions : public Wrappers::PFCatalogCatalogPriceOptionsWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogPriceOptionsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogPriceOptions& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogPriceOptions& model); + static HRESULT Copy(const PFCatalogCatalogPriceOptions& input, PFCatalogCatalogPriceOptions& output, ModelBuffer& buffer); +}; + +class CatalogItemReference : public Wrappers::PFCatalogCatalogItemReferenceWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogItemReferenceWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogItemReference& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogItemReference& model); + static HRESULT Copy(const PFCatalogCatalogItemReference& input, PFCatalogCatalogItemReference& output, ModelBuffer& buffer); +}; + +class KeywordSet : public Wrappers::PFCatalogKeywordSetWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogKeywordSetWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogKeywordSet& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogKeywordSet& model); + static HRESULT Copy(const PFCatalogKeywordSet& input, PFCatalogKeywordSet& output, ModelBuffer& buffer); +}; + +class ModerationState : public Wrappers::PFCatalogModerationStateWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogModerationStateWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogModerationState& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogModerationState& model); + static HRESULT Copy(const PFCatalogModerationState& input, PFCatalogModerationState& output, ModelBuffer& buffer); +}; + +class Rating : public Wrappers::PFCatalogRatingWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogRatingWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogRating& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogRating& model); + static HRESULT Copy(const PFCatalogRating& input, PFCatalogRating& output, ModelBuffer& buffer); +}; + +class FilterOptions : public Wrappers::PFCatalogFilterOptionsWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogFilterOptionsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogFilterOptions& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogFilterOptions& model); + static HRESULT Copy(const PFCatalogFilterOptions& input, PFCatalogFilterOptions& output, ModelBuffer& buffer); +}; + +class CatalogPriceAmountOverride : public Wrappers::PFCatalogCatalogPriceAmountOverrideWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogPriceAmountOverrideWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogPriceAmountOverride& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogPriceAmountOverride& model); + static HRESULT Copy(const PFCatalogCatalogPriceAmountOverride& input, PFCatalogCatalogPriceAmountOverride& output, ModelBuffer& buffer); +}; + +class CatalogPriceOverride : public Wrappers::PFCatalogCatalogPriceOverrideWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogPriceOverrideWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogPriceOverride& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogPriceOverride& model); + static HRESULT Copy(const PFCatalogCatalogPriceOverride& input, PFCatalogCatalogPriceOverride& output, ModelBuffer& buffer); +}; + +class CatalogPriceOptionsOverride : public Wrappers::PFCatalogCatalogPriceOptionsOverrideWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogPriceOptionsOverrideWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogPriceOptionsOverride& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogPriceOptionsOverride& model); + static HRESULT Copy(const PFCatalogCatalogPriceOptionsOverride& input, PFCatalogCatalogPriceOptionsOverride& output, ModelBuffer& buffer); +}; + +class StoreDetails : public Wrappers::PFCatalogStoreDetailsWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogStoreDetailsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogStoreDetails& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogStoreDetails& model); + static HRESULT Copy(const PFCatalogStoreDetails& input, PFCatalogStoreDetails& output, ModelBuffer& buffer); +}; + +class CatalogItem : public Wrappers::PFCatalogCatalogItemWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogItemWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogItem& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogItem& model); + static HRESULT Copy(const PFCatalogCatalogItem& input, PFCatalogCatalogItem& output, ModelBuffer& buffer); +}; + +class CreateDraftItemRequest : public Wrappers::PFCatalogCreateDraftItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCreateDraftItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCreateDraftItemRequest& input); +}; + +class CreateDraftItemResponse : public Wrappers::PFCatalogCreateDraftItemResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCreateDraftItemResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCreateDraftItemResponse& model); + static HRESULT Copy(const PFCatalogCreateDraftItemResponse& input, PFCatalogCreateDraftItemResponse& output, ModelBuffer& buffer); +}; + +class UploadInfo : public Wrappers::PFCatalogUploadInfoWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogUploadInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogUploadInfo& input); +}; + +class CreateUploadUrlsRequest : public Wrappers::PFCatalogCreateUploadUrlsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCreateUploadUrlsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCreateUploadUrlsRequest& input); +}; + +class UploadUrlMetadata : public Wrappers::PFCatalogUploadUrlMetadataWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogUploadUrlMetadataWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogUploadUrlMetadata& model); + static HRESULT Copy(const PFCatalogUploadUrlMetadata& input, PFCatalogUploadUrlMetadata& output, ModelBuffer& buffer); +}; + +class CreateUploadUrlsResponse : public Wrappers::PFCatalogCreateUploadUrlsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCreateUploadUrlsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCreateUploadUrlsResponse& model); + static HRESULT Copy(const PFCatalogCreateUploadUrlsResponse& input, PFCatalogCreateUploadUrlsResponse& output, ModelBuffer& buffer); +}; + +class DeleteEntityItemReviewsRequest : public Wrappers::PFCatalogDeleteEntityItemReviewsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogDeleteEntityItemReviewsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogDeleteEntityItemReviewsRequest& input); +}; + +class DeleteItemRequest : public Wrappers::PFCatalogDeleteItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogDeleteItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogDeleteItemRequest& input); +}; + +class GetCatalogConfigRequest : public Wrappers::PFCatalogGetCatalogConfigRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetCatalogConfigRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetCatalogConfigRequest& input); +}; + +class CatalogSpecificConfig : public Wrappers::PFCatalogCatalogSpecificConfigWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogSpecificConfigWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogSpecificConfig& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogSpecificConfig& model); + static HRESULT Copy(const PFCatalogCatalogSpecificConfig& input, PFCatalogCatalogSpecificConfig& output, ModelBuffer& buffer); +}; + +class DeepLinkFormat : public Wrappers::PFCatalogDeepLinkFormatWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogDeepLinkFormatWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogDeepLinkFormat& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogDeepLinkFormat& model); + static HRESULT Copy(const PFCatalogDeepLinkFormat& input, PFCatalogDeepLinkFormat& output, ModelBuffer& buffer); +}; + +class DisplayPropertyIndexInfo : public Wrappers::PFCatalogDisplayPropertyIndexInfoWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogDisplayPropertyIndexInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogDisplayPropertyIndexInfo& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogDisplayPropertyIndexInfo& model); + static HRESULT Copy(const PFCatalogDisplayPropertyIndexInfo& input, PFCatalogDisplayPropertyIndexInfo& output, ModelBuffer& buffer); +}; + +class FileConfig : public Wrappers::PFCatalogFileConfigWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogFileConfigWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogFileConfig& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogFileConfig& model); + static HRESULT Copy(const PFCatalogFileConfig& input, PFCatalogFileConfig& output, ModelBuffer& buffer); +}; + +class ImageConfig : public Wrappers::PFCatalogImageConfigWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogImageConfigWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogImageConfig& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogImageConfig& model); + static HRESULT Copy(const PFCatalogImageConfig& input, PFCatalogImageConfig& output, ModelBuffer& buffer); +}; + +class UserGeneratedContentSpecificConfig : public Wrappers::PFCatalogUserGeneratedContentSpecificConfigWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogUserGeneratedContentSpecificConfigWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogUserGeneratedContentSpecificConfig& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogUserGeneratedContentSpecificConfig& model); + static HRESULT Copy(const PFCatalogUserGeneratedContentSpecificConfig& input, PFCatalogUserGeneratedContentSpecificConfig& output, ModelBuffer& buffer); +}; + +class CatalogConfig : public Wrappers::PFCatalogCatalogConfigWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogCatalogConfigWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogCatalogConfig& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogCatalogConfig& model); + static HRESULT Copy(const PFCatalogCatalogConfig& input, PFCatalogCatalogConfig& output, ModelBuffer& buffer); +}; + +class GetCatalogConfigResponse : public Wrappers::PFCatalogGetCatalogConfigResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetCatalogConfigResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetCatalogConfigResponse& model); + static HRESULT Copy(const PFCatalogGetCatalogConfigResponse& input, PFCatalogGetCatalogConfigResponse& output, ModelBuffer& buffer); +}; + +class GetDraftItemRequest : public Wrappers::PFCatalogGetDraftItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetDraftItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetDraftItemRequest& input); +}; + +class GetDraftItemResponse : public Wrappers::PFCatalogGetDraftItemResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetDraftItemResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetDraftItemResponse& model); + static HRESULT Copy(const PFCatalogGetDraftItemResponse& input, PFCatalogGetDraftItemResponse& output, ModelBuffer& buffer); +}; + +class GetDraftItemsRequest : public Wrappers::PFCatalogGetDraftItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetDraftItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetDraftItemsRequest& input); +}; + +class GetDraftItemsResponse : public Wrappers::PFCatalogGetDraftItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetDraftItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetDraftItemsResponse& model); + static HRESULT Copy(const PFCatalogGetDraftItemsResponse& input, PFCatalogGetDraftItemsResponse& output, ModelBuffer& buffer); +}; + +class GetEntityDraftItemsRequest : public Wrappers::PFCatalogGetEntityDraftItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetEntityDraftItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetEntityDraftItemsRequest& input); +}; + +class GetEntityDraftItemsResponse : public Wrappers::PFCatalogGetEntityDraftItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetEntityDraftItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetEntityDraftItemsResponse& model); + static HRESULT Copy(const PFCatalogGetEntityDraftItemsResponse& input, PFCatalogGetEntityDraftItemsResponse& output, ModelBuffer& buffer); +}; + +class GetEntityItemReviewRequest : public Wrappers::PFCatalogGetEntityItemReviewRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetEntityItemReviewRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetEntityItemReviewRequest& input); +}; + +class Review : public Wrappers::PFCatalogReviewWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogReviewWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogReview& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogReview& model); + static HRESULT Copy(const PFCatalogReview& input, PFCatalogReview& output, ModelBuffer& buffer); +}; + +class GetEntityItemReviewResponse : public Wrappers::PFCatalogGetEntityItemReviewResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetEntityItemReviewResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetEntityItemReviewResponse& model); + static HRESULT Copy(const PFCatalogGetEntityItemReviewResponse& input, PFCatalogGetEntityItemReviewResponse& output, ModelBuffer& buffer); +}; + +class GetItemRequest : public Wrappers::PFCatalogGetItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetItemRequest& input); +}; + +class GetItemResponse : public Wrappers::PFCatalogGetItemResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetItemResponse& model); + static HRESULT Copy(const PFCatalogGetItemResponse& input, PFCatalogGetItemResponse& output, ModelBuffer& buffer); +}; + +class GetItemContainersRequest : public Wrappers::PFCatalogGetItemContainersRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemContainersRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetItemContainersRequest& input); +}; + +class GetItemContainersResponse : public Wrappers::PFCatalogGetItemContainersResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemContainersResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetItemContainersResponse& model); + static HRESULT Copy(const PFCatalogGetItemContainersResponse& input, PFCatalogGetItemContainersResponse& output, ModelBuffer& buffer); +}; + +class GetItemModerationStateRequest : public Wrappers::PFCatalogGetItemModerationStateRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemModerationStateRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetItemModerationStateRequest& input); +}; + +class GetItemModerationStateResponse : public Wrappers::PFCatalogGetItemModerationStateResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemModerationStateResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetItemModerationStateResponse& model); + static HRESULT Copy(const PFCatalogGetItemModerationStateResponse& input, PFCatalogGetItemModerationStateResponse& output, ModelBuffer& buffer); +}; + +class GetItemPublishStatusRequest : public Wrappers::PFCatalogGetItemPublishStatusRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemPublishStatusRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetItemPublishStatusRequest& input); +}; + +class GetItemPublishStatusResponse : public Wrappers::PFCatalogGetItemPublishStatusResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemPublishStatusResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetItemPublishStatusResponse& model); + static HRESULT Copy(const PFCatalogGetItemPublishStatusResponse& input, PFCatalogGetItemPublishStatusResponse& output, ModelBuffer& buffer); +}; + +class GetItemReviewsRequest : public Wrappers::PFCatalogGetItemReviewsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemReviewsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetItemReviewsRequest& input); +}; + +class GetItemReviewsResponse : public Wrappers::PFCatalogGetItemReviewsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemReviewsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetItemReviewsResponse& model); + static HRESULT Copy(const PFCatalogGetItemReviewsResponse& input, PFCatalogGetItemReviewsResponse& output, ModelBuffer& buffer); +}; + +class GetItemReviewSummaryRequest : public Wrappers::PFCatalogGetItemReviewSummaryRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemReviewSummaryRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetItemReviewSummaryRequest& input); +}; + +class GetItemReviewSummaryResponse : public Wrappers::PFCatalogGetItemReviewSummaryResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemReviewSummaryResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetItemReviewSummaryResponse& model); + static HRESULT Copy(const PFCatalogGetItemReviewSummaryResponse& input, PFCatalogGetItemReviewSummaryResponse& output, ModelBuffer& buffer); +}; + +class GetItemsRequest : public Wrappers::PFCatalogGetItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogGetItemsRequest& input); +}; + +class GetItemsResponse : public Wrappers::PFCatalogGetItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogGetItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogGetItemsResponse& model); + static HRESULT Copy(const PFCatalogGetItemsResponse& input, PFCatalogGetItemsResponse& output, ModelBuffer& buffer); +}; + +class PublishDraftItemRequest : public Wrappers::PFCatalogPublishDraftItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogPublishDraftItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogPublishDraftItemRequest& input); +}; + +class ReportItemRequest : public Wrappers::PFCatalogReportItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogReportItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogReportItemRequest& input); +}; + +class ReportItemReviewRequest : public Wrappers::PFCatalogReportItemReviewRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogReportItemReviewRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogReportItemReviewRequest& input); +}; + +class ReviewItemRequest : public Wrappers::PFCatalogReviewItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogReviewItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogReviewItemRequest& input); +}; + +class StoreReference : public Wrappers::PFCatalogStoreReferenceWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogStoreReferenceWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogStoreReference& input); +}; + +class SearchItemsRequest : public Wrappers::PFCatalogSearchItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogSearchItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogSearchItemsRequest& input); +}; + +class SearchItemsResponse : public Wrappers::PFCatalogSearchItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogSearchItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogSearchItemsResponse& model); + static HRESULT Copy(const PFCatalogSearchItemsResponse& input, PFCatalogSearchItemsResponse& output, ModelBuffer& buffer); +}; + +class SetItemModerationStateRequest : public Wrappers::PFCatalogSetItemModerationStateRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogSetItemModerationStateRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogSetItemModerationStateRequest& input); +}; + +class SubmitItemReviewVoteRequest : public Wrappers::PFCatalogSubmitItemReviewVoteRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogSubmitItemReviewVoteRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogSubmitItemReviewVoteRequest& input); +}; + +class ReviewTakedown : public Wrappers::PFCatalogReviewTakedownWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogReviewTakedownWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogReviewTakedown& input); +}; + +class TakedownItemReviewsRequest : public Wrappers::PFCatalogTakedownItemReviewsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogTakedownItemReviewsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogTakedownItemReviewsRequest& input); +}; + +class UpdateCatalogConfigRequest : public Wrappers::PFCatalogUpdateCatalogConfigRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogUpdateCatalogConfigRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogUpdateCatalogConfigRequest& input); +}; + +class UpdateDraftItemRequest : public Wrappers::PFCatalogUpdateDraftItemRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogUpdateDraftItemRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCatalogUpdateDraftItemRequest& input); +}; + +class UpdateDraftItemResponse : public Wrappers::PFCatalogUpdateDraftItemResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCatalogUpdateDraftItemResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCatalogUpdateDraftItemResponse& model); + static HRESULT Copy(const PFCatalogUpdateDraftItemResponse& input, PFCatalogUpdateDraftItemResponse& output, ModelBuffer& buffer); +}; + +} // namespace Catalog +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Character.cpp b/Source/PlayFabServices/Source/Generated/Character.cpp new file mode 100644 index 0000000..84c6970 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Character.cpp @@ -0,0 +1,500 @@ +#include "stdafx.h" +#include "Character.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Character +{ + + +AsyncOp CharacterAPI::ClientGetAllUsersCharacters( + Entity const& entity, + const ListUsersCharactersRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetAllUsersCharacters" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CharacterClientGetAllUsersCharacters, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListUsersCharactersResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ClientGetCharacterData( + Entity const& entity, + const GetCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetCharacterData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CharacterClientGetCharacterData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ClientGetCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ClientGetCharacterReadOnlyData( + Entity const& entity, + const GetCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetCharacterReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CharacterClientGetCharacterReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ClientGetCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ClientGrantCharacterToUser( + Entity const& entity, + const ClientGrantCharacterToUserRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GrantCharacterToUser" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CharacterClientGrantCharacterToUser, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ClientGrantCharacterToUserResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ClientUpdateCharacterData( + Entity const& entity, + const ClientUpdateCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UpdateCharacterData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CharacterClientUpdateCharacterData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerDeleteCharacterFromUser( + Entity const& entity, + const DeleteCharacterFromUserRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/DeleteCharacterFromUser" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerDeleteCharacterFromUser, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerGetAllUsersCharacters( + Entity const& entity, + const ListUsersCharactersRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetAllUsersCharacters" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerGetAllUsersCharacters, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListUsersCharactersResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerGetCharacterData( + Entity const& entity, + const GetCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetCharacterData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerGetCharacterData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerGetCharacterInternalData( + Entity const& entity, + const GetCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetCharacterInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerGetCharacterInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerGetCharacterReadOnlyData( + Entity const& entity, + const GetCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetCharacterReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerGetCharacterReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerGrantCharacterToUser( + Entity const& entity, + const ServerGrantCharacterToUserRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GrantCharacterToUser" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerGrantCharacterToUser, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGrantCharacterToUserResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerUpdateCharacterData( + Entity const& entity, + const ServerUpdateCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateCharacterData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerUpdateCharacterData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerUpdateCharacterInternalData( + Entity const& entity, + const ServerUpdateCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateCharacterInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerUpdateCharacterInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp CharacterAPI::ServerUpdateCharacterReadOnlyData( + Entity const& entity, + const ServerUpdateCharacterDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateCharacterReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::CharacterServerUpdateCharacterReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateCharacterDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Character +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Character.h b/Source/PlayFabServices/Source/Generated/Character.h new file mode 100644 index 0000000..de7002d --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Character.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include "CharacterTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Character +{ + +class CharacterAPI +{ +public: + CharacterAPI() = delete; + CharacterAPI(const CharacterAPI& source) = delete; + CharacterAPI& operator=(const CharacterAPI& source) = delete; + ~CharacterAPI() = default; + + // ------------ Generated API calls + static AsyncOp ClientGetAllUsersCharacters(Entity const& entity, const ListUsersCharactersRequest& request, RunContext rc); + static AsyncOp ClientGetCharacterData(Entity const& entity, const GetCharacterDataRequest& request, RunContext rc); + static AsyncOp ClientGetCharacterReadOnlyData(Entity const& entity, const GetCharacterDataRequest& request, RunContext rc); + static AsyncOp ClientGrantCharacterToUser(Entity const& entity, const ClientGrantCharacterToUserRequest& request, RunContext rc); + static AsyncOp ClientUpdateCharacterData(Entity const& entity, const ClientUpdateCharacterDataRequest& request, RunContext rc); + static AsyncOp ServerDeleteCharacterFromUser(Entity const& entity, const DeleteCharacterFromUserRequest& request, RunContext rc); + static AsyncOp ServerGetAllUsersCharacters(Entity const& entity, const ListUsersCharactersRequest& request, RunContext rc); + static AsyncOp ServerGetCharacterData(Entity const& entity, const GetCharacterDataRequest& request, RunContext rc); + static AsyncOp ServerGetCharacterInternalData(Entity const& entity, const GetCharacterDataRequest& request, RunContext rc); + static AsyncOp ServerGetCharacterReadOnlyData(Entity const& entity, const GetCharacterDataRequest& request, RunContext rc); + static AsyncOp ServerGrantCharacterToUser(Entity const& entity, const ServerGrantCharacterToUserRequest& request, RunContext rc); + static AsyncOp ServerUpdateCharacterData(Entity const& entity, const ServerUpdateCharacterDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateCharacterInternalData(Entity const& entity, const ServerUpdateCharacterDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateCharacterReadOnlyData(Entity const& entity, const ServerUpdateCharacterDataRequest& request, RunContext rc); +}; + +} // namespace Character +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CharacterTypes.cpp b/Source/PlayFabServices/Source/Generated/CharacterTypes.cpp new file mode 100644 index 0000000..a0dbbda --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CharacterTypes.cpp @@ -0,0 +1,410 @@ +#include "stdafx.h" +#include "CharacterTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Character +{ + +JsonValue ListUsersCharactersRequest::ToJson() const +{ + return ListUsersCharactersRequest::ToJson(this->Model()); +} + +JsonValue ListUsersCharactersRequest::ToJson(const PFCharacterListUsersCharactersRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT ListUsersCharactersResult::FromJson(const JsonValue& input) +{ + ModelVector characters{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Characters", characters)); + this->SetCharacters(std::move(characters)); + + return S_OK; +} + +size_t ListUsersCharactersResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListUsersCharactersResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListUsersCharactersResult::RequiredBufferSize(const PFCharacterListUsersCharactersResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFCharacterResult*) + sizeof(PFCharacterResult*) * model.charactersCount); + for (size_t i = 0; i < model.charactersCount; ++i) + { + requiredSize += CharacterResult::RequiredBufferSize(*model.characters[i]); + } + return requiredSize; +} + +HRESULT ListUsersCharactersResult::Copy(const PFCharacterListUsersCharactersResult& input, PFCharacterListUsersCharactersResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.characters, input.charactersCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.characters = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetCharacterDataRequest::ToJson() const +{ + return GetCharacterDataRequest::ToJson(this->Model()); +} + +JsonValue GetCharacterDataRequest::ToJson(const PFCharacterGetCharacterDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CharacterId", input.characterId); + JsonUtils::ObjectAddMember(output, "IfChangedFromDataVersion", input.ifChangedFromDataVersion); + JsonUtils::ObjectAddMemberArray(output, "Keys", input.keys, input.keysCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT ClientGetCharacterDataResult::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + ModelDictionaryEntryVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataVersion", this->m_model.dataVersion)); + + return S_OK; +} + +size_t ClientGetCharacterDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ClientGetCharacterDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ClientGetCharacterDataResult::RequiredBufferSize(const PFCharacterClientGetCharacterDataResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += (std::strlen(model.data[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.data[i].value); + } + return requiredSize; +} + +HRESULT ClientGetCharacterDataResult::Copy(const PFCharacterClientGetCharacterDataResult& input, PFCharacterClientGetCharacterDataResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ClientGrantCharacterToUserRequest::ToJson() const +{ + return ClientGrantCharacterToUserRequest::ToJson(this->Model()); +} + +JsonValue ClientGrantCharacterToUserRequest::ToJson(const PFCharacterClientGrantCharacterToUserRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CatalogVersion", input.catalogVersion); + JsonUtils::ObjectAddMember(output, "CharacterName", input.characterName); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + return output; +} + +HRESULT ClientGrantCharacterToUserResult::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + String characterType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterType", characterType)); + this->SetCharacterType(std::move(characterType)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Result", this->m_model.result)); + + return S_OK; +} + +size_t ClientGrantCharacterToUserResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ClientGrantCharacterToUserResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ClientGrantCharacterToUserResult::RequiredBufferSize(const PFCharacterClientGrantCharacterToUserResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + if (model.characterType) + { + requiredSize += (std::strlen(model.characterType) + 1); + } + return requiredSize; +} + +HRESULT ClientGrantCharacterToUserResult::Copy(const PFCharacterClientGrantCharacterToUserResult& input, PFCharacterClientGrantCharacterToUserResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.characterType); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterType = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ClientUpdateCharacterDataRequest::ToJson() const +{ + return ClientUpdateCharacterDataRequest::ToJson(this->Model()); +} + +JsonValue ClientUpdateCharacterDataRequest::ToJson(const PFCharacterClientUpdateCharacterDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CharacterId", input.characterId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberDictionary(output, "Data", input.data, input.dataCount); + JsonUtils::ObjectAddMemberArray(output, "KeysToRemove", input.keysToRemove, input.keysToRemoveCount); + JsonUtils::ObjectAddMember(output, "Permission", input.permission); + return output; +} + +HRESULT UpdateCharacterDataResult::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataVersion", this->m_model.dataVersion)); + + return S_OK; +} + +size_t UpdateCharacterDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateCharacterDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateCharacterDataResult::RequiredBufferSize(const PFCharacterUpdateCharacterDataResult& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT UpdateCharacterDataResult::Copy(const PFCharacterUpdateCharacterDataResult& input, PFCharacterUpdateCharacterDataResult& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +JsonValue DeleteCharacterFromUserRequest::ToJson() const +{ + return DeleteCharacterFromUserRequest::ToJson(this->Model()); +} + +JsonValue DeleteCharacterFromUserRequest::ToJson(const PFCharacterDeleteCharacterFromUserRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CharacterId", input.characterId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "SaveCharacterInventory", input.saveCharacterInventory); + return output; +} + +HRESULT ServerGetCharacterDataResult::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + ModelDictionaryEntryVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataVersion", this->m_model.dataVersion)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t ServerGetCharacterDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ServerGetCharacterDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ServerGetCharacterDataResult::RequiredBufferSize(const PFCharacterServerGetCharacterDataResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += (std::strlen(model.data[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.data[i].value); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT ServerGetCharacterDataResult::Copy(const PFCharacterServerGetCharacterDataResult& input, PFCharacterServerGetCharacterDataResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ServerGrantCharacterToUserRequest::ToJson() const +{ + return ServerGrantCharacterToUserRequest::ToJson(this->Model()); +} + +JsonValue ServerGrantCharacterToUserRequest::ToJson(const PFCharacterServerGrantCharacterToUserRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CharacterName", input.characterName); + JsonUtils::ObjectAddMember(output, "CharacterType", input.characterType); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT ServerGrantCharacterToUserResult::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + return S_OK; +} + +size_t ServerGrantCharacterToUserResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ServerGrantCharacterToUserResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ServerGrantCharacterToUserResult::RequiredBufferSize(const PFCharacterServerGrantCharacterToUserResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + return requiredSize; +} + +HRESULT ServerGrantCharacterToUserResult::Copy(const PFCharacterServerGrantCharacterToUserResult& input, PFCharacterServerGrantCharacterToUserResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ServerUpdateCharacterDataRequest::ToJson() const +{ + return ServerUpdateCharacterDataRequest::ToJson(this->Model()); +} + +JsonValue ServerUpdateCharacterDataRequest::ToJson(const PFCharacterServerUpdateCharacterDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CharacterId", input.characterId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberDictionary(output, "Data", input.data, input.dataCount); + JsonUtils::ObjectAddMemberArray(output, "KeysToRemove", input.keysToRemove, input.keysToRemoveCount); + JsonUtils::ObjectAddMember(output, "Permission", input.permission); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +} // namespace Character +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CharacterTypes.h b/Source/PlayFabServices/Source/Generated/CharacterTypes.h new file mode 100644 index 0000000..0afbb45 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CharacterTypes.h @@ -0,0 +1,227 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Character +{ + +// Character Classes +class ListUsersCharactersRequest : public Wrappers::PFCharacterListUsersCharactersRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterListUsersCharactersRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCharacterListUsersCharactersRequest& input); +}; + +class ListUsersCharactersResult : public Wrappers::PFCharacterListUsersCharactersResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterListUsersCharactersResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterListUsersCharactersResult& model); + static HRESULT Copy(const PFCharacterListUsersCharactersResult& input, PFCharacterListUsersCharactersResult& output, ModelBuffer& buffer); +}; + +class GetCharacterDataRequest : public Wrappers::PFCharacterGetCharacterDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterGetCharacterDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCharacterGetCharacterDataRequest& input); +}; + +class ClientGetCharacterDataResult : public Wrappers::PFCharacterClientGetCharacterDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterClientGetCharacterDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterClientGetCharacterDataResult& model); + static HRESULT Copy(const PFCharacterClientGetCharacterDataResult& input, PFCharacterClientGetCharacterDataResult& output, ModelBuffer& buffer); +}; + +class ClientGrantCharacterToUserRequest : public Wrappers::PFCharacterClientGrantCharacterToUserRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterClientGrantCharacterToUserRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCharacterClientGrantCharacterToUserRequest& input); +}; + +class ClientGrantCharacterToUserResult : public Wrappers::PFCharacterClientGrantCharacterToUserResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterClientGrantCharacterToUserResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterClientGrantCharacterToUserResult& model); + static HRESULT Copy(const PFCharacterClientGrantCharacterToUserResult& input, PFCharacterClientGrantCharacterToUserResult& output, ModelBuffer& buffer); +}; + +class ClientUpdateCharacterDataRequest : public Wrappers::PFCharacterClientUpdateCharacterDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterClientUpdateCharacterDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCharacterClientUpdateCharacterDataRequest& input); +}; + +class UpdateCharacterDataResult : public Wrappers::PFCharacterUpdateCharacterDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterUpdateCharacterDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterUpdateCharacterDataResult& model); + static HRESULT Copy(const PFCharacterUpdateCharacterDataResult& input, PFCharacterUpdateCharacterDataResult& output, ModelBuffer& buffer); +}; + +class DeleteCharacterFromUserRequest : public Wrappers::PFCharacterDeleteCharacterFromUserRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterDeleteCharacterFromUserRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCharacterDeleteCharacterFromUserRequest& input); +}; + +class ServerGetCharacterDataResult : public Wrappers::PFCharacterServerGetCharacterDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterServerGetCharacterDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterServerGetCharacterDataResult& model); + static HRESULT Copy(const PFCharacterServerGetCharacterDataResult& input, PFCharacterServerGetCharacterDataResult& output, ModelBuffer& buffer); +}; + +class ServerGrantCharacterToUserRequest : public Wrappers::PFCharacterServerGrantCharacterToUserRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterServerGrantCharacterToUserRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCharacterServerGrantCharacterToUserRequest& input); +}; + +class ServerGrantCharacterToUserResult : public Wrappers::PFCharacterServerGrantCharacterToUserResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterServerGrantCharacterToUserResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterServerGrantCharacterToUserResult& model); + static HRESULT Copy(const PFCharacterServerGrantCharacterToUserResult& input, PFCharacterServerGrantCharacterToUserResult& output, ModelBuffer& buffer); +}; + +class ServerUpdateCharacterDataRequest : public Wrappers::PFCharacterServerUpdateCharacterDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterServerUpdateCharacterDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCharacterServerUpdateCharacterDataRequest& input); +}; + +} // namespace Character +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CloudScript.cpp b/Source/PlayFabServices/Source/Generated/CloudScript.cpp new file mode 100644 index 0000000..02e57d7 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CloudScript.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "CloudScript.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace CloudScript +{ + + +AsyncOp CloudScriptAPI::ExecuteFunction( + Entity const& entity, + const ExecuteFunctionRequest& request, + RunContext rc +) +{ + const char* path{ "/CloudScript/ExecuteFunction" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::CloudScriptExecuteFunction, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ExecuteFunctionResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace CloudScript +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CloudScript.h b/Source/PlayFabServices/Source/Generated/CloudScript.h new file mode 100644 index 0000000..7e15b53 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CloudScript.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include "CloudScriptTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace CloudScript +{ + +class CloudScriptAPI +{ +public: + CloudScriptAPI() = delete; + CloudScriptAPI(const CloudScriptAPI& source) = delete; + CloudScriptAPI& operator=(const CloudScriptAPI& source) = delete; + ~CloudScriptAPI() = default; + + // ------------ Generated API calls + static AsyncOp ExecuteFunction(Entity const& entity, const ExecuteFunctionRequest& request, RunContext rc); +}; + +} // namespace CloudScript +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CloudScriptTypes.cpp b/Source/PlayFabServices/Source/Generated/CloudScriptTypes.cpp new file mode 100644 index 0000000..7272b28 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CloudScriptTypes.cpp @@ -0,0 +1,178 @@ +#include "stdafx.h" +#include "CloudScriptTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace CloudScript +{ + +JsonValue ExecuteFunctionRequest::ToJson() const +{ + return ExecuteFunctionRequest::ToJson(this->Model()); +} + +JsonValue ExecuteFunctionRequest::ToJson(const PFCloudScriptExecuteFunctionRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "FunctionName", input.functionName); + JsonUtils::ObjectAddMember(output, "FunctionParameter", input.functionParameter); + JsonUtils::ObjectAddMember(output, "GeneratePlayStreamEvent", input.generatePlayStreamEvent); + return output; +} + +HRESULT FunctionExecutionError::FromJson(const JsonValue& input) +{ + String error{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Error", error)); + this->SetError(std::move(error)); + + String message{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Message", message)); + this->SetMessage(std::move(message)); + + String stackTrace{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StackTrace", stackTrace)); + this->SetStackTrace(std::move(stackTrace)); + + return S_OK; +} + +size_t FunctionExecutionError::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result FunctionExecutionError::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t FunctionExecutionError::RequiredBufferSize(const PFCloudScriptFunctionExecutionError& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.error) + { + requiredSize += (std::strlen(model.error) + 1); + } + if (model.message) + { + requiredSize += (std::strlen(model.message) + 1); + } + if (model.stackTrace) + { + requiredSize += (std::strlen(model.stackTrace) + 1); + } + return requiredSize; +} + +HRESULT FunctionExecutionError::Copy(const PFCloudScriptFunctionExecutionError& input, PFCloudScriptFunctionExecutionError& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.error); + RETURN_IF_FAILED(propCopyResult.hr); + output.error = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.message); + RETURN_IF_FAILED(propCopyResult.hr); + output.message = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.stackTrace); + RETURN_IF_FAILED(propCopyResult.hr); + output.stackTrace = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ExecuteFunctionResult::FromJson(const JsonValue& input) +{ + std::optional error{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Error", error)); + if (error) + { + this->SetError(std::move(*error)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ExecutionTimeMilliseconds", this->m_model.executionTimeMilliseconds)); + + String functionName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FunctionName", functionName)); + this->SetFunctionName(std::move(functionName)); + + JsonObject functionResult{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FunctionResult", functionResult)); + this->SetFunctionResult(std::move(functionResult)); + + std::optional functionResultTooLarge{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FunctionResultTooLarge", functionResultTooLarge)); + this->SetFunctionResultTooLarge(std::move(functionResultTooLarge)); + + return S_OK; +} + +size_t ExecuteFunctionResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ExecuteFunctionResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ExecuteFunctionResult::RequiredBufferSize(const PFCloudScriptExecuteFunctionResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.error) + { + requiredSize += FunctionExecutionError::RequiredBufferSize(*model.error); + } + if (model.functionName) + { + requiredSize += (std::strlen(model.functionName) + 1); + } + if (model.functionResult.stringValue) + { + requiredSize += (std::strlen(model.functionResult.stringValue) + 1); + } + if (model.functionResultTooLarge) + { + requiredSize += (alignof(bool) + sizeof(bool)); + } + return requiredSize; +} + +HRESULT ExecuteFunctionResult::Copy(const PFCloudScriptExecuteFunctionResult& input, PFCloudScriptExecuteFunctionResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.error); + RETURN_IF_FAILED(propCopyResult.hr); + output.error = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.functionName); + RETURN_IF_FAILED(propCopyResult.hr); + output.functionName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.functionResult.stringValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.functionResult.stringValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.functionResultTooLarge); + RETURN_IF_FAILED(propCopyResult.hr); + output.functionResultTooLarge = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace CloudScript +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CloudScriptTypes.h b/Source/PlayFabServices/Source/Generated/CloudScriptTypes.h new file mode 100644 index 0000000..a7b8491 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CloudScriptTypes.h @@ -0,0 +1,67 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace CloudScript +{ + +// CloudScript Classes +class ExecuteFunctionRequest : public Wrappers::PFCloudScriptExecuteFunctionRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCloudScriptExecuteFunctionRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFCloudScriptExecuteFunctionRequest& input); +}; + +class FunctionExecutionError : public Wrappers::PFCloudScriptFunctionExecutionErrorWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCloudScriptFunctionExecutionErrorWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCloudScriptFunctionExecutionError& model); + static HRESULT Copy(const PFCloudScriptFunctionExecutionError& input, PFCloudScriptFunctionExecutionError& output, ModelBuffer& buffer); +}; + +class ExecuteFunctionResult : public Wrappers::PFCloudScriptExecuteFunctionResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCloudScriptExecuteFunctionResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCloudScriptExecuteFunctionResult& model); + static HRESULT Copy(const PFCloudScriptExecuteFunctionResult& input, PFCloudScriptExecuteFunctionResult& output, ModelBuffer& buffer); +}; + +} // namespace CloudScript +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CoreTypes.cpp b/Source/PlayFabServices/Source/Generated/CoreTypes.cpp new file mode 100644 index 0000000..e60ad3d --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CoreTypes.cpp @@ -0,0 +1,3360 @@ +#include "stdafx.h" +#include "CoreTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ + +JsonValue PlayerProfileViewConstraints::ToJson() const +{ + return PlayerProfileViewConstraints::ToJson(this->Model()); +} + +JsonValue PlayerProfileViewConstraints::ToJson(const PFPlayerProfileViewConstraints& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ShowAvatarUrl", input.showAvatarUrl); + JsonUtils::ObjectAddMember(output, "ShowBannedUntil", input.showBannedUntil); + JsonUtils::ObjectAddMember(output, "ShowCampaignAttributions", input.showCampaignAttributions); + JsonUtils::ObjectAddMember(output, "ShowContactEmailAddresses", input.showContactEmailAddresses); + JsonUtils::ObjectAddMember(output, "ShowCreated", input.showCreated); + JsonUtils::ObjectAddMember(output, "ShowDisplayName", input.showDisplayName); + JsonUtils::ObjectAddMember(output, "ShowExperimentVariants", input.showExperimentVariants); + JsonUtils::ObjectAddMember(output, "ShowLastLogin", input.showLastLogin); + JsonUtils::ObjectAddMember(output, "ShowLinkedAccounts", input.showLinkedAccounts); + JsonUtils::ObjectAddMember(output, "ShowLocations", input.showLocations); + JsonUtils::ObjectAddMember(output, "ShowMemberships", input.showMemberships); + JsonUtils::ObjectAddMember(output, "ShowOrigination", input.showOrigination); + JsonUtils::ObjectAddMember(output, "ShowPushNotificationRegistrations", input.showPushNotificationRegistrations); + JsonUtils::ObjectAddMember(output, "ShowStatistics", input.showStatistics); + JsonUtils::ObjectAddMember(output, "ShowTags", input.showTags); + JsonUtils::ObjectAddMember(output, "ShowTotalValueToDateInUsd", input.showTotalValueToDateInUsd); + JsonUtils::ObjectAddMember(output, "ShowValuesToDate", input.showValuesToDate); + return output; +} + +JsonValue GetPlayerCombinedInfoRequestParams::ToJson() const +{ + return GetPlayerCombinedInfoRequestParams::ToJson(this->Model()); +} + +JsonValue GetPlayerCombinedInfoRequestParams::ToJson(const PFGetPlayerCombinedInfoRequestParams& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "GetCharacterInventories", input.getCharacterInventories); + JsonUtils::ObjectAddMember(output, "GetCharacterList", input.getCharacterList); + JsonUtils::ObjectAddMember(output, "GetPlayerProfile", input.getPlayerProfile); + JsonUtils::ObjectAddMember(output, "GetPlayerStatistics", input.getPlayerStatistics); + JsonUtils::ObjectAddMember(output, "GetTitleData", input.getTitleData); + JsonUtils::ObjectAddMember(output, "GetUserAccountInfo", input.getUserAccountInfo); + JsonUtils::ObjectAddMember(output, "GetUserData", input.getUserData); + JsonUtils::ObjectAddMember(output, "GetUserInventory", input.getUserInventory); + JsonUtils::ObjectAddMember(output, "GetUserReadOnlyData", input.getUserReadOnlyData); + JsonUtils::ObjectAddMember(output, "GetUserVirtualCurrency", input.getUserVirtualCurrency); + JsonUtils::ObjectAddMemberArray(output, "PlayerStatisticNames", input.playerStatisticNames, input.playerStatisticNamesCount); + JsonUtils::ObjectAddMember(output, "ProfileConstraints", input.profileConstraints); + JsonUtils::ObjectAddMemberArray(output, "TitleDataKeys", input.titleDataKeys, input.titleDataKeysCount); + JsonUtils::ObjectAddMemberArray(output, "UserDataKeys", input.userDataKeys, input.userDataKeysCount); + JsonUtils::ObjectAddMemberArray(output, "UserReadOnlyDataKeys", input.userReadOnlyDataKeys, input.userReadOnlyDataKeysCount); + return output; +} + +JsonValue EntityKey::ToJson() const +{ + return EntityKey::ToJson(this->Model()); +} + +JsonValue EntityKey::ToJson(const PFEntityKey& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "Type", input.type); + return output; +} + +HRESULT EntityKey::FromJson(const JsonValue& input) +{ + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + return S_OK; +} + +size_t EntityKey::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityKey::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityKey::RequiredBufferSize(const PFEntityKey& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + return requiredSize; +} + +HRESULT EntityKey::Copy(const PFEntityKey& input, PFEntityKey& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserAndroidDeviceInfo::FromJson(const JsonValue& input) +{ + String androidDeviceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AndroidDeviceId", androidDeviceId)); + this->SetAndroidDeviceId(std::move(androidDeviceId)); + + return S_OK; +} + +size_t UserAndroidDeviceInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserAndroidDeviceInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserAndroidDeviceInfo::RequiredBufferSize(const PFUserAndroidDeviceInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.androidDeviceId) + { + requiredSize += (std::strlen(model.androidDeviceId) + 1); + } + return requiredSize; +} + +HRESULT UserAndroidDeviceInfo::Copy(const PFUserAndroidDeviceInfo& input, PFUserAndroidDeviceInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.androidDeviceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.androidDeviceId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserAppleIdInfo::FromJson(const JsonValue& input) +{ + String appleSubjectId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AppleSubjectId", appleSubjectId)); + this->SetAppleSubjectId(std::move(appleSubjectId)); + + return S_OK; +} + +size_t UserAppleIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserAppleIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserAppleIdInfo::RequiredBufferSize(const PFUserAppleIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.appleSubjectId) + { + requiredSize += (std::strlen(model.appleSubjectId) + 1); + } + return requiredSize; +} + +HRESULT UserAppleIdInfo::Copy(const PFUserAppleIdInfo& input, PFUserAppleIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.appleSubjectId); + RETURN_IF_FAILED(propCopyResult.hr); + output.appleSubjectId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserCustomIdInfo::FromJson(const JsonValue& input) +{ + String customId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CustomId", customId)); + this->SetCustomId(std::move(customId)); + + return S_OK; +} + +size_t UserCustomIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserCustomIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserCustomIdInfo::RequiredBufferSize(const PFUserCustomIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.customId) + { + requiredSize += (std::strlen(model.customId) + 1); + } + return requiredSize; +} + +HRESULT UserCustomIdInfo::Copy(const PFUserCustomIdInfo& input, PFUserCustomIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.customId); + RETURN_IF_FAILED(propCopyResult.hr); + output.customId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserFacebookInfo::FromJson(const JsonValue& input) +{ + String facebookId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookId", facebookId)); + this->SetFacebookId(std::move(facebookId)); + + String fullName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FullName", fullName)); + this->SetFullName(std::move(fullName)); + + return S_OK; +} + +size_t UserFacebookInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserFacebookInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserFacebookInfo::RequiredBufferSize(const PFUserFacebookInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.facebookId) + { + requiredSize += (std::strlen(model.facebookId) + 1); + } + if (model.fullName) + { + requiredSize += (std::strlen(model.fullName) + 1); + } + return requiredSize; +} + +HRESULT UserFacebookInfo::Copy(const PFUserFacebookInfo& input, PFUserFacebookInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.facebookId); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.fullName); + RETURN_IF_FAILED(propCopyResult.hr); + output.fullName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserFacebookInstantGamesIdInfo::FromJson(const JsonValue& input) +{ + String facebookInstantGamesId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInstantGamesId", facebookInstantGamesId)); + this->SetFacebookInstantGamesId(std::move(facebookInstantGamesId)); + + return S_OK; +} + +size_t UserFacebookInstantGamesIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserFacebookInstantGamesIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserFacebookInstantGamesIdInfo::RequiredBufferSize(const PFUserFacebookInstantGamesIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.facebookInstantGamesId) + { + requiredSize += (std::strlen(model.facebookInstantGamesId) + 1); + } + return requiredSize; +} + +HRESULT UserFacebookInstantGamesIdInfo::Copy(const PFUserFacebookInstantGamesIdInfo& input, PFUserFacebookInstantGamesIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.facebookInstantGamesId); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInstantGamesId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserGameCenterInfo::FromJson(const JsonValue& input) +{ + String gameCenterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GameCenterId", gameCenterId)); + this->SetGameCenterId(std::move(gameCenterId)); + + return S_OK; +} + +size_t UserGameCenterInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserGameCenterInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserGameCenterInfo::RequiredBufferSize(const PFUserGameCenterInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.gameCenterId) + { + requiredSize += (std::strlen(model.gameCenterId) + 1); + } + return requiredSize; +} + +HRESULT UserGameCenterInfo::Copy(const PFUserGameCenterInfo& input, PFUserGameCenterInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.gameCenterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.gameCenterId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserGoogleInfo::FromJson(const JsonValue& input) +{ + String googleEmail{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleEmail", googleEmail)); + this->SetGoogleEmail(std::move(googleEmail)); + + String googleGender{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleGender", googleGender)); + this->SetGoogleGender(std::move(googleGender)); + + String googleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleId", googleId)); + this->SetGoogleId(std::move(googleId)); + + String googleLocale{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleLocale", googleLocale)); + this->SetGoogleLocale(std::move(googleLocale)); + + String googleName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleName", googleName)); + this->SetGoogleName(std::move(googleName)); + + return S_OK; +} + +size_t UserGoogleInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserGoogleInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserGoogleInfo::RequiredBufferSize(const PFUserGoogleInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.googleEmail) + { + requiredSize += (std::strlen(model.googleEmail) + 1); + } + if (model.googleGender) + { + requiredSize += (std::strlen(model.googleGender) + 1); + } + if (model.googleId) + { + requiredSize += (std::strlen(model.googleId) + 1); + } + if (model.googleLocale) + { + requiredSize += (std::strlen(model.googleLocale) + 1); + } + if (model.googleName) + { + requiredSize += (std::strlen(model.googleName) + 1); + } + return requiredSize; +} + +HRESULT UserGoogleInfo::Copy(const PFUserGoogleInfo& input, PFUserGoogleInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.googleEmail); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleEmail = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleGender); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleGender = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleLocale); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleLocale = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleName); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserGooglePlayGamesInfo::FromJson(const JsonValue& input) +{ + String googlePlayGamesPlayerAvatarImageUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesPlayerAvatarImageUrl", googlePlayGamesPlayerAvatarImageUrl)); + this->SetGooglePlayGamesPlayerAvatarImageUrl(std::move(googlePlayGamesPlayerAvatarImageUrl)); + + String googlePlayGamesPlayerDisplayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesPlayerDisplayName", googlePlayGamesPlayerDisplayName)); + this->SetGooglePlayGamesPlayerDisplayName(std::move(googlePlayGamesPlayerDisplayName)); + + String googlePlayGamesPlayerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesPlayerId", googlePlayGamesPlayerId)); + this->SetGooglePlayGamesPlayerId(std::move(googlePlayGamesPlayerId)); + + return S_OK; +} + +size_t UserGooglePlayGamesInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserGooglePlayGamesInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserGooglePlayGamesInfo::RequiredBufferSize(const PFUserGooglePlayGamesInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.googlePlayGamesPlayerAvatarImageUrl) + { + requiredSize += (std::strlen(model.googlePlayGamesPlayerAvatarImageUrl) + 1); + } + if (model.googlePlayGamesPlayerDisplayName) + { + requiredSize += (std::strlen(model.googlePlayGamesPlayerDisplayName) + 1); + } + if (model.googlePlayGamesPlayerId) + { + requiredSize += (std::strlen(model.googlePlayGamesPlayerId) + 1); + } + return requiredSize; +} + +HRESULT UserGooglePlayGamesInfo::Copy(const PFUserGooglePlayGamesInfo& input, PFUserGooglePlayGamesInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesPlayerAvatarImageUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesPlayerAvatarImageUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesPlayerDisplayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesPlayerDisplayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesPlayerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesPlayerId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserIosDeviceInfo::FromJson(const JsonValue& input) +{ + String iosDeviceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IosDeviceId", iosDeviceId)); + this->SetIosDeviceId(std::move(iosDeviceId)); + + return S_OK; +} + +size_t UserIosDeviceInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserIosDeviceInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserIosDeviceInfo::RequiredBufferSize(const PFUserIosDeviceInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.iosDeviceId) + { + requiredSize += (std::strlen(model.iosDeviceId) + 1); + } + return requiredSize; +} + +HRESULT UserIosDeviceInfo::Copy(const PFUserIosDeviceInfo& input, PFUserIosDeviceInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.iosDeviceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.iosDeviceId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserKongregateInfo::FromJson(const JsonValue& input) +{ + String kongregateId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KongregateId", kongregateId)); + this->SetKongregateId(std::move(kongregateId)); + + String kongregateName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KongregateName", kongregateName)); + this->SetKongregateName(std::move(kongregateName)); + + return S_OK; +} + +size_t UserKongregateInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserKongregateInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserKongregateInfo::RequiredBufferSize(const PFUserKongregateInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.kongregateId) + { + requiredSize += (std::strlen(model.kongregateId) + 1); + } + if (model.kongregateName) + { + requiredSize += (std::strlen(model.kongregateName) + 1); + } + return requiredSize; +} + +HRESULT UserKongregateInfo::Copy(const PFUserKongregateInfo& input, PFUserKongregateInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.kongregateId); + RETURN_IF_FAILED(propCopyResult.hr); + output.kongregateId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.kongregateName); + RETURN_IF_FAILED(propCopyResult.hr); + output.kongregateName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserNintendoSwitchAccountIdInfo::FromJson(const JsonValue& input) +{ + String nintendoSwitchAccountSubjectId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchAccountSubjectId", nintendoSwitchAccountSubjectId)); + this->SetNintendoSwitchAccountSubjectId(std::move(nintendoSwitchAccountSubjectId)); + + return S_OK; +} + +size_t UserNintendoSwitchAccountIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserNintendoSwitchAccountIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserNintendoSwitchAccountIdInfo::RequiredBufferSize(const PFUserNintendoSwitchAccountIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.nintendoSwitchAccountSubjectId) + { + requiredSize += (std::strlen(model.nintendoSwitchAccountSubjectId) + 1); + } + return requiredSize; +} + +HRESULT UserNintendoSwitchAccountIdInfo::Copy(const PFUserNintendoSwitchAccountIdInfo& input, PFUserNintendoSwitchAccountIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchAccountSubjectId); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchAccountSubjectId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserNintendoSwitchDeviceIdInfo::FromJson(const JsonValue& input) +{ + String nintendoSwitchDeviceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchDeviceId", nintendoSwitchDeviceId)); + this->SetNintendoSwitchDeviceId(std::move(nintendoSwitchDeviceId)); + + return S_OK; +} + +size_t UserNintendoSwitchDeviceIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserNintendoSwitchDeviceIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserNintendoSwitchDeviceIdInfo::RequiredBufferSize(const PFUserNintendoSwitchDeviceIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.nintendoSwitchDeviceId) + { + requiredSize += (std::strlen(model.nintendoSwitchDeviceId) + 1); + } + return requiredSize; +} + +HRESULT UserNintendoSwitchDeviceIdInfo::Copy(const PFUserNintendoSwitchDeviceIdInfo& input, PFUserNintendoSwitchDeviceIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchDeviceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchDeviceId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserOpenIdInfo::FromJson(const JsonValue& input) +{ + String connectionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ConnectionId", connectionId)); + this->SetConnectionId(std::move(connectionId)); + + String issuer{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Issuer", issuer)); + this->SetIssuer(std::move(issuer)); + + String subject{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Subject", subject)); + this->SetSubject(std::move(subject)); + + return S_OK; +} + +size_t UserOpenIdInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserOpenIdInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserOpenIdInfo::RequiredBufferSize(const PFUserOpenIdInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.connectionId) + { + requiredSize += (std::strlen(model.connectionId) + 1); + } + if (model.issuer) + { + requiredSize += (std::strlen(model.issuer) + 1); + } + if (model.subject) + { + requiredSize += (std::strlen(model.subject) + 1); + } + return requiredSize; +} + +HRESULT UserOpenIdInfo::Copy(const PFUserOpenIdInfo& input, PFUserOpenIdInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.connectionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.connectionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.issuer); + RETURN_IF_FAILED(propCopyResult.hr); + output.issuer = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subject); + RETURN_IF_FAILED(propCopyResult.hr); + output.subject = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserPrivateAccountInfo::FromJson(const JsonValue& input) +{ + String email{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Email", email)); + this->SetEmail(std::move(email)); + + return S_OK; +} + +size_t UserPrivateAccountInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserPrivateAccountInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserPrivateAccountInfo::RequiredBufferSize(const PFUserPrivateAccountInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.email) + { + requiredSize += (std::strlen(model.email) + 1); + } + return requiredSize; +} + +HRESULT UserPrivateAccountInfo::Copy(const PFUserPrivateAccountInfo& input, PFUserPrivateAccountInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.email); + RETURN_IF_FAILED(propCopyResult.hr); + output.email = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserPsnInfo::FromJson(const JsonValue& input) +{ + String psnAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PsnAccountId", psnAccountId)); + this->SetPsnAccountId(std::move(psnAccountId)); + + String psnOnlineId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PsnOnlineId", psnOnlineId)); + this->SetPsnOnlineId(std::move(psnOnlineId)); + + return S_OK; +} + +size_t UserPsnInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserPsnInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserPsnInfo::RequiredBufferSize(const PFUserPsnInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.psnAccountId) + { + requiredSize += (std::strlen(model.psnAccountId) + 1); + } + if (model.psnOnlineId) + { + requiredSize += (std::strlen(model.psnOnlineId) + 1); + } + return requiredSize; +} + +HRESULT UserPsnInfo::Copy(const PFUserPsnInfo& input, PFUserPsnInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.psnAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.psnAccountId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.psnOnlineId); + RETURN_IF_FAILED(propCopyResult.hr); + output.psnOnlineId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserSteamInfo::FromJson(const JsonValue& input) +{ + std::optional steamActivationStatus{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamActivationStatus", steamActivationStatus)); + this->SetSteamActivationStatus(std::move(steamActivationStatus)); + + String steamCountry{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamCountry", steamCountry)); + this->SetSteamCountry(std::move(steamCountry)); + + std::optional steamCurrency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamCurrency", steamCurrency)); + this->SetSteamCurrency(std::move(steamCurrency)); + + String steamId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamId", steamId)); + this->SetSteamId(std::move(steamId)); + + String steamName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamName", steamName)); + this->SetSteamName(std::move(steamName)); + + return S_OK; +} + +size_t UserSteamInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserSteamInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserSteamInfo::RequiredBufferSize(const PFUserSteamInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.steamActivationStatus) + { + requiredSize += (alignof(PFTitleActivationStatus) + sizeof(PFTitleActivationStatus)); + } + if (model.steamCountry) + { + requiredSize += (std::strlen(model.steamCountry) + 1); + } + if (model.steamCurrency) + { + requiredSize += (alignof(PFCurrency) + sizeof(PFCurrency)); + } + if (model.steamId) + { + requiredSize += (std::strlen(model.steamId) + 1); + } + if (model.steamName) + { + requiredSize += (std::strlen(model.steamName) + 1); + } + return requiredSize; +} + +HRESULT UserSteamInfo::Copy(const PFUserSteamInfo& input, PFUserSteamInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.steamActivationStatus); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamActivationStatus = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamCountry); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamCountry = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamCurrency); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamCurrency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamId); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamName); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserTitleInfo::FromJson(const JsonValue& input) +{ + String avatarUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AvatarUrl", avatarUrl)); + this->SetAvatarUrl(std::move(avatarUrl)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", this->m_model.created)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + std::optional firstLogin{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "FirstLogin", firstLogin)); + this->SetFirstLogin(std::move(firstLogin)); + + std::optional isBanned{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "isBanned", isBanned)); + this->SetisBanned(std::move(isBanned)); + + std::optional lastLogin{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastLogin", lastLogin)); + this->SetLastLogin(std::move(lastLogin)); + + std::optional origination{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Origination", origination)); + this->SetOrigination(std::move(origination)); + + std::optional titlePlayerAccount{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitlePlayerAccount", titlePlayerAccount)); + if (titlePlayerAccount) + { + this->SetTitlePlayerAccount(std::move(*titlePlayerAccount)); + } + + return S_OK; +} + +size_t UserTitleInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserTitleInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserTitleInfo::RequiredBufferSize(const PFUserTitleInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.avatarUrl) + { + requiredSize += (std::strlen(model.avatarUrl) + 1); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + if (model.firstLogin) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.isBanned) + { + requiredSize += (alignof(bool) + sizeof(bool)); + } + if (model.lastLogin) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.origination) + { + requiredSize += (alignof(PFUserOrigination) + sizeof(PFUserOrigination)); + } + if (model.titlePlayerAccount) + { + requiredSize += EntityKey::RequiredBufferSize(*model.titlePlayerAccount); + } + return requiredSize; +} + +HRESULT UserTitleInfo::Copy(const PFUserTitleInfo& input, PFUserTitleInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.avatarUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.avatarUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.firstLogin); + RETURN_IF_FAILED(propCopyResult.hr); + output.firstLogin = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.isBanned); + RETURN_IF_FAILED(propCopyResult.hr); + output.isBanned = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastLogin); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastLogin = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.origination); + RETURN_IF_FAILED(propCopyResult.hr); + output.origination = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titlePlayerAccount); + RETURN_IF_FAILED(propCopyResult.hr); + output.titlePlayerAccount = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserTwitchInfo::FromJson(const JsonValue& input) +{ + String twitchId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TwitchId", twitchId)); + this->SetTwitchId(std::move(twitchId)); + + String twitchUserName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TwitchUserName", twitchUserName)); + this->SetTwitchUserName(std::move(twitchUserName)); + + return S_OK; +} + +size_t UserTwitchInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserTwitchInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserTwitchInfo::RequiredBufferSize(const PFUserTwitchInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.twitchId) + { + requiredSize += (std::strlen(model.twitchId) + 1); + } + if (model.twitchUserName) + { + requiredSize += (std::strlen(model.twitchUserName) + 1); + } + return requiredSize; +} + +HRESULT UserTwitchInfo::Copy(const PFUserTwitchInfo& input, PFUserTwitchInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.twitchId); + RETURN_IF_FAILED(propCopyResult.hr); + output.twitchId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.twitchUserName); + RETURN_IF_FAILED(propCopyResult.hr); + output.twitchUserName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserXboxInfo::FromJson(const JsonValue& input) +{ + String xboxUserId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxUserId", xboxUserId)); + this->SetXboxUserId(std::move(xboxUserId)); + + String xboxUserSandbox{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxUserSandbox", xboxUserSandbox)); + this->SetXboxUserSandbox(std::move(xboxUserSandbox)); + + return S_OK; +} + +size_t UserXboxInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserXboxInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserXboxInfo::RequiredBufferSize(const PFUserXboxInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.xboxUserId) + { + requiredSize += (std::strlen(model.xboxUserId) + 1); + } + if (model.xboxUserSandbox) + { + requiredSize += (std::strlen(model.xboxUserSandbox) + 1); + } + return requiredSize; +} + +HRESULT UserXboxInfo::Copy(const PFUserXboxInfo& input, PFUserXboxInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.xboxUserId); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxUserId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.xboxUserSandbox); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxUserSandbox = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserAccountInfo::FromJson(const JsonValue& input) +{ + std::optional androidDeviceInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AndroidDeviceInfo", androidDeviceInfo)); + if (androidDeviceInfo) + { + this->SetAndroidDeviceInfo(std::move(*androidDeviceInfo)); + } + + std::optional appleAccountInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AppleAccountInfo", appleAccountInfo)); + if (appleAccountInfo) + { + this->SetAppleAccountInfo(std::move(*appleAccountInfo)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", this->m_model.created)); + + std::optional customIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CustomIdInfo", customIdInfo)); + if (customIdInfo) + { + this->SetCustomIdInfo(std::move(*customIdInfo)); + } + + std::optional facebookInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInfo", facebookInfo)); + if (facebookInfo) + { + this->SetFacebookInfo(std::move(*facebookInfo)); + } + + std::optional facebookInstantGamesIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInstantGamesIdInfo", facebookInstantGamesIdInfo)); + if (facebookInstantGamesIdInfo) + { + this->SetFacebookInstantGamesIdInfo(std::move(*facebookInstantGamesIdInfo)); + } + + std::optional gameCenterInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GameCenterInfo", gameCenterInfo)); + if (gameCenterInfo) + { + this->SetGameCenterInfo(std::move(*gameCenterInfo)); + } + + std::optional googleInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GoogleInfo", googleInfo)); + if (googleInfo) + { + this->SetGoogleInfo(std::move(*googleInfo)); + } + + std::optional googlePlayGamesInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GooglePlayGamesInfo", googlePlayGamesInfo)); + if (googlePlayGamesInfo) + { + this->SetGooglePlayGamesInfo(std::move(*googlePlayGamesInfo)); + } + + std::optional iosDeviceInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IosDeviceInfo", iosDeviceInfo)); + if (iosDeviceInfo) + { + this->SetIosDeviceInfo(std::move(*iosDeviceInfo)); + } + + std::optional kongregateInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "KongregateInfo", kongregateInfo)); + if (kongregateInfo) + { + this->SetKongregateInfo(std::move(*kongregateInfo)); + } + + std::optional nintendoSwitchAccountInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchAccountInfo", nintendoSwitchAccountInfo)); + if (nintendoSwitchAccountInfo) + { + this->SetNintendoSwitchAccountInfo(std::move(*nintendoSwitchAccountInfo)); + } + + std::optional nintendoSwitchDeviceIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NintendoSwitchDeviceIdInfo", nintendoSwitchDeviceIdInfo)); + if (nintendoSwitchDeviceIdInfo) + { + this->SetNintendoSwitchDeviceIdInfo(std::move(*nintendoSwitchDeviceIdInfo)); + } + + ModelVector openIdInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OpenIdInfo", openIdInfo)); + this->SetOpenIdInfo(std::move(openIdInfo)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + std::optional privateInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PrivateInfo", privateInfo)); + if (privateInfo) + { + this->SetPrivateInfo(std::move(*privateInfo)); + } + + std::optional psnInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PsnInfo", psnInfo)); + if (psnInfo) + { + this->SetPsnInfo(std::move(*psnInfo)); + } + + std::optional steamInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamInfo", steamInfo)); + if (steamInfo) + { + this->SetSteamInfo(std::move(*steamInfo)); + } + + std::optional titleInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleInfo", titleInfo)); + if (titleInfo) + { + this->SetTitleInfo(std::move(*titleInfo)); + } + + std::optional twitchInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TwitchInfo", twitchInfo)); + if (twitchInfo) + { + this->SetTwitchInfo(std::move(*twitchInfo)); + } + + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + std::optional xboxInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxInfo", xboxInfo)); + if (xboxInfo) + { + this->SetXboxInfo(std::move(*xboxInfo)); + } + + return S_OK; +} + +size_t UserAccountInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserAccountInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserAccountInfo::RequiredBufferSize(const PFUserAccountInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.androidDeviceInfo) + { + requiredSize += UserAndroidDeviceInfo::RequiredBufferSize(*model.androidDeviceInfo); + } + if (model.appleAccountInfo) + { + requiredSize += UserAppleIdInfo::RequiredBufferSize(*model.appleAccountInfo); + } + if (model.customIdInfo) + { + requiredSize += UserCustomIdInfo::RequiredBufferSize(*model.customIdInfo); + } + if (model.facebookInfo) + { + requiredSize += UserFacebookInfo::RequiredBufferSize(*model.facebookInfo); + } + if (model.facebookInstantGamesIdInfo) + { + requiredSize += UserFacebookInstantGamesIdInfo::RequiredBufferSize(*model.facebookInstantGamesIdInfo); + } + if (model.gameCenterInfo) + { + requiredSize += UserGameCenterInfo::RequiredBufferSize(*model.gameCenterInfo); + } + if (model.googleInfo) + { + requiredSize += UserGoogleInfo::RequiredBufferSize(*model.googleInfo); + } + if (model.googlePlayGamesInfo) + { + requiredSize += UserGooglePlayGamesInfo::RequiredBufferSize(*model.googlePlayGamesInfo); + } + if (model.iosDeviceInfo) + { + requiredSize += UserIosDeviceInfo::RequiredBufferSize(*model.iosDeviceInfo); + } + if (model.kongregateInfo) + { + requiredSize += UserKongregateInfo::RequiredBufferSize(*model.kongregateInfo); + } + if (model.nintendoSwitchAccountInfo) + { + requiredSize += UserNintendoSwitchAccountIdInfo::RequiredBufferSize(*model.nintendoSwitchAccountInfo); + } + if (model.nintendoSwitchDeviceIdInfo) + { + requiredSize += UserNintendoSwitchDeviceIdInfo::RequiredBufferSize(*model.nintendoSwitchDeviceIdInfo); + } + requiredSize += (alignof(PFUserOpenIdInfo*) + sizeof(PFUserOpenIdInfo*) * model.openIdInfoCount); + for (size_t i = 0; i < model.openIdInfoCount; ++i) + { + requiredSize += UserOpenIdInfo::RequiredBufferSize(*model.openIdInfo[i]); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + if (model.privateInfo) + { + requiredSize += UserPrivateAccountInfo::RequiredBufferSize(*model.privateInfo); + } + if (model.psnInfo) + { + requiredSize += UserPsnInfo::RequiredBufferSize(*model.psnInfo); + } + if (model.steamInfo) + { + requiredSize += UserSteamInfo::RequiredBufferSize(*model.steamInfo); + } + if (model.titleInfo) + { + requiredSize += UserTitleInfo::RequiredBufferSize(*model.titleInfo); + } + if (model.twitchInfo) + { + requiredSize += UserTwitchInfo::RequiredBufferSize(*model.twitchInfo); + } + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + if (model.xboxInfo) + { + requiredSize += UserXboxInfo::RequiredBufferSize(*model.xboxInfo); + } + return requiredSize; +} + +HRESULT UserAccountInfo::Copy(const PFUserAccountInfo& input, PFUserAccountInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.androidDeviceInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.androidDeviceInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.appleAccountInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.appleAccountInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.customIdInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.customIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.facebookInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.facebookInstantGamesIdInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInstantGamesIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.gameCenterInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.gameCenterInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googleInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.googleInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.googlePlayGamesInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.googlePlayGamesInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.iosDeviceInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.iosDeviceInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.kongregateInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.kongregateInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchAccountInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchAccountInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.nintendoSwitchDeviceIdInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.nintendoSwitchDeviceIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.openIdInfo, input.openIdInfoCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.openIdInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.privateInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.privateInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.psnInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.psnInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.twitchInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.twitchInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.xboxInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxInfo = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ItemInstance::FromJson(const JsonValue& input) +{ + String annotation{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Annotation", annotation)); + this->SetAnnotation(std::move(annotation)); + + CStringVector bundleContents{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BundleContents", bundleContents)); + this->SetBundleContents(std::move(bundleContents)); + + String bundleParent{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BundleParent", bundleParent)); + this->SetBundleParent(std::move(bundleParent)); + + String catalogVersion{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CatalogVersion", catalogVersion)); + this->SetCatalogVersion(std::move(catalogVersion)); + + StringDictionaryEntryVector customData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CustomData", customData)); + this->SetCustomData(std::move(customData)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + std::optional expiration{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expiration", expiration)); + this->SetExpiration(std::move(expiration)); + + String itemClass{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemClass", itemClass)); + this->SetItemClass(std::move(itemClass)); + + String itemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemId", itemId)); + this->SetItemId(std::move(itemId)); + + String itemInstanceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemInstanceId", itemInstanceId)); + this->SetItemInstanceId(std::move(itemInstanceId)); + + std::optional purchaseDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "PurchaseDate", purchaseDate)); + this->SetPurchaseDate(std::move(purchaseDate)); + + std::optional remainingUses{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RemainingUses", remainingUses)); + this->SetRemainingUses(std::move(remainingUses)); + + String unitCurrency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UnitCurrency", unitCurrency)); + this->SetUnitCurrency(std::move(unitCurrency)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UnitPrice", this->m_model.unitPrice)); + + std::optional usesIncrementedBy{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UsesIncrementedBy", usesIncrementedBy)); + this->SetUsesIncrementedBy(std::move(usesIncrementedBy)); + + return S_OK; +} + +size_t ItemInstance::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ItemInstance::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ItemInstance::RequiredBufferSize(const PFItemInstance& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.annotation) + { + requiredSize += (std::strlen(model.annotation) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.bundleContentsCount); + for (size_t i = 0; i < model.bundleContentsCount; ++i) + { + requiredSize += (std::strlen(model.bundleContents[i]) + 1); + } + if (model.bundleParent) + { + requiredSize += (std::strlen(model.bundleParent) + 1); + } + if (model.catalogVersion) + { + requiredSize += (std::strlen(model.catalogVersion) + 1); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.customDataCount); + for (size_t i = 0; i < model.customDataCount; ++i) + { + requiredSize += (std::strlen(model.customData[i].key) + 1); + requiredSize += (std::strlen(model.customData[i].value) + 1); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + if (model.expiration) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.itemClass) + { + requiredSize += (std::strlen(model.itemClass) + 1); + } + if (model.itemId) + { + requiredSize += (std::strlen(model.itemId) + 1); + } + if (model.itemInstanceId) + { + requiredSize += (std::strlen(model.itemInstanceId) + 1); + } + if (model.purchaseDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.remainingUses) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.unitCurrency) + { + requiredSize += (std::strlen(model.unitCurrency) + 1); + } + if (model.usesIncrementedBy) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + return requiredSize; +} + +HRESULT ItemInstance::Copy(const PFItemInstance& input, PFItemInstance& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.annotation); + RETURN_IF_FAILED(propCopyResult.hr); + output.annotation = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.bundleContents, input.bundleContentsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.bundleContents = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.bundleParent); + RETURN_IF_FAILED(propCopyResult.hr); + output.bundleParent = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.catalogVersion); + RETURN_IF_FAILED(propCopyResult.hr); + output.catalogVersion = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.customData, input.customDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.customData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.expiration); + RETURN_IF_FAILED(propCopyResult.hr); + output.expiration = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemClass); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemClass = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemInstanceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemInstanceId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.purchaseDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.purchaseDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.remainingUses); + RETURN_IF_FAILED(propCopyResult.hr); + output.remainingUses = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.unitCurrency); + RETURN_IF_FAILED(propCopyResult.hr); + output.unitCurrency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.usesIncrementedBy); + RETURN_IF_FAILED(propCopyResult.hr); + output.usesIncrementedBy = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT CharacterInventory::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + ModelVector inventory{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Inventory", inventory)); + this->SetInventory(std::move(inventory)); + + return S_OK; +} + +size_t CharacterInventory::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CharacterInventory::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CharacterInventory::RequiredBufferSize(const PFCharacterInventory& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + requiredSize += (alignof(PFItemInstance*) + sizeof(PFItemInstance*) * model.inventoryCount); + for (size_t i = 0; i < model.inventoryCount; ++i) + { + requiredSize += ItemInstance::RequiredBufferSize(*model.inventory[i]); + } + return requiredSize; +} + +HRESULT CharacterInventory::Copy(const PFCharacterInventory& input, PFCharacterInventory& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.inventory, input.inventoryCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.inventory = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT CharacterResult::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + String characterName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterName", characterName)); + this->SetCharacterName(std::move(characterName)); + + String characterType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterType", characterType)); + this->SetCharacterType(std::move(characterType)); + + return S_OK; +} + +size_t CharacterResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CharacterResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CharacterResult::RequiredBufferSize(const PFCharacterResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + if (model.characterName) + { + requiredSize += (std::strlen(model.characterName) + 1); + } + if (model.characterType) + { + requiredSize += (std::strlen(model.characterType) + 1); + } + return requiredSize; +} + +HRESULT CharacterResult::Copy(const PFCharacterResult& input, PFCharacterResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.characterName); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.characterType); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterType = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT AdCampaignAttributionModel::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "AttributedAt", this->m_model.attributedAt)); + + String campaignId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CampaignId", campaignId)); + this->SetCampaignId(std::move(campaignId)); + + String platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + return S_OK; +} + +size_t AdCampaignAttributionModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AdCampaignAttributionModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AdCampaignAttributionModel::RequiredBufferSize(const PFAdCampaignAttributionModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.campaignId) + { + requiredSize += (std::strlen(model.campaignId) + 1); + } + if (model.platform) + { + requiredSize += (std::strlen(model.platform) + 1); + } + return requiredSize; +} + +HRESULT AdCampaignAttributionModel::Copy(const PFAdCampaignAttributionModel& input, PFAdCampaignAttributionModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.campaignId); + RETURN_IF_FAILED(propCopyResult.hr); + output.campaignId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ContactEmailInfoModel::FromJson(const JsonValue& input) +{ + String emailAddress{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EmailAddress", emailAddress)); + this->SetEmailAddress(std::move(emailAddress)); + + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + std::optional verificationStatus{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VerificationStatus", verificationStatus)); + this->SetVerificationStatus(std::move(verificationStatus)); + + return S_OK; +} + +size_t ContactEmailInfoModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ContactEmailInfoModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ContactEmailInfoModel::RequiredBufferSize(const PFContactEmailInfoModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.emailAddress) + { + requiredSize += (std::strlen(model.emailAddress) + 1); + } + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + if (model.verificationStatus) + { + requiredSize += (alignof(PFEmailVerificationStatus) + sizeof(PFEmailVerificationStatus)); + } + return requiredSize; +} + +HRESULT ContactEmailInfoModel::Copy(const PFContactEmailInfoModel& input, PFContactEmailInfoModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.emailAddress); + RETURN_IF_FAILED(propCopyResult.hr); + output.emailAddress = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.verificationStatus); + RETURN_IF_FAILED(propCopyResult.hr); + output.verificationStatus = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT LinkedPlatformAccountModel::FromJson(const JsonValue& input) +{ + String email{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Email", email)); + this->SetEmail(std::move(email)); + + std::optional platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + String platformUserId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlatformUserId", platformUserId)); + this->SetPlatformUserId(std::move(platformUserId)); + + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + return S_OK; +} + +size_t LinkedPlatformAccountModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result LinkedPlatformAccountModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t LinkedPlatformAccountModel::RequiredBufferSize(const PFLinkedPlatformAccountModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.email) + { + requiredSize += (std::strlen(model.email) + 1); + } + if (model.platform) + { + requiredSize += (alignof(PFLoginIdentityProvider) + sizeof(PFLoginIdentityProvider)); + } + if (model.platformUserId) + { + requiredSize += (std::strlen(model.platformUserId) + 1); + } + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + return requiredSize; +} + +HRESULT LinkedPlatformAccountModel::Copy(const PFLinkedPlatformAccountModel& input, PFLinkedPlatformAccountModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.email); + RETURN_IF_FAILED(propCopyResult.hr); + output.email = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platformUserId); + RETURN_IF_FAILED(propCopyResult.hr); + output.platformUserId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT LocationModel::FromJson(const JsonValue& input) +{ + String city{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "City", city)); + this->SetCity(std::move(city)); + + std::optional continentCode{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinentCode", continentCode)); + this->SetContinentCode(std::move(continentCode)); + + std::optional countryCode{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CountryCode", countryCode)); + this->SetCountryCode(std::move(countryCode)); + + std::optional latitude{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Latitude", latitude)); + this->SetLatitude(std::move(latitude)); + + std::optional longitude{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Longitude", longitude)); + this->SetLongitude(std::move(longitude)); + + return S_OK; +} + +size_t LocationModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result LocationModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t LocationModel::RequiredBufferSize(const PFLocationModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.city) + { + requiredSize += (std::strlen(model.city) + 1); + } + if (model.continentCode) + { + requiredSize += (alignof(PFContinentCode) + sizeof(PFContinentCode)); + } + if (model.countryCode) + { + requiredSize += (alignof(PFCountryCode) + sizeof(PFCountryCode)); + } + if (model.latitude) + { + requiredSize += (alignof(double) + sizeof(double)); + } + if (model.longitude) + { + requiredSize += (alignof(double) + sizeof(double)); + } + return requiredSize; +} + +HRESULT LocationModel::Copy(const PFLocationModel& input, PFLocationModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.city); + RETURN_IF_FAILED(propCopyResult.hr); + output.city = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.continentCode); + RETURN_IF_FAILED(propCopyResult.hr); + output.continentCode = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.countryCode); + RETURN_IF_FAILED(propCopyResult.hr); + output.countryCode = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.latitude); + RETURN_IF_FAILED(propCopyResult.hr); + output.latitude = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.longitude); + RETURN_IF_FAILED(propCopyResult.hr); + output.longitude = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT SubscriptionModel::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expiration", this->m_model.expiration)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "InitialSubscriptionTime", this->m_model.initialSubscriptionTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsActive", this->m_model.isActive)); + + std::optional status{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Status", status)); + this->SetStatus(std::move(status)); + + String subscriptionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SubscriptionId", subscriptionId)); + this->SetSubscriptionId(std::move(subscriptionId)); + + String subscriptionItemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SubscriptionItemId", subscriptionItemId)); + this->SetSubscriptionItemId(std::move(subscriptionItemId)); + + String subscriptionProvider{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SubscriptionProvider", subscriptionProvider)); + this->SetSubscriptionProvider(std::move(subscriptionProvider)); + + return S_OK; +} + +size_t SubscriptionModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SubscriptionModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SubscriptionModel::RequiredBufferSize(const PFSubscriptionModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.status) + { + requiredSize += (alignof(PFSubscriptionProviderStatus) + sizeof(PFSubscriptionProviderStatus)); + } + if (model.subscriptionId) + { + requiredSize += (std::strlen(model.subscriptionId) + 1); + } + if (model.subscriptionItemId) + { + requiredSize += (std::strlen(model.subscriptionItemId) + 1); + } + if (model.subscriptionProvider) + { + requiredSize += (std::strlen(model.subscriptionProvider) + 1); + } + return requiredSize; +} + +HRESULT SubscriptionModel::Copy(const PFSubscriptionModel& input, PFSubscriptionModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.status); + RETURN_IF_FAILED(propCopyResult.hr); + output.status = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subscriptionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subscriptionItemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptionItemId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.subscriptionProvider); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptionProvider = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT MembershipModel::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsActive", this->m_model.isActive)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "MembershipExpiration", this->m_model.membershipExpiration)); + + String membershipId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MembershipId", membershipId)); + this->SetMembershipId(std::move(membershipId)); + + std::optional overrideExpiration{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "OverrideExpiration", overrideExpiration)); + this->SetOverrideExpiration(std::move(overrideExpiration)); + + ModelVector subscriptions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Subscriptions", subscriptions)); + this->SetSubscriptions(std::move(subscriptions)); + + return S_OK; +} + +size_t MembershipModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result MembershipModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t MembershipModel::RequiredBufferSize(const PFMembershipModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.membershipId) + { + requiredSize += (std::strlen(model.membershipId) + 1); + } + if (model.overrideExpiration) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFSubscriptionModel*) + sizeof(PFSubscriptionModel*) * model.subscriptionsCount); + for (size_t i = 0; i < model.subscriptionsCount; ++i) + { + requiredSize += SubscriptionModel::RequiredBufferSize(*model.subscriptions[i]); + } + return requiredSize; +} + +HRESULT MembershipModel::Copy(const PFMembershipModel& input, PFMembershipModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.membershipId); + RETURN_IF_FAILED(propCopyResult.hr); + output.membershipId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.overrideExpiration); + RETURN_IF_FAILED(propCopyResult.hr); + output.overrideExpiration = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.subscriptions, input.subscriptionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.subscriptions = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PushNotificationRegistrationModel::FromJson(const JsonValue& input) +{ + String notificationEndpointARN{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NotificationEndpointARN", notificationEndpointARN)); + this->SetNotificationEndpointARN(std::move(notificationEndpointARN)); + + std::optional platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + return S_OK; +} + +size_t PushNotificationRegistrationModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PushNotificationRegistrationModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PushNotificationRegistrationModel::RequiredBufferSize(const PFPushNotificationRegistrationModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.notificationEndpointARN) + { + requiredSize += (std::strlen(model.notificationEndpointARN) + 1); + } + if (model.platform) + { + requiredSize += (alignof(PFPushNotificationPlatform) + sizeof(PFPushNotificationPlatform)); + } + return requiredSize; +} + +HRESULT PushNotificationRegistrationModel::Copy(const PFPushNotificationRegistrationModel& input, PFPushNotificationRegistrationModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.notificationEndpointARN); + RETURN_IF_FAILED(propCopyResult.hr); + output.notificationEndpointARN = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT StatisticModel::FromJson(const JsonValue& input) +{ + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", this->m_model.value)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Version", this->m_model.version)); + + return S_OK; +} + +size_t StatisticModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result StatisticModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t StatisticModel::RequiredBufferSize(const PFStatisticModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + return requiredSize; +} + +HRESULT StatisticModel::Copy(const PFStatisticModel& input, PFStatisticModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT TagModel::FromJson(const JsonValue& input) +{ + String tagValue{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TagValue", tagValue)); + this->SetTagValue(std::move(tagValue)); + + return S_OK; +} + +size_t TagModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TagModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TagModel::RequiredBufferSize(const PFTagModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.tagValue) + { + requiredSize += (std::strlen(model.tagValue) + 1); + } + return requiredSize; +} + +HRESULT TagModel::Copy(const PFTagModel& input, PFTagModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.tagValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.tagValue = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ValueToDateModel::FromJson(const JsonValue& input) +{ + String currency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Currency", currency)); + this->SetCurrency(std::move(currency)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalValue", this->m_model.totalValue)); + + String totalValueAsDecimal{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalValueAsDecimal", totalValueAsDecimal)); + this->SetTotalValueAsDecimal(std::move(totalValueAsDecimal)); + + return S_OK; +} + +size_t ValueToDateModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ValueToDateModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ValueToDateModel::RequiredBufferSize(const PFValueToDateModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.currency) + { + requiredSize += (std::strlen(model.currency) + 1); + } + if (model.totalValueAsDecimal) + { + requiredSize += (std::strlen(model.totalValueAsDecimal) + 1); + } + return requiredSize; +} + +HRESULT ValueToDateModel::Copy(const PFValueToDateModel& input, PFValueToDateModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.currency); + RETURN_IF_FAILED(propCopyResult.hr); + output.currency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.totalValueAsDecimal); + RETURN_IF_FAILED(propCopyResult.hr); + output.totalValueAsDecimal = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PlayerProfileModel::FromJson(const JsonValue& input) +{ + ModelVector adCampaignAttributions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AdCampaignAttributions", adCampaignAttributions)); + this->SetAdCampaignAttributions(std::move(adCampaignAttributions)); + + String avatarUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AvatarUrl", avatarUrl)); + this->SetAvatarUrl(std::move(avatarUrl)); + + std::optional bannedUntil{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "BannedUntil", bannedUntil)); + this->SetBannedUntil(std::move(bannedUntil)); + + ModelVector contactEmailAddresses{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContactEmailAddresses", contactEmailAddresses)); + this->SetContactEmailAddresses(std::move(contactEmailAddresses)); + + std::optional created{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", created)); + this->SetCreated(std::move(created)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + CStringVector experimentVariants{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ExperimentVariants", experimentVariants)); + this->SetExperimentVariants(std::move(experimentVariants)); + + std::optional lastLogin{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastLogin", lastLogin)); + this->SetLastLogin(std::move(lastLogin)); + + ModelVector linkedAccounts{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "LinkedAccounts", linkedAccounts)); + this->SetLinkedAccounts(std::move(linkedAccounts)); + + ModelVector locations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Locations", locations)); + this->SetLocations(std::move(locations)); + + ModelVector memberships{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Memberships", memberships)); + this->SetMemberships(std::move(memberships)); + + std::optional origination{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Origination", origination)); + this->SetOrigination(std::move(origination)); + + String playerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerId", playerId)); + this->SetPlayerId(std::move(playerId)); + + String publisherId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PublisherId", publisherId)); + this->SetPublisherId(std::move(publisherId)); + + ModelVector pushNotificationRegistrations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PushNotificationRegistrations", pushNotificationRegistrations)); + this->SetPushNotificationRegistrations(std::move(pushNotificationRegistrations)); + + ModelVector statistics{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Statistics", statistics)); + this->SetStatistics(std::move(statistics)); + + ModelVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + String titleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleId", titleId)); + this->SetTitleId(std::move(titleId)); + + std::optional totalValueToDateInUSD{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalValueToDateInUSD", totalValueToDateInUSD)); + this->SetTotalValueToDateInUSD(std::move(totalValueToDateInUSD)); + + ModelVector valuesToDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ValuesToDate", valuesToDate)); + this->SetValuesToDate(std::move(valuesToDate)); + + return S_OK; +} + +size_t PlayerProfileModel::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PlayerProfileModel::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PlayerProfileModel::RequiredBufferSize(const PFPlayerProfileModel& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFAdCampaignAttributionModel*) + sizeof(PFAdCampaignAttributionModel*) * model.adCampaignAttributionsCount); + for (size_t i = 0; i < model.adCampaignAttributionsCount; ++i) + { + requiredSize += AdCampaignAttributionModel::RequiredBufferSize(*model.adCampaignAttributions[i]); + } + if (model.avatarUrl) + { + requiredSize += (std::strlen(model.avatarUrl) + 1); + } + if (model.bannedUntil) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFContactEmailInfoModel*) + sizeof(PFContactEmailInfoModel*) * model.contactEmailAddressesCount); + for (size_t i = 0; i < model.contactEmailAddressesCount; ++i) + { + requiredSize += ContactEmailInfoModel::RequiredBufferSize(*model.contactEmailAddresses[i]); + } + if (model.created) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.experimentVariantsCount); + for (size_t i = 0; i < model.experimentVariantsCount; ++i) + { + requiredSize += (std::strlen(model.experimentVariants[i]) + 1); + } + if (model.lastLogin) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFLinkedPlatformAccountModel*) + sizeof(PFLinkedPlatformAccountModel*) * model.linkedAccountsCount); + for (size_t i = 0; i < model.linkedAccountsCount; ++i) + { + requiredSize += LinkedPlatformAccountModel::RequiredBufferSize(*model.linkedAccounts[i]); + } + requiredSize += (alignof(PFLocationModel*) + sizeof(PFLocationModel*) * model.locationsCount); + for (size_t i = 0; i < model.locationsCount; ++i) + { + requiredSize += LocationModel::RequiredBufferSize(*model.locations[i]); + } + requiredSize += (alignof(PFMembershipModel*) + sizeof(PFMembershipModel*) * model.membershipsCount); + for (size_t i = 0; i < model.membershipsCount; ++i) + { + requiredSize += MembershipModel::RequiredBufferSize(*model.memberships[i]); + } + if (model.origination) + { + requiredSize += (alignof(PFLoginIdentityProvider) + sizeof(PFLoginIdentityProvider)); + } + if (model.playerId) + { + requiredSize += (std::strlen(model.playerId) + 1); + } + if (model.publisherId) + { + requiredSize += (std::strlen(model.publisherId) + 1); + } + requiredSize += (alignof(PFPushNotificationRegistrationModel*) + sizeof(PFPushNotificationRegistrationModel*) * model.pushNotificationRegistrationsCount); + for (size_t i = 0; i < model.pushNotificationRegistrationsCount; ++i) + { + requiredSize += PushNotificationRegistrationModel::RequiredBufferSize(*model.pushNotificationRegistrations[i]); + } + requiredSize += (alignof(PFStatisticModel*) + sizeof(PFStatisticModel*) * model.statisticsCount); + for (size_t i = 0; i < model.statisticsCount; ++i) + { + requiredSize += StatisticModel::RequiredBufferSize(*model.statistics[i]); + } + requiredSize += (alignof(PFTagModel*) + sizeof(PFTagModel*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += TagModel::RequiredBufferSize(*model.tags[i]); + } + if (model.titleId) + { + requiredSize += (std::strlen(model.titleId) + 1); + } + if (model.totalValueToDateInUSD) + { + requiredSize += (alignof(uint32_t) + sizeof(uint32_t)); + } + requiredSize += (alignof(PFValueToDateModel*) + sizeof(PFValueToDateModel*) * model.valuesToDateCount); + for (size_t i = 0; i < model.valuesToDateCount; ++i) + { + requiredSize += ValueToDateModel::RequiredBufferSize(*model.valuesToDate[i]); + } + return requiredSize; +} + +HRESULT PlayerProfileModel::Copy(const PFPlayerProfileModel& input, PFPlayerProfileModel& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.adCampaignAttributions, input.adCampaignAttributionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.adCampaignAttributions = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.avatarUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.avatarUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.bannedUntil); + RETURN_IF_FAILED(propCopyResult.hr); + output.bannedUntil = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.contactEmailAddresses, input.contactEmailAddressesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.contactEmailAddresses = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.created); + RETURN_IF_FAILED(propCopyResult.hr); + output.created = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.experimentVariants, input.experimentVariantsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.experimentVariants = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastLogin); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastLogin = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.linkedAccounts, input.linkedAccountsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.linkedAccounts = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.locations, input.locationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.locations = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.memberships, input.membershipsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.memberships = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.origination); + RETURN_IF_FAILED(propCopyResult.hr); + output.origination = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.publisherId); + RETURN_IF_FAILED(propCopyResult.hr); + output.publisherId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.pushNotificationRegistrations, input.pushNotificationRegistrationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.pushNotificationRegistrations = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.statistics, input.statisticsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.statistics = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.totalValueToDateInUSD); + RETURN_IF_FAILED(propCopyResult.hr); + output.totalValueToDateInUSD = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.valuesToDate, input.valuesToDateCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.valuesToDate = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT StatisticValue::FromJson(const JsonValue& input) +{ + String statisticName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StatisticName", statisticName)); + this->SetStatisticName(std::move(statisticName)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", this->m_model.value)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Version", this->m_model.version)); + + return S_OK; +} + +size_t StatisticValue::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result StatisticValue::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t StatisticValue::RequiredBufferSize(const PFStatisticValue& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.statisticName) + { + requiredSize += (std::strlen(model.statisticName) + 1); + } + return requiredSize; +} + +HRESULT StatisticValue::Copy(const PFStatisticValue& input, PFStatisticValue& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.statisticName); + RETURN_IF_FAILED(propCopyResult.hr); + output.statisticName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT UserDataRecord::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastUpdated", this->m_model.lastUpdated)); + + std::optional permission{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Permission", permission)); + this->SetPermission(std::move(permission)); + + String value{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", value)); + this->SetValue(std::move(value)); + + return S_OK; +} + +size_t UserDataRecord::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UserDataRecord::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UserDataRecord::RequiredBufferSize(const PFUserDataRecord& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.permission) + { + requiredSize += (alignof(PFUserDataPermission) + sizeof(PFUserDataPermission)); + } + if (model.value) + { + requiredSize += (std::strlen(model.value) + 1); + } + return requiredSize; +} + +HRESULT UserDataRecord::Copy(const PFUserDataRecord& input, PFUserDataRecord& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.permission); + RETURN_IF_FAILED(propCopyResult.hr); + output.permission = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.value); + RETURN_IF_FAILED(propCopyResult.hr); + output.value = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT VirtualCurrencyRechargeTime::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RechargeMax", this->m_model.rechargeMax)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "RechargeTime", this->m_model.rechargeTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SecondsToRecharge", this->m_model.secondsToRecharge)); + + return S_OK; +} + +size_t VirtualCurrencyRechargeTime::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result VirtualCurrencyRechargeTime::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t VirtualCurrencyRechargeTime::RequiredBufferSize(const PFVirtualCurrencyRechargeTime& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT VirtualCurrencyRechargeTime::Copy(const PFVirtualCurrencyRechargeTime& input, PFVirtualCurrencyRechargeTime& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +HRESULT GetPlayerCombinedInfoResultPayload::FromJson(const JsonValue& input) +{ + std::optional accountInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AccountInfo", accountInfo)); + if (accountInfo) + { + this->SetAccountInfo(std::move(*accountInfo)); + } + + ModelVector characterInventories{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterInventories", characterInventories)); + this->SetCharacterInventories(std::move(characterInventories)); + + ModelVector characterList{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterList", characterList)); + this->SetCharacterList(std::move(characterList)); + + std::optional playerProfile{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerProfile", playerProfile)); + if (playerProfile) + { + this->SetPlayerProfile(std::move(*playerProfile)); + } + + ModelVector playerStatistics{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerStatistics", playerStatistics)); + this->SetPlayerStatistics(std::move(playerStatistics)); + + StringDictionaryEntryVector titleData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleData", titleData)); + this->SetTitleData(std::move(titleData)); + + ModelDictionaryEntryVector userData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserData", userData)); + this->SetUserData(std::move(userData)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserDataVersion", this->m_model.userDataVersion)); + + ModelVector userInventory{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserInventory", userInventory)); + this->SetUserInventory(std::move(userInventory)); + + ModelDictionaryEntryVector userReadOnlyData{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserReadOnlyData", userReadOnlyData)); + this->SetUserReadOnlyData(std::move(userReadOnlyData)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserReadOnlyDataVersion", this->m_model.userReadOnlyDataVersion)); + + DictionaryEntryVector userVirtualCurrency{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserVirtualCurrency", userVirtualCurrency)); + this->SetUserVirtualCurrency(std::move(userVirtualCurrency)); + + ModelDictionaryEntryVector userVirtualCurrencyRechargeTimes{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UserVirtualCurrencyRechargeTimes", userVirtualCurrencyRechargeTimes)); + this->SetUserVirtualCurrencyRechargeTimes(std::move(userVirtualCurrencyRechargeTimes)); + + return S_OK; +} + +size_t GetPlayerCombinedInfoResultPayload::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayerCombinedInfoResultPayload::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayerCombinedInfoResultPayload::RequiredBufferSize(const PFGetPlayerCombinedInfoResultPayload& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.accountInfo) + { + requiredSize += UserAccountInfo::RequiredBufferSize(*model.accountInfo); + } + requiredSize += (alignof(PFCharacterInventory*) + sizeof(PFCharacterInventory*) * model.characterInventoriesCount); + for (size_t i = 0; i < model.characterInventoriesCount; ++i) + { + requiredSize += CharacterInventory::RequiredBufferSize(*model.characterInventories[i]); + } + requiredSize += (alignof(PFCharacterResult*) + sizeof(PFCharacterResult*) * model.characterListCount); + for (size_t i = 0; i < model.characterListCount; ++i) + { + requiredSize += CharacterResult::RequiredBufferSize(*model.characterList[i]); + } + if (model.playerProfile) + { + requiredSize += PlayerProfileModel::RequiredBufferSize(*model.playerProfile); + } + requiredSize += (alignof(PFStatisticValue*) + sizeof(PFStatisticValue*) * model.playerStatisticsCount); + for (size_t i = 0; i < model.playerStatisticsCount; ++i) + { + requiredSize += StatisticValue::RequiredBufferSize(*model.playerStatistics[i]); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.titleDataCount); + for (size_t i = 0; i < model.titleDataCount; ++i) + { + requiredSize += (std::strlen(model.titleData[i].key) + 1); + requiredSize += (std::strlen(model.titleData[i].value) + 1); + } + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.userDataCount); + for (size_t i = 0; i < model.userDataCount; ++i) + { + requiredSize += (std::strlen(model.userData[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.userData[i].value); + } + requiredSize += (alignof(PFItemInstance*) + sizeof(PFItemInstance*) * model.userInventoryCount); + for (size_t i = 0; i < model.userInventoryCount; ++i) + { + requiredSize += ItemInstance::RequiredBufferSize(*model.userInventory[i]); + } + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.userReadOnlyDataCount); + for (size_t i = 0; i < model.userReadOnlyDataCount; ++i) + { + requiredSize += (std::strlen(model.userReadOnlyData[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.userReadOnlyData[i].value); + } + requiredSize += (alignof(PFInt32DictionaryEntry) + sizeof(PFInt32DictionaryEntry) * model.userVirtualCurrencyCount); + for (size_t i = 0; i < model.userVirtualCurrencyCount; ++i) + { + requiredSize += (std::strlen(model.userVirtualCurrency[i].key) + 1); + } + requiredSize += (alignof(PFVirtualCurrencyRechargeTimeDictionaryEntry) + sizeof(PFVirtualCurrencyRechargeTimeDictionaryEntry) * model.userVirtualCurrencyRechargeTimesCount); + for (size_t i = 0; i < model.userVirtualCurrencyRechargeTimesCount; ++i) + { + requiredSize += (std::strlen(model.userVirtualCurrencyRechargeTimes[i].key) + 1); + requiredSize += VirtualCurrencyRechargeTime::RequiredBufferSize(*model.userVirtualCurrencyRechargeTimes[i].value); + } + return requiredSize; +} + +HRESULT GetPlayerCombinedInfoResultPayload::Copy(const PFGetPlayerCombinedInfoResultPayload& input, PFGetPlayerCombinedInfoResultPayload& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.accountInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.accountInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.characterInventories, input.characterInventoriesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterInventories = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.characterList, input.characterListCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterList = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playerProfile); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerProfile = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.playerStatistics, input.playerStatisticsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerStatistics = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.titleData, input.titleDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userData, input.userDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.userInventory, input.userInventoryCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userInventory = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userReadOnlyData, input.userReadOnlyDataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userReadOnlyData = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userVirtualCurrency, input.userVirtualCurrencyCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userVirtualCurrency = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.userVirtualCurrencyRechargeTimes, input.userVirtualCurrencyRechargeTimesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.userVirtualCurrencyRechargeTimes = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT Variable::FromJson(const JsonValue& input) +{ + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + String value{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", value)); + this->SetValue(std::move(value)); + + return S_OK; +} + +size_t Variable::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Variable::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Variable::RequiredBufferSize(const PFVariable& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + if (model.value) + { + requiredSize += (std::strlen(model.value) + 1); + } + return requiredSize; +} + +HRESULT Variable::Copy(const PFVariable& input, PFVariable& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.value); + RETURN_IF_FAILED(propCopyResult.hr); + output.value = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT TreatmentAssignment::FromJson(const JsonValue& input) +{ + ModelVector variables{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Variables", variables)); + this->SetVariables(std::move(variables)); + + CStringVector variants{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Variants", variants)); + this->SetVariants(std::move(variants)); + + return S_OK; +} + +size_t TreatmentAssignment::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TreatmentAssignment::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TreatmentAssignment::RequiredBufferSize(const PFTreatmentAssignment& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFVariable*) + sizeof(PFVariable*) * model.variablesCount); + for (size_t i = 0; i < model.variablesCount; ++i) + { + requiredSize += Variable::RequiredBufferSize(*model.variables[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.variantsCount); + for (size_t i = 0; i < model.variantsCount; ++i) + { + requiredSize += (std::strlen(model.variants[i]) + 1); + } + return requiredSize; +} + +HRESULT TreatmentAssignment::Copy(const PFTreatmentAssignment& input, PFTreatmentAssignment& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.variables, input.variablesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.variables = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.variants, input.variantsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.variants = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT EntityLineage::FromJson(const JsonValue& input) +{ + String characterId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CharacterId", characterId)); + this->SetCharacterId(std::move(characterId)); + + String groupId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GroupId", groupId)); + this->SetGroupId(std::move(groupId)); + + String masterPlayerAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MasterPlayerAccountId", masterPlayerAccountId)); + this->SetMasterPlayerAccountId(std::move(masterPlayerAccountId)); + + String namespaceId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NamespaceId", namespaceId)); + this->SetNamespaceId(std::move(namespaceId)); + + String titleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleId", titleId)); + this->SetTitleId(std::move(titleId)); + + String titlePlayerAccountId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitlePlayerAccountId", titlePlayerAccountId)); + this->SetTitlePlayerAccountId(std::move(titlePlayerAccountId)); + + return S_OK; +} + +size_t EntityLineage::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityLineage::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityLineage::RequiredBufferSize(const PFEntityLineage& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.characterId) + { + requiredSize += (std::strlen(model.characterId) + 1); + } + if (model.groupId) + { + requiredSize += (std::strlen(model.groupId) + 1); + } + if (model.masterPlayerAccountId) + { + requiredSize += (std::strlen(model.masterPlayerAccountId) + 1); + } + if (model.namespaceId) + { + requiredSize += (std::strlen(model.namespaceId) + 1); + } + if (model.titleId) + { + requiredSize += (std::strlen(model.titleId) + 1); + } + if (model.titlePlayerAccountId) + { + requiredSize += (std::strlen(model.titlePlayerAccountId) + 1); + } + return requiredSize; +} + +HRESULT EntityLineage::Copy(const PFEntityLineage& input, PFEntityLineage& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.characterId); + RETURN_IF_FAILED(propCopyResult.hr); + output.characterId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.groupId); + RETURN_IF_FAILED(propCopyResult.hr); + output.groupId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.masterPlayerAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.masterPlayerAccountId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.namespaceId); + RETURN_IF_FAILED(propCopyResult.hr); + output.namespaceId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titlePlayerAccountId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titlePlayerAccountId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/CoreTypes.h b/Source/PlayFabServices/Source/Generated/CoreTypes.h new file mode 100644 index 0000000..a23c5bd --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/CoreTypes.h @@ -0,0 +1,842 @@ +#pragma once + +#include +#include "BaseModel.h" + +namespace PlayFab +{ + +// Core Classes +class PlayerProfileViewConstraints : public Wrappers::PFPlayerProfileViewConstraintsWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerProfileViewConstraintsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlayerProfileViewConstraints& input); +}; + +class GetPlayerCombinedInfoRequestParams : public Wrappers::PFGetPlayerCombinedInfoRequestParamsWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGetPlayerCombinedInfoRequestParamsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGetPlayerCombinedInfoRequestParams& input); +}; + +class EntityKey : public Wrappers::PFEntityKeyWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEntityKeyWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFEntityKey& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEntityKey& model); + static HRESULT Copy(const PFEntityKey& input, PFEntityKey& output, ModelBuffer& buffer); +}; + +class UserAndroidDeviceInfo : public Wrappers::PFUserAndroidDeviceInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserAndroidDeviceInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserAndroidDeviceInfo& model); + static HRESULT Copy(const PFUserAndroidDeviceInfo& input, PFUserAndroidDeviceInfo& output, ModelBuffer& buffer); +}; + +class UserAppleIdInfo : public Wrappers::PFUserAppleIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserAppleIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserAppleIdInfo& model); + static HRESULT Copy(const PFUserAppleIdInfo& input, PFUserAppleIdInfo& output, ModelBuffer& buffer); +}; + +class UserCustomIdInfo : public Wrappers::PFUserCustomIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserCustomIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserCustomIdInfo& model); + static HRESULT Copy(const PFUserCustomIdInfo& input, PFUserCustomIdInfo& output, ModelBuffer& buffer); +}; + +class UserFacebookInfo : public Wrappers::PFUserFacebookInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserFacebookInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserFacebookInfo& model); + static HRESULT Copy(const PFUserFacebookInfo& input, PFUserFacebookInfo& output, ModelBuffer& buffer); +}; + +class UserFacebookInstantGamesIdInfo : public Wrappers::PFUserFacebookInstantGamesIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserFacebookInstantGamesIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserFacebookInstantGamesIdInfo& model); + static HRESULT Copy(const PFUserFacebookInstantGamesIdInfo& input, PFUserFacebookInstantGamesIdInfo& output, ModelBuffer& buffer); +}; + +class UserGameCenterInfo : public Wrappers::PFUserGameCenterInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserGameCenterInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserGameCenterInfo& model); + static HRESULT Copy(const PFUserGameCenterInfo& input, PFUserGameCenterInfo& output, ModelBuffer& buffer); +}; + +class UserGoogleInfo : public Wrappers::PFUserGoogleInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserGoogleInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserGoogleInfo& model); + static HRESULT Copy(const PFUserGoogleInfo& input, PFUserGoogleInfo& output, ModelBuffer& buffer); +}; + +class UserGooglePlayGamesInfo : public Wrappers::PFUserGooglePlayGamesInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserGooglePlayGamesInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserGooglePlayGamesInfo& model); + static HRESULT Copy(const PFUserGooglePlayGamesInfo& input, PFUserGooglePlayGamesInfo& output, ModelBuffer& buffer); +}; + +class UserIosDeviceInfo : public Wrappers::PFUserIosDeviceInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserIosDeviceInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserIosDeviceInfo& model); + static HRESULT Copy(const PFUserIosDeviceInfo& input, PFUserIosDeviceInfo& output, ModelBuffer& buffer); +}; + +class UserKongregateInfo : public Wrappers::PFUserKongregateInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserKongregateInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserKongregateInfo& model); + static HRESULT Copy(const PFUserKongregateInfo& input, PFUserKongregateInfo& output, ModelBuffer& buffer); +}; + +class UserNintendoSwitchAccountIdInfo : public Wrappers::PFUserNintendoSwitchAccountIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserNintendoSwitchAccountIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserNintendoSwitchAccountIdInfo& model); + static HRESULT Copy(const PFUserNintendoSwitchAccountIdInfo& input, PFUserNintendoSwitchAccountIdInfo& output, ModelBuffer& buffer); +}; + +class UserNintendoSwitchDeviceIdInfo : public Wrappers::PFUserNintendoSwitchDeviceIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserNintendoSwitchDeviceIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserNintendoSwitchDeviceIdInfo& model); + static HRESULT Copy(const PFUserNintendoSwitchDeviceIdInfo& input, PFUserNintendoSwitchDeviceIdInfo& output, ModelBuffer& buffer); +}; + +class UserOpenIdInfo : public Wrappers::PFUserOpenIdInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserOpenIdInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserOpenIdInfo& model); + static HRESULT Copy(const PFUserOpenIdInfo& input, PFUserOpenIdInfo& output, ModelBuffer& buffer); +}; + +class UserPrivateAccountInfo : public Wrappers::PFUserPrivateAccountInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserPrivateAccountInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserPrivateAccountInfo& model); + static HRESULT Copy(const PFUserPrivateAccountInfo& input, PFUserPrivateAccountInfo& output, ModelBuffer& buffer); +}; + +class UserPsnInfo : public Wrappers::PFUserPsnInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserPsnInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserPsnInfo& model); + static HRESULT Copy(const PFUserPsnInfo& input, PFUserPsnInfo& output, ModelBuffer& buffer); +}; + +class UserSteamInfo : public Wrappers::PFUserSteamInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserSteamInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserSteamInfo& model); + static HRESULT Copy(const PFUserSteamInfo& input, PFUserSteamInfo& output, ModelBuffer& buffer); +}; + +class UserTitleInfo : public Wrappers::PFUserTitleInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserTitleInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserTitleInfo& model); + static HRESULT Copy(const PFUserTitleInfo& input, PFUserTitleInfo& output, ModelBuffer& buffer); +}; + +class UserTwitchInfo : public Wrappers::PFUserTwitchInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserTwitchInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserTwitchInfo& model); + static HRESULT Copy(const PFUserTwitchInfo& input, PFUserTwitchInfo& output, ModelBuffer& buffer); +}; + +class UserXboxInfo : public Wrappers::PFUserXboxInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserXboxInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserXboxInfo& model); + static HRESULT Copy(const PFUserXboxInfo& input, PFUserXboxInfo& output, ModelBuffer& buffer); +}; + +class UserAccountInfo : public Wrappers::PFUserAccountInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserAccountInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserAccountInfo& model); + static HRESULT Copy(const PFUserAccountInfo& input, PFUserAccountInfo& output, ModelBuffer& buffer); +}; + +class ItemInstance : public Wrappers::PFItemInstanceWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFItemInstanceWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFItemInstance& model); + static HRESULT Copy(const PFItemInstance& input, PFItemInstance& output, ModelBuffer& buffer); +}; + +class CharacterInventory : public Wrappers::PFCharacterInventoryWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterInventoryWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterInventory& model); + static HRESULT Copy(const PFCharacterInventory& input, PFCharacterInventory& output, ModelBuffer& buffer); +}; + +class CharacterResult : public Wrappers::PFCharacterResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFCharacterResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFCharacterResult& model); + static HRESULT Copy(const PFCharacterResult& input, PFCharacterResult& output, ModelBuffer& buffer); +}; + +class AdCampaignAttributionModel : public Wrappers::PFAdCampaignAttributionModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFAdCampaignAttributionModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFAdCampaignAttributionModel& model); + static HRESULT Copy(const PFAdCampaignAttributionModel& input, PFAdCampaignAttributionModel& output, ModelBuffer& buffer); +}; + +class ContactEmailInfoModel : public Wrappers::PFContactEmailInfoModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFContactEmailInfoModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFContactEmailInfoModel& model); + static HRESULT Copy(const PFContactEmailInfoModel& input, PFContactEmailInfoModel& output, ModelBuffer& buffer); +}; + +class LinkedPlatformAccountModel : public Wrappers::PFLinkedPlatformAccountModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFLinkedPlatformAccountModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFLinkedPlatformAccountModel& model); + static HRESULT Copy(const PFLinkedPlatformAccountModel& input, PFLinkedPlatformAccountModel& output, ModelBuffer& buffer); +}; + +class LocationModel : public Wrappers::PFLocationModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFLocationModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFLocationModel& model); + static HRESULT Copy(const PFLocationModel& input, PFLocationModel& output, ModelBuffer& buffer); +}; + +class SubscriptionModel : public Wrappers::PFSubscriptionModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSubscriptionModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSubscriptionModel& model); + static HRESULT Copy(const PFSubscriptionModel& input, PFSubscriptionModel& output, ModelBuffer& buffer); +}; + +class MembershipModel : public Wrappers::PFMembershipModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMembershipModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMembershipModel& model); + static HRESULT Copy(const PFMembershipModel& input, PFMembershipModel& output, ModelBuffer& buffer); +}; + +class PushNotificationRegistrationModel : public Wrappers::PFPushNotificationRegistrationModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPushNotificationRegistrationModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPushNotificationRegistrationModel& model); + static HRESULT Copy(const PFPushNotificationRegistrationModel& input, PFPushNotificationRegistrationModel& output, ModelBuffer& buffer); +}; + +class StatisticModel : public Wrappers::PFStatisticModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFStatisticModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFStatisticModel& model); + static HRESULT Copy(const PFStatisticModel& input, PFStatisticModel& output, ModelBuffer& buffer); +}; + +class TagModel : public Wrappers::PFTagModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTagModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTagModel& model); + static HRESULT Copy(const PFTagModel& input, PFTagModel& output, ModelBuffer& buffer); +}; + +class ValueToDateModel : public Wrappers::PFValueToDateModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFValueToDateModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFValueToDateModel& model); + static HRESULT Copy(const PFValueToDateModel& input, PFValueToDateModel& output, ModelBuffer& buffer); +}; + +class PlayerProfileModel : public Wrappers::PFPlayerProfileModelWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerProfileModelWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPlayerProfileModel& model); + static HRESULT Copy(const PFPlayerProfileModel& input, PFPlayerProfileModel& output, ModelBuffer& buffer); +}; + +class StatisticValue : public Wrappers::PFStatisticValueWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFStatisticValueWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFStatisticValue& model); + static HRESULT Copy(const PFStatisticValue& input, PFStatisticValue& output, ModelBuffer& buffer); +}; + +class UserDataRecord : public Wrappers::PFUserDataRecordWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFUserDataRecordWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFUserDataRecord& model); + static HRESULT Copy(const PFUserDataRecord& input, PFUserDataRecord& output, ModelBuffer& buffer); +}; + +class VirtualCurrencyRechargeTime : public Wrappers::PFVirtualCurrencyRechargeTimeWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFVirtualCurrencyRechargeTimeWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFVirtualCurrencyRechargeTime& model); + static HRESULT Copy(const PFVirtualCurrencyRechargeTime& input, PFVirtualCurrencyRechargeTime& output, ModelBuffer& buffer); +}; + +class GetPlayerCombinedInfoResultPayload : public Wrappers::PFGetPlayerCombinedInfoResultPayloadWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGetPlayerCombinedInfoResultPayloadWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGetPlayerCombinedInfoResultPayload& model); + static HRESULT Copy(const PFGetPlayerCombinedInfoResultPayload& input, PFGetPlayerCombinedInfoResultPayload& output, ModelBuffer& buffer); +}; + +class Variable : public Wrappers::PFVariableWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFVariableWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFVariable& model); + static HRESULT Copy(const PFVariable& input, PFVariable& output, ModelBuffer& buffer); +}; + +class TreatmentAssignment : public Wrappers::PFTreatmentAssignmentWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTreatmentAssignmentWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTreatmentAssignment& model); + static HRESULT Copy(const PFTreatmentAssignment& input, PFTreatmentAssignment& output, ModelBuffer& buffer); +}; + +class EntityLineage : public Wrappers::PFEntityLineageWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFEntityLineageWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFEntityLineage& model); + static HRESULT Copy(const PFEntityLineage& input, PFEntityLineage& output, ModelBuffer& buffer); +}; + +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Data.cpp b/Source/PlayFabServices/Source/Generated/Data.cpp new file mode 100644 index 0000000..53495e7 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Data.cpp @@ -0,0 +1,257 @@ +#include "stdafx.h" +#include "Data.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Data +{ + + +AsyncOp DataAPI::AbortFileUploads( + Entity const& entity, + const AbortFileUploadsRequest& request, + RunContext rc +) +{ + const char* path{ "/File/AbortFileUploads" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::DataAbortFileUploads, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + AbortFileUploadsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp DataAPI::DeleteFiles( + Entity const& entity, + const DeleteFilesRequest& request, + RunContext rc +) +{ + const char* path{ "/File/DeleteFiles" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::DataDeleteFiles, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + DeleteFilesResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp DataAPI::FinalizeFileUploads( + Entity const& entity, + const FinalizeFileUploadsRequest& request, + RunContext rc +) +{ + const char* path{ "/File/FinalizeFileUploads" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::DataFinalizeFileUploads, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + FinalizeFileUploadsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp DataAPI::GetFiles( + Entity const& entity, + const GetFilesRequest& request, + RunContext rc +) +{ + const char* path{ "/File/GetFiles" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::DataGetFiles, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetFilesResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp DataAPI::GetObjects( + Entity const& entity, + const GetObjectsRequest& request, + RunContext rc +) +{ + const char* path{ "/Object/GetObjects" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::DataGetObjects, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetObjectsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp DataAPI::InitiateFileUploads( + Entity const& entity, + const InitiateFileUploadsRequest& request, + RunContext rc +) +{ + const char* path{ "/File/InitiateFileUploads" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::DataInitiateFileUploads, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + InitiateFileUploadsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp DataAPI::SetObjects( + Entity const& entity, + const SetObjectsRequest& request, + RunContext rc +) +{ + const char* path{ "/Object/SetObjects" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::DataSetObjects, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + SetObjectsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Data +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Data.h b/Source/PlayFabServices/Source/Generated/Data.h new file mode 100644 index 0000000..64b4684 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Data.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include "DataTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Data +{ + +class DataAPI +{ +public: + DataAPI() = delete; + DataAPI(const DataAPI& source) = delete; + DataAPI& operator=(const DataAPI& source) = delete; + ~DataAPI() = default; + + // ------------ Generated API calls + static AsyncOp AbortFileUploads(Entity const& entity, const AbortFileUploadsRequest& request, RunContext rc); + static AsyncOp DeleteFiles(Entity const& entity, const DeleteFilesRequest& request, RunContext rc); + static AsyncOp FinalizeFileUploads(Entity const& entity, const FinalizeFileUploadsRequest& request, RunContext rc); + static AsyncOp GetFiles(Entity const& entity, const GetFilesRequest& request, RunContext rc); + static AsyncOp GetObjects(Entity const& entity, const GetObjectsRequest& request, RunContext rc); + static AsyncOp InitiateFileUploads(Entity const& entity, const InitiateFileUploadsRequest& request, RunContext rc); + static AsyncOp SetObjects(Entity const& entity, const SetObjectsRequest& request, RunContext rc); +}; + +} // namespace Data +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/DataTypes.cpp b/Source/PlayFabServices/Source/Generated/DataTypes.cpp new file mode 100644 index 0000000..6c95e6a --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/DataTypes.cpp @@ -0,0 +1,756 @@ +#include "stdafx.h" +#include "DataTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Data +{ + +JsonValue AbortFileUploadsRequest::ToJson() const +{ + return AbortFileUploadsRequest::ToJson(this->Model()); +} + +JsonValue AbortFileUploadsRequest::ToJson(const PFDataAbortFileUploadsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "FileNames", input.fileNames, input.fileNamesCount); + JsonUtils::ObjectAddMember(output, "ProfileVersion", input.profileVersion); + return output; +} + +HRESULT AbortFileUploadsResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + return S_OK; +} + +size_t AbortFileUploadsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AbortFileUploadsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AbortFileUploadsResponse::RequiredBufferSize(const PFDataAbortFileUploadsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + return requiredSize; +} + +HRESULT AbortFileUploadsResponse::Copy(const PFDataAbortFileUploadsResponse& input, PFDataAbortFileUploadsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeleteFilesRequest::ToJson() const +{ + return DeleteFilesRequest::ToJson(this->Model()); +} + +JsonValue DeleteFilesRequest::ToJson(const PFDataDeleteFilesRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "FileNames", input.fileNames, input.fileNamesCount); + JsonUtils::ObjectAddMember(output, "ProfileVersion", input.profileVersion); + return output; +} + +HRESULT DeleteFilesResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + return S_OK; +} + +size_t DeleteFilesResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DeleteFilesResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DeleteFilesResponse::RequiredBufferSize(const PFDataDeleteFilesResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + return requiredSize; +} + +HRESULT DeleteFilesResponse::Copy(const PFDataDeleteFilesResponse& input, PFDataDeleteFilesResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue FinalizeFileUploadsRequest::ToJson() const +{ + return FinalizeFileUploadsRequest::ToJson(this->Model()); +} + +JsonValue FinalizeFileUploadsRequest::ToJson(const PFDataFinalizeFileUploadsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "FileNames", input.fileNames, input.fileNamesCount); + JsonUtils::ObjectAddMember(output, "ProfileVersion", input.profileVersion); + return output; +} + +HRESULT GetFileMetadata::FromJson(const JsonValue& input) +{ + String checksum{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Checksum", checksum)); + this->SetChecksum(std::move(checksum)); + + String downloadUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DownloadUrl", downloadUrl)); + this->SetDownloadUrl(std::move(downloadUrl)); + + String fileName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FileName", fileName)); + this->SetFileName(std::move(fileName)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastModified", this->m_model.lastModified)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Size", this->m_model.size)); + + return S_OK; +} + +size_t GetFileMetadata::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetFileMetadata::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetFileMetadata::RequiredBufferSize(const PFDataGetFileMetadata& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.checksum) + { + requiredSize += (std::strlen(model.checksum) + 1); + } + if (model.downloadUrl) + { + requiredSize += (std::strlen(model.downloadUrl) + 1); + } + if (model.fileName) + { + requiredSize += (std::strlen(model.fileName) + 1); + } + return requiredSize; +} + +HRESULT GetFileMetadata::Copy(const PFDataGetFileMetadata& input, PFDataGetFileMetadata& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.checksum); + RETURN_IF_FAILED(propCopyResult.hr); + output.checksum = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.downloadUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.downloadUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.fileName); + RETURN_IF_FAILED(propCopyResult.hr); + output.fileName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT FinalizeFileUploadsResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + ModelDictionaryEntryVector metadata{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Metadata", metadata)); + this->SetMetadata(std::move(metadata)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + return S_OK; +} + +size_t FinalizeFileUploadsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result FinalizeFileUploadsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t FinalizeFileUploadsResponse::RequiredBufferSize(const PFDataFinalizeFileUploadsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + requiredSize += (alignof(PFDataGetFileMetadataDictionaryEntry) + sizeof(PFDataGetFileMetadataDictionaryEntry) * model.metadataCount); + for (size_t i = 0; i < model.metadataCount; ++i) + { + requiredSize += (std::strlen(model.metadata[i].key) + 1); + requiredSize += GetFileMetadata::RequiredBufferSize(*model.metadata[i].value); + } + return requiredSize; +} + +HRESULT FinalizeFileUploadsResponse::Copy(const PFDataFinalizeFileUploadsResponse& input, PFDataFinalizeFileUploadsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.metadata, input.metadataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.metadata = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetFilesRequest::ToJson() const +{ + return GetFilesRequest::ToJson(this->Model()); +} + +JsonValue GetFilesRequest::ToJson(const PFDataGetFilesRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT GetFilesResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + ModelDictionaryEntryVector metadata{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Metadata", metadata)); + this->SetMetadata(std::move(metadata)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + return S_OK; +} + +size_t GetFilesResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetFilesResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetFilesResponse::RequiredBufferSize(const PFDataGetFilesResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + requiredSize += (alignof(PFDataGetFileMetadataDictionaryEntry) + sizeof(PFDataGetFileMetadataDictionaryEntry) * model.metadataCount); + for (size_t i = 0; i < model.metadataCount; ++i) + { + requiredSize += (std::strlen(model.metadata[i].key) + 1); + requiredSize += GetFileMetadata::RequiredBufferSize(*model.metadata[i].value); + } + return requiredSize; +} + +HRESULT GetFilesResponse::Copy(const PFDataGetFilesResponse& input, PFDataGetFilesResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.metadata, input.metadataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.metadata = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetObjectsRequest::ToJson() const +{ + return GetObjectsRequest::ToJson(this->Model()); +} + +JsonValue GetObjectsRequest::ToJson(const PFDataGetObjectsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "EscapeObject", input.escapeObject); + return output; +} + +HRESULT ObjectResult::FromJson(const JsonValue& input) +{ + JsonObject dataObject{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataObject", dataObject)); + this->SetDataObject(std::move(dataObject)); + + String escapedDataObject{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EscapedDataObject", escapedDataObject)); + this->SetEscapedDataObject(std::move(escapedDataObject)); + + String objectName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ObjectName", objectName)); + this->SetObjectName(std::move(objectName)); + + return S_OK; +} + +size_t ObjectResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ObjectResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ObjectResult::RequiredBufferSize(const PFDataObjectResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.dataObject.stringValue) + { + requiredSize += (std::strlen(model.dataObject.stringValue) + 1); + } + if (model.escapedDataObject) + { + requiredSize += (std::strlen(model.escapedDataObject) + 1); + } + if (model.objectName) + { + requiredSize += (std::strlen(model.objectName) + 1); + } + return requiredSize; +} + +HRESULT ObjectResult::Copy(const PFDataObjectResult& input, PFDataObjectResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.dataObject.stringValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.dataObject.stringValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.escapedDataObject); + RETURN_IF_FAILED(propCopyResult.hr); + output.escapedDataObject = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.objectName); + RETURN_IF_FAILED(propCopyResult.hr); + output.objectName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetObjectsResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + ModelDictionaryEntryVector objects{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Objects", objects)); + this->SetObjects(std::move(objects)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + return S_OK; +} + +size_t GetObjectsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetObjectsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetObjectsResponse::RequiredBufferSize(const PFDataGetObjectsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + requiredSize += (alignof(PFDataObjectResultDictionaryEntry) + sizeof(PFDataObjectResultDictionaryEntry) * model.objectsCount); + for (size_t i = 0; i < model.objectsCount; ++i) + { + requiredSize += (std::strlen(model.objects[i].key) + 1); + requiredSize += ObjectResult::RequiredBufferSize(*model.objects[i].value); + } + return requiredSize; +} + +HRESULT GetObjectsResponse::Copy(const PFDataGetObjectsResponse& input, PFDataGetObjectsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.objects, input.objectsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.objects = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue InitiateFileUploadsRequest::ToJson() const +{ + return InitiateFileUploadsRequest::ToJson(this->Model()); +} + +JsonValue InitiateFileUploadsRequest::ToJson(const PFDataInitiateFileUploadsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "FileNames", input.fileNames, input.fileNamesCount); + JsonUtils::ObjectAddMember(output, "ProfileVersion", input.profileVersion); + return output; +} + +HRESULT InitiateFileUploadMetadata::FromJson(const JsonValue& input) +{ + String fileName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FileName", fileName)); + this->SetFileName(std::move(fileName)); + + String uploadUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UploadUrl", uploadUrl)); + this->SetUploadUrl(std::move(uploadUrl)); + + return S_OK; +} + +size_t InitiateFileUploadMetadata::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result InitiateFileUploadMetadata::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t InitiateFileUploadMetadata::RequiredBufferSize(const PFDataInitiateFileUploadMetadata& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.fileName) + { + requiredSize += (std::strlen(model.fileName) + 1); + } + if (model.uploadUrl) + { + requiredSize += (std::strlen(model.uploadUrl) + 1); + } + return requiredSize; +} + +HRESULT InitiateFileUploadMetadata::Copy(const PFDataInitiateFileUploadMetadata& input, PFDataInitiateFileUploadMetadata& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.fileName); + RETURN_IF_FAILED(propCopyResult.hr); + output.fileName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.uploadUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.uploadUrl = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT InitiateFileUploadsResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + ModelVector uploadDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "UploadDetails", uploadDetails)); + this->SetUploadDetails(std::move(uploadDetails)); + + return S_OK; +} + +size_t InitiateFileUploadsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result InitiateFileUploadsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t InitiateFileUploadsResponse::RequiredBufferSize(const PFDataInitiateFileUploadsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + requiredSize += (alignof(PFDataInitiateFileUploadMetadata*) + sizeof(PFDataInitiateFileUploadMetadata*) * model.uploadDetailsCount); + for (size_t i = 0; i < model.uploadDetailsCount; ++i) + { + requiredSize += InitiateFileUploadMetadata::RequiredBufferSize(*model.uploadDetails[i]); + } + return requiredSize; +} + +HRESULT InitiateFileUploadsResponse::Copy(const PFDataInitiateFileUploadsResponse& input, PFDataInitiateFileUploadsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.uploadDetails, input.uploadDetailsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.uploadDetails = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SetObject::ToJson() const +{ + return SetObject::ToJson(this->Model()); +} + +JsonValue SetObject::ToJson(const PFDataSetObject& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "DataObject", input.dataObject); + JsonUtils::ObjectAddMember(output, "DeleteObject", input.deleteObject); + JsonUtils::ObjectAddMember(output, "EscapedDataObject", input.escapedDataObject); + JsonUtils::ObjectAddMember(output, "ObjectName", input.objectName); + return output; +} + +JsonValue SetObjectsRequest::ToJson() const +{ + return SetObjectsRequest::ToJson(this->Model()); +} + +JsonValue SetObjectsRequest::ToJson(const PFDataSetObjectsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ExpectedProfileVersion", input.expectedProfileVersion); + JsonUtils::ObjectAddMemberArray(output, "Objects", input.objects, input.objectsCount); + return output; +} + +HRESULT SetObjectInfo::FromJson(const JsonValue& input) +{ + String objectName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ObjectName", objectName)); + this->SetObjectName(std::move(objectName)); + + String operationReason{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OperationReason", operationReason)); + this->SetOperationReason(std::move(operationReason)); + + std::optional setResult{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SetResult", setResult)); + this->SetSetResult(std::move(setResult)); + + return S_OK; +} + +size_t SetObjectInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SetObjectInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SetObjectInfo::RequiredBufferSize(const PFDataSetObjectInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.objectName) + { + requiredSize += (std::strlen(model.objectName) + 1); + } + if (model.operationReason) + { + requiredSize += (std::strlen(model.operationReason) + 1); + } + if (model.setResult) + { + requiredSize += (alignof(PFOperationTypes) + sizeof(PFOperationTypes)); + } + return requiredSize; +} + +HRESULT SetObjectInfo::Copy(const PFDataSetObjectInfo& input, PFDataSetObjectInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.objectName); + RETURN_IF_FAILED(propCopyResult.hr); + output.objectName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.operationReason); + RETURN_IF_FAILED(propCopyResult.hr); + output.operationReason = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.setResult); + RETURN_IF_FAILED(propCopyResult.hr); + output.setResult = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT SetObjectsResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + ModelVector setResults{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SetResults", setResults)); + this->SetSetResults(std::move(setResults)); + + return S_OK; +} + +size_t SetObjectsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SetObjectsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SetObjectsResponse::RequiredBufferSize(const PFDataSetObjectsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFDataSetObjectInfo*) + sizeof(PFDataSetObjectInfo*) * model.setResultsCount); + for (size_t i = 0; i < model.setResultsCount; ++i) + { + requiredSize += SetObjectInfo::RequiredBufferSize(*model.setResults[i]); + } + return requiredSize; +} + +HRESULT SetObjectsResponse::Copy(const PFDataSetObjectsResponse& input, PFDataSetObjectsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.setResults, input.setResultsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.setResults = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Data +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/DataTypes.h b/Source/PlayFabServices/Source/Generated/DataTypes.h new file mode 100644 index 0000000..7928101 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/DataTypes.h @@ -0,0 +1,338 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Data +{ + +// Data Classes +class AbortFileUploadsRequest : public Wrappers::PFDataAbortFileUploadsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataAbortFileUploadsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataAbortFileUploadsRequest& input); +}; + +class AbortFileUploadsResponse : public Wrappers::PFDataAbortFileUploadsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataAbortFileUploadsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataAbortFileUploadsResponse& model); + static HRESULT Copy(const PFDataAbortFileUploadsResponse& input, PFDataAbortFileUploadsResponse& output, ModelBuffer& buffer); +}; + +class DeleteFilesRequest : public Wrappers::PFDataDeleteFilesRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataDeleteFilesRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataDeleteFilesRequest& input); +}; + +class DeleteFilesResponse : public Wrappers::PFDataDeleteFilesResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataDeleteFilesResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataDeleteFilesResponse& model); + static HRESULT Copy(const PFDataDeleteFilesResponse& input, PFDataDeleteFilesResponse& output, ModelBuffer& buffer); +}; + +class FinalizeFileUploadsRequest : public Wrappers::PFDataFinalizeFileUploadsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataFinalizeFileUploadsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataFinalizeFileUploadsRequest& input); +}; + +class GetFileMetadata : public Wrappers::PFDataGetFileMetadataWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataGetFileMetadataWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataGetFileMetadata& model); + static HRESULT Copy(const PFDataGetFileMetadata& input, PFDataGetFileMetadata& output, ModelBuffer& buffer); +}; + +class FinalizeFileUploadsResponse : public Wrappers::PFDataFinalizeFileUploadsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataFinalizeFileUploadsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataFinalizeFileUploadsResponse& model); + static HRESULT Copy(const PFDataFinalizeFileUploadsResponse& input, PFDataFinalizeFileUploadsResponse& output, ModelBuffer& buffer); +}; + +class GetFilesRequest : public Wrappers::PFDataGetFilesRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataGetFilesRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataGetFilesRequest& input); +}; + +class GetFilesResponse : public Wrappers::PFDataGetFilesResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataGetFilesResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataGetFilesResponse& model); + static HRESULT Copy(const PFDataGetFilesResponse& input, PFDataGetFilesResponse& output, ModelBuffer& buffer); +}; + +class GetObjectsRequest : public Wrappers::PFDataGetObjectsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataGetObjectsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataGetObjectsRequest& input); +}; + +class ObjectResult : public Wrappers::PFDataObjectResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataObjectResultWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataObjectResult& model); + static HRESULT Copy(const PFDataObjectResult& input, PFDataObjectResult& output, ModelBuffer& buffer); +}; + +class GetObjectsResponse : public Wrappers::PFDataGetObjectsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataGetObjectsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataGetObjectsResponse& model); + static HRESULT Copy(const PFDataGetObjectsResponse& input, PFDataGetObjectsResponse& output, ModelBuffer& buffer); +}; + +class InitiateFileUploadsRequest : public Wrappers::PFDataInitiateFileUploadsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataInitiateFileUploadsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataInitiateFileUploadsRequest& input); +}; + +class InitiateFileUploadMetadata : public Wrappers::PFDataInitiateFileUploadMetadataWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataInitiateFileUploadMetadataWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataInitiateFileUploadMetadata& model); + static HRESULT Copy(const PFDataInitiateFileUploadMetadata& input, PFDataInitiateFileUploadMetadata& output, ModelBuffer& buffer); +}; + +class InitiateFileUploadsResponse : public Wrappers::PFDataInitiateFileUploadsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataInitiateFileUploadsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataInitiateFileUploadsResponse& model); + static HRESULT Copy(const PFDataInitiateFileUploadsResponse& input, PFDataInitiateFileUploadsResponse& output, ModelBuffer& buffer); +}; + +class SetObject : public Wrappers::PFDataSetObjectWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataSetObjectWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataSetObject& input); +}; + +class SetObjectsRequest : public Wrappers::PFDataSetObjectsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataSetObjectsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFDataSetObjectsRequest& input); +}; + +class SetObjectInfo : public Wrappers::PFDataSetObjectInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataSetObjectInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataSetObjectInfo& model); + static HRESULT Copy(const PFDataSetObjectInfo& input, PFDataSetObjectInfo& output, ModelBuffer& buffer); +}; + +class SetObjectsResponse : public Wrappers::PFDataSetObjectsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFDataSetObjectsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFDataSetObjectsResponse& model); + static HRESULT Copy(const PFDataSetObjectsResponse& input, PFDataSetObjectsResponse& output, ModelBuffer& buffer); +}; + +} // namespace Data +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Experimentation.cpp b/Source/PlayFabServices/Source/Generated/Experimentation.cpp new file mode 100644 index 0000000..a1db3b6 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Experimentation.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "Experimentation.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Experimentation +{ + + +AsyncOp ExperimentationAPI::GetTreatmentAssignment( + Entity const& entity, + const GetTreatmentAssignmentRequest& request, + RunContext rc +) +{ + const char* path{ "/Experimentation/GetTreatmentAssignment" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::ExperimentationGetTreatmentAssignment, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTreatmentAssignmentResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Experimentation +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Experimentation.h b/Source/PlayFabServices/Source/Generated/Experimentation.h new file mode 100644 index 0000000..31feea3 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Experimentation.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include "ExperimentationTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Experimentation +{ + +class ExperimentationAPI +{ +public: + ExperimentationAPI() = delete; + ExperimentationAPI(const ExperimentationAPI& source) = delete; + ExperimentationAPI& operator=(const ExperimentationAPI& source) = delete; + ~ExperimentationAPI() = default; + + // ------------ Generated API calls + static AsyncOp GetTreatmentAssignment(Entity const& entity, const GetTreatmentAssignmentRequest& request, RunContext rc); +}; + +} // namespace Experimentation +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/ExperimentationTypes.cpp b/Source/PlayFabServices/Source/Generated/ExperimentationTypes.cpp new file mode 100644 index 0000000..7bd4e40 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/ExperimentationTypes.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "ExperimentationTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Experimentation +{ + +JsonValue GetTreatmentAssignmentRequest::ToJson() const +{ + return GetTreatmentAssignmentRequest::ToJson(this->Model()); +} + +JsonValue GetTreatmentAssignmentRequest::ToJson(const PFExperimentationGetTreatmentAssignmentRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT GetTreatmentAssignmentResult::FromJson(const JsonValue& input) +{ + std::optional treatmentAssignment{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TreatmentAssignment", treatmentAssignment)); + if (treatmentAssignment) + { + this->SetTreatmentAssignment(std::move(*treatmentAssignment)); + } + + return S_OK; +} + +size_t GetTreatmentAssignmentResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTreatmentAssignmentResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTreatmentAssignmentResult::RequiredBufferSize(const PFExperimentationGetTreatmentAssignmentResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.treatmentAssignment) + { + requiredSize += TreatmentAssignment::RequiredBufferSize(*model.treatmentAssignment); + } + return requiredSize; +} + +HRESULT GetTreatmentAssignmentResult::Copy(const PFExperimentationGetTreatmentAssignmentResult& input, PFExperimentationGetTreatmentAssignmentResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.treatmentAssignment); + RETURN_IF_FAILED(propCopyResult.hr); + output.treatmentAssignment = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Experimentation +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/ExperimentationTypes.h b/Source/PlayFabServices/Source/Generated/ExperimentationTypes.h new file mode 100644 index 0000000..e638add --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/ExperimentationTypes.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Experimentation +{ + +// Experimentation Classes +class GetTreatmentAssignmentRequest : public Wrappers::PFExperimentationGetTreatmentAssignmentRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFExperimentationGetTreatmentAssignmentRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFExperimentationGetTreatmentAssignmentRequest& input); +}; + +class GetTreatmentAssignmentResult : public Wrappers::PFExperimentationGetTreatmentAssignmentResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFExperimentationGetTreatmentAssignmentResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFExperimentationGetTreatmentAssignmentResult& model); + static HRESULT Copy(const PFExperimentationGetTreatmentAssignmentResult& input, PFExperimentationGetTreatmentAssignmentResult& output, ModelBuffer& buffer); +}; + +} // namespace Experimentation +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Friends.cpp b/Source/PlayFabServices/Source/Generated/Friends.cpp new file mode 100644 index 0000000..265368d --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Friends.cpp @@ -0,0 +1,284 @@ +#include "stdafx.h" +#include "Friends.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Friends +{ + + +AsyncOp FriendsAPI::ClientAddFriend( + Entity const& entity, + const ClientAddFriendRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/AddFriend" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::FriendsClientAddFriend, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + AddFriendResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +AsyncOp FriendsAPI::ClientGetFriendsList( + Entity const& entity, + const ClientGetFriendsListRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetFriendsList" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::FriendsClientGetFriendsList, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetFriendsListResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} +#endif + +AsyncOp FriendsAPI::ClientRemoveFriend( + Entity const& entity, + const ClientRemoveFriendRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/RemoveFriend" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::FriendsClientRemoveFriend, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp FriendsAPI::ClientSetFriendTags( + Entity const& entity, + const ClientSetFriendTagsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/SetFriendTags" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::FriendsClientSetFriendTags, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp FriendsAPI::ServerAddFriend( + Entity const& entity, + const ServerAddFriendRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/AddFriend" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::FriendsServerAddFriend, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp FriendsAPI::ServerGetFriendsList( + Entity const& entity, + const ServerGetFriendsListRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetFriendsList" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::FriendsServerGetFriendsList, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetFriendsListResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp FriendsAPI::ServerRemoveFriend( + Entity const& entity, + const ServerRemoveFriendRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/RemoveFriend" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::FriendsServerRemoveFriend, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp FriendsAPI::ServerSetFriendTags( + Entity const& entity, + const ServerSetFriendTagsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SetFriendTags" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::FriendsServerSetFriendTags, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Friends +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Friends.h b/Source/PlayFabServices/Source/Generated/Friends.h new file mode 100644 index 0000000..cd33f60 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Friends.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include "FriendsTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Friends +{ + +class FriendsAPI +{ +public: + FriendsAPI() = delete; + FriendsAPI(const FriendsAPI& source) = delete; + FriendsAPI& operator=(const FriendsAPI& source) = delete; + ~FriendsAPI() = default; + + // ------------ Generated API calls + static AsyncOp ClientAddFriend(Entity const& entity, const ClientAddFriendRequest& request, RunContext rc); + static AsyncOp ClientGetFriendsList(Entity const& entity, const ClientGetFriendsListRequest& request, RunContext rc); + static AsyncOp ClientRemoveFriend(Entity const& entity, const ClientRemoveFriendRequest& request, RunContext rc); + static AsyncOp ClientSetFriendTags(Entity const& entity, const ClientSetFriendTagsRequest& request, RunContext rc); + static AsyncOp ServerAddFriend(Entity const& entity, const ServerAddFriendRequest& request, RunContext rc); + static AsyncOp ServerGetFriendsList(Entity const& entity, const ServerGetFriendsListRequest& request, RunContext rc); + static AsyncOp ServerRemoveFriend(Entity const& entity, const ServerRemoveFriendRequest& request, RunContext rc); + static AsyncOp ServerSetFriendTags(Entity const& entity, const ServerSetFriendTagsRequest& request, RunContext rc); +}; + +} // namespace Friends +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/FriendsTypes.cpp b/Source/PlayFabServices/Source/Generated/FriendsTypes.cpp new file mode 100644 index 0000000..8ab27fe --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/FriendsTypes.cpp @@ -0,0 +1,375 @@ +#include "stdafx.h" +#include "FriendsTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Friends +{ + +JsonValue ClientAddFriendRequest::ToJson() const +{ + return ClientAddFriendRequest::ToJson(this->Model()); +} + +JsonValue ClientAddFriendRequest::ToJson(const PFFriendsClientAddFriendRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FriendEmail", input.friendEmail); + JsonUtils::ObjectAddMember(output, "FriendPlayFabId", input.friendPlayFabId); + JsonUtils::ObjectAddMember(output, "FriendTitleDisplayName", input.friendTitleDisplayName); + JsonUtils::ObjectAddMember(output, "FriendUsername", input.friendUsername); + return output; +} + +HRESULT AddFriendResult::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Created", this->m_model.created)); + + return S_OK; +} + +size_t AddFriendResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AddFriendResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AddFriendResult::RequiredBufferSize(const PFFriendsAddFriendResult& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT AddFriendResult::Copy(const PFFriendsAddFriendResult& input, PFFriendsAddFriendResult& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +JsonValue ClientGetFriendsListRequest::ToJson() const +{ + return ClientGetFriendsListRequest::ToJson(this->Model()); +} + +JsonValue ClientGetFriendsListRequest::ToJson(const PFFriendsClientGetFriendsListRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ExternalPlatformFriends", input.externalPlatformFriends); + JsonUtils::ObjectAddMember(output, "ProfileConstraints", input.profileConstraints); +#if HC_PLATFORM != HC_PLATFORM_GDK + JsonUtils::ObjectAddMember(output, "XboxToken", input.xboxToken); +#endif + return output; +} + +HRESULT FriendInfo::FromJson(const JsonValue& input) +{ + std::optional facebookInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FacebookInfo", facebookInfo)); + if (facebookInfo) + { + this->SetFacebookInfo(std::move(*facebookInfo)); + } + + String friendPlayFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FriendPlayFabId", friendPlayFabId)); + this->SetFriendPlayFabId(std::move(friendPlayFabId)); + + std::optional gameCenterInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GameCenterInfo", gameCenterInfo)); + if (gameCenterInfo) + { + this->SetGameCenterInfo(std::move(*gameCenterInfo)); + } + + std::optional profile{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Profile", profile)); + if (profile) + { + this->SetProfile(std::move(*profile)); + } + + std::optional PSNInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PSNInfo", PSNInfo)); + if (PSNInfo) + { + this->SetPSNInfo(std::move(*PSNInfo)); + } + + std::optional steamInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SteamInfo", steamInfo)); + if (steamInfo) + { + this->SetSteamInfo(std::move(*steamInfo)); + } + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + String titleDisplayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleDisplayName", titleDisplayName)); + this->SetTitleDisplayName(std::move(titleDisplayName)); + + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + std::optional xboxInfo{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "XboxInfo", xboxInfo)); + if (xboxInfo) + { + this->SetXboxInfo(std::move(*xboxInfo)); + } + + return S_OK; +} + +size_t FriendInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result FriendInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t FriendInfo::RequiredBufferSize(const PFFriendsFriendInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.facebookInfo) + { + requiredSize += UserFacebookInfo::RequiredBufferSize(*model.facebookInfo); + } + if (model.friendPlayFabId) + { + requiredSize += (std::strlen(model.friendPlayFabId) + 1); + } + if (model.gameCenterInfo) + { + requiredSize += UserGameCenterInfo::RequiredBufferSize(*model.gameCenterInfo); + } + if (model.profile) + { + requiredSize += PlayerProfileModel::RequiredBufferSize(*model.profile); + } + if (model.PSNInfo) + { + requiredSize += UserPsnInfo::RequiredBufferSize(*model.PSNInfo); + } + if (model.steamInfo) + { + requiredSize += UserSteamInfo::RequiredBufferSize(*model.steamInfo); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + if (model.titleDisplayName) + { + requiredSize += (std::strlen(model.titleDisplayName) + 1); + } + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + if (model.xboxInfo) + { + requiredSize += UserXboxInfo::RequiredBufferSize(*model.xboxInfo); + } + return requiredSize; +} + +HRESULT FriendInfo::Copy(const PFFriendsFriendInfo& input, PFFriendsFriendInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.facebookInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.facebookInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.friendPlayFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.friendPlayFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.gameCenterInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.gameCenterInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.profile); + RETURN_IF_FAILED(propCopyResult.hr); + output.profile = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.PSNInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.PSNInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.steamInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.steamInfo = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleDisplayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleDisplayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.xboxInfo); + RETURN_IF_FAILED(propCopyResult.hr); + output.xboxInfo = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetFriendsListResult::FromJson(const JsonValue& input) +{ + ModelVector friends{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Friends", friends)); + this->SetFriends(std::move(friends)); + + return S_OK; +} + +size_t GetFriendsListResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetFriendsListResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetFriendsListResult::RequiredBufferSize(const PFFriendsGetFriendsListResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFFriendsFriendInfo*) + sizeof(PFFriendsFriendInfo*) * model.friendsCount); + for (size_t i = 0; i < model.friendsCount; ++i) + { + requiredSize += FriendInfo::RequiredBufferSize(*model.friends[i]); + } + return requiredSize; +} + +HRESULT GetFriendsListResult::Copy(const PFFriendsGetFriendsListResult& input, PFFriendsGetFriendsListResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.friends, input.friendsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.friends = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ClientRemoveFriendRequest::ToJson() const +{ + return ClientRemoveFriendRequest::ToJson(this->Model()); +} + +JsonValue ClientRemoveFriendRequest::ToJson(const PFFriendsClientRemoveFriendRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FriendPlayFabId", input.friendPlayFabId); + return output; +} + +JsonValue ClientSetFriendTagsRequest::ToJson() const +{ + return ClientSetFriendTagsRequest::ToJson(this->Model()); +} + +JsonValue ClientSetFriendTagsRequest::ToJson(const PFFriendsClientSetFriendTagsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FriendPlayFabId", input.friendPlayFabId); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + return output; +} + +JsonValue ServerAddFriendRequest::ToJson() const +{ + return ServerAddFriendRequest::ToJson(this->Model()); +} + +JsonValue ServerAddFriendRequest::ToJson(const PFFriendsServerAddFriendRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FriendEmail", input.friendEmail); + JsonUtils::ObjectAddMember(output, "FriendPlayFabId", input.friendPlayFabId); + JsonUtils::ObjectAddMember(output, "FriendTitleDisplayName", input.friendTitleDisplayName); + JsonUtils::ObjectAddMember(output, "FriendUsername", input.friendUsername); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerGetFriendsListRequest::ToJson() const +{ + return ServerGetFriendsListRequest::ToJson(this->Model()); +} + +JsonValue ServerGetFriendsListRequest::ToJson(const PFFriendsServerGetFriendsListRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ExternalPlatformFriends", input.externalPlatformFriends); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "ProfileConstraints", input.profileConstraints); + JsonUtils::ObjectAddMember(output, "XboxToken", input.xboxToken); + return output; +} + +JsonValue ServerRemoveFriendRequest::ToJson() const +{ + return ServerRemoveFriendRequest::ToJson(this->Model()); +} + +JsonValue ServerRemoveFriendRequest::ToJson(const PFFriendsServerRemoveFriendRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FriendPlayFabId", input.friendPlayFabId); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue ServerSetFriendTagsRequest::ToJson() const +{ + return ServerSetFriendTagsRequest::ToJson(this->Model()); +} + +JsonValue ServerSetFriendTagsRequest::ToJson(const PFFriendsServerSetFriendTagsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "FriendPlayFabId", input.friendPlayFabId); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMemberArray(output, "Tags", input.tags, input.tagsCount); + return output; +} + +} // namespace Friends +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/FriendsTypes.h b/Source/PlayFabServices/Source/Generated/FriendsTypes.h new file mode 100644 index 0000000..7928f4a --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/FriendsTypes.h @@ -0,0 +1,184 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Friends +{ + +// Friends Classes +class ClientAddFriendRequest : public Wrappers::PFFriendsClientAddFriendRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsClientAddFriendRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsClientAddFriendRequest& input); +}; + +class AddFriendResult : public Wrappers::PFFriendsAddFriendResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsAddFriendResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFFriendsAddFriendResult& model); + static HRESULT Copy(const PFFriendsAddFriendResult& input, PFFriendsAddFriendResult& output, ModelBuffer& buffer); +}; + +class ClientGetFriendsListRequest : public Wrappers::PFFriendsClientGetFriendsListRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsClientGetFriendsListRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsClientGetFriendsListRequest& input); +}; + +class FriendInfo : public Wrappers::PFFriendsFriendInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsFriendInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFFriendsFriendInfo& model); + static HRESULT Copy(const PFFriendsFriendInfo& input, PFFriendsFriendInfo& output, ModelBuffer& buffer); +}; + +class GetFriendsListResult : public Wrappers::PFFriendsGetFriendsListResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsGetFriendsListResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFFriendsGetFriendsListResult& model); + static HRESULT Copy(const PFFriendsGetFriendsListResult& input, PFFriendsGetFriendsListResult& output, ModelBuffer& buffer); +}; + +class ClientRemoveFriendRequest : public Wrappers::PFFriendsClientRemoveFriendRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsClientRemoveFriendRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsClientRemoveFriendRequest& input); +}; + +class ClientSetFriendTagsRequest : public Wrappers::PFFriendsClientSetFriendTagsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsClientSetFriendTagsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsClientSetFriendTagsRequest& input); +}; + +class ServerAddFriendRequest : public Wrappers::PFFriendsServerAddFriendRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsServerAddFriendRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsServerAddFriendRequest& input); +}; + +class ServerGetFriendsListRequest : public Wrappers::PFFriendsServerGetFriendsListRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsServerGetFriendsListRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsServerGetFriendsListRequest& input); +}; + +class ServerRemoveFriendRequest : public Wrappers::PFFriendsServerRemoveFriendRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsServerRemoveFriendRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsServerRemoveFriendRequest& input); +}; + +class ServerSetFriendTagsRequest : public Wrappers::PFFriendsServerSetFriendTagsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFFriendsServerSetFriendTagsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFFriendsServerSetFriendTagsRequest& input); +}; + +} // namespace Friends +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Groups.cpp b/Source/PlayFabServices/Source/Generated/Groups.cpp new file mode 100644 index 0000000..6f6585c --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Groups.cpp @@ -0,0 +1,865 @@ +#include "stdafx.h" +#include "Groups.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Groups +{ + + +AsyncOp GroupsAPI::AcceptGroupApplication( + Entity const& entity, + const AcceptGroupApplicationRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/AcceptGroupApplication" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsAcceptGroupApplication, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::AcceptGroupInvitation( + Entity const& entity, + const AcceptGroupInvitationRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/AcceptGroupInvitation" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsAcceptGroupInvitation, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::AddMembers( + Entity const& entity, + const AddMembersRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/AddMembers" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsAddMembers, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ApplyToGroup( + Entity const& entity, + const ApplyToGroupRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ApplyToGroup" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsApplyToGroup, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ApplyToGroupResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::BlockEntity( + Entity const& entity, + const BlockEntityRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/BlockEntity" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsBlockEntity, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ChangeMemberRole( + Entity const& entity, + const ChangeMemberRoleRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ChangeMemberRole" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsChangeMemberRole, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::CreateGroup( + Entity const& entity, + const CreateGroupRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/CreateGroup" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsCreateGroup, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + CreateGroupResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::CreateRole( + Entity const& entity, + const CreateGroupRoleRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/CreateRole" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsCreateRole, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + CreateGroupRoleResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::DeleteGroup( + Entity const& entity, + const DeleteGroupRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/DeleteGroup" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsDeleteGroup, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::DeleteRole( + Entity const& entity, + const DeleteRoleRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/DeleteRole" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsDeleteRole, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::GetGroup( + Entity const& entity, + const GetGroupRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/GetGroup" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsGetGroup, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetGroupResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::InviteToGroup( + Entity const& entity, + const InviteToGroupRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/InviteToGroup" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsInviteToGroup, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + InviteToGroupResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::IsMember( + Entity const& entity, + const IsMemberRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/IsMember" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsIsMember, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + IsMemberResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ListGroupApplications( + Entity const& entity, + const ListGroupApplicationsRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ListGroupApplications" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsListGroupApplications, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListGroupApplicationsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ListGroupBlocks( + Entity const& entity, + const ListGroupBlocksRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ListGroupBlocks" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsListGroupBlocks, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListGroupBlocksResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ListGroupInvitations( + Entity const& entity, + const ListGroupInvitationsRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ListGroupInvitations" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsListGroupInvitations, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListGroupInvitationsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ListGroupMembers( + Entity const& entity, + const ListGroupMembersRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ListGroupMembers" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsListGroupMembers, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListGroupMembersResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ListMembership( + Entity const& entity, + const ListMembershipRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ListMembership" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsListMembership, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListMembershipResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::ListMembershipOpportunities( + Entity const& entity, + const ListMembershipOpportunitiesRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/ListMembershipOpportunities" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsListMembershipOpportunities, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListMembershipOpportunitiesResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::RemoveGroupApplication( + Entity const& entity, + const RemoveGroupApplicationRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/RemoveGroupApplication" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsRemoveGroupApplication, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::RemoveGroupInvitation( + Entity const& entity, + const RemoveGroupInvitationRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/RemoveGroupInvitation" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsRemoveGroupInvitation, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::RemoveMembers( + Entity const& entity, + const RemoveMembersRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/RemoveMembers" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsRemoveMembers, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::UnblockEntity( + Entity const& entity, + const UnblockEntityRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/UnblockEntity" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsUnblockEntity, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::UpdateGroup( + Entity const& entity, + const UpdateGroupRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/UpdateGroup" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsUpdateGroup, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateGroupResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp GroupsAPI::UpdateRole( + Entity const& entity, + const UpdateGroupRoleRequest& request, + RunContext rc +) +{ + const char* path{ "/Group/UpdateRole" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::GroupsUpdateRole, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateGroupRoleResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Groups +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Groups.h b/Source/PlayFabServices/Source/Generated/Groups.h new file mode 100644 index 0000000..bfa1682 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Groups.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include "GroupsTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Groups +{ + +class GroupsAPI +{ +public: + GroupsAPI() = delete; + GroupsAPI(const GroupsAPI& source) = delete; + GroupsAPI& operator=(const GroupsAPI& source) = delete; + ~GroupsAPI() = default; + + // ------------ Generated API calls + static AsyncOp AcceptGroupApplication(Entity const& entity, const AcceptGroupApplicationRequest& request, RunContext rc); + static AsyncOp AcceptGroupInvitation(Entity const& entity, const AcceptGroupInvitationRequest& request, RunContext rc); + static AsyncOp AddMembers(Entity const& entity, const AddMembersRequest& request, RunContext rc); + static AsyncOp ApplyToGroup(Entity const& entity, const ApplyToGroupRequest& request, RunContext rc); + static AsyncOp BlockEntity(Entity const& entity, const BlockEntityRequest& request, RunContext rc); + static AsyncOp ChangeMemberRole(Entity const& entity, const ChangeMemberRoleRequest& request, RunContext rc); + static AsyncOp CreateGroup(Entity const& entity, const CreateGroupRequest& request, RunContext rc); + static AsyncOp CreateRole(Entity const& entity, const CreateGroupRoleRequest& request, RunContext rc); + static AsyncOp DeleteGroup(Entity const& entity, const DeleteGroupRequest& request, RunContext rc); + static AsyncOp DeleteRole(Entity const& entity, const DeleteRoleRequest& request, RunContext rc); + static AsyncOp GetGroup(Entity const& entity, const GetGroupRequest& request, RunContext rc); + static AsyncOp InviteToGroup(Entity const& entity, const InviteToGroupRequest& request, RunContext rc); + static AsyncOp IsMember(Entity const& entity, const IsMemberRequest& request, RunContext rc); + static AsyncOp ListGroupApplications(Entity const& entity, const ListGroupApplicationsRequest& request, RunContext rc); + static AsyncOp ListGroupBlocks(Entity const& entity, const ListGroupBlocksRequest& request, RunContext rc); + static AsyncOp ListGroupInvitations(Entity const& entity, const ListGroupInvitationsRequest& request, RunContext rc); + static AsyncOp ListGroupMembers(Entity const& entity, const ListGroupMembersRequest& request, RunContext rc); + static AsyncOp ListMembership(Entity const& entity, const ListMembershipRequest& request, RunContext rc); + static AsyncOp ListMembershipOpportunities(Entity const& entity, const ListMembershipOpportunitiesRequest& request, RunContext rc); + static AsyncOp RemoveGroupApplication(Entity const& entity, const RemoveGroupApplicationRequest& request, RunContext rc); + static AsyncOp RemoveGroupInvitation(Entity const& entity, const RemoveGroupInvitationRequest& request, RunContext rc); + static AsyncOp RemoveMembers(Entity const& entity, const RemoveMembersRequest& request, RunContext rc); + static AsyncOp UnblockEntity(Entity const& entity, const UnblockEntityRequest& request, RunContext rc); + static AsyncOp UpdateGroup(Entity const& entity, const UpdateGroupRequest& request, RunContext rc); + static AsyncOp UpdateRole(Entity const& entity, const UpdateGroupRoleRequest& request, RunContext rc); +}; + +} // namespace Groups +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/GroupsTypes.cpp b/Source/PlayFabServices/Source/Generated/GroupsTypes.cpp new file mode 100644 index 0000000..c541c2b --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/GroupsTypes.cpp @@ -0,0 +1,1628 @@ +#include "stdafx.h" +#include "GroupsTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Groups +{ + +JsonValue AcceptGroupApplicationRequest::ToJson() const +{ + return AcceptGroupApplicationRequest::ToJson(this->Model()); +} + +JsonValue AcceptGroupApplicationRequest::ToJson(const PFGroupsAcceptGroupApplicationRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +JsonValue AcceptGroupInvitationRequest::ToJson() const +{ + return AcceptGroupInvitationRequest::ToJson(this->Model()); +} + +JsonValue AcceptGroupInvitationRequest::ToJson(const PFGroupsAcceptGroupInvitationRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +JsonValue AddMembersRequest::ToJson() const +{ + return AddMembersRequest::ToJson(this->Model()); +} + +JsonValue AddMembersRequest::ToJson(const PFGroupsAddMembersRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMemberArray(output, "Members", input.members, input.membersCount); + JsonUtils::ObjectAddMember(output, "RoleId", input.roleId); + return output; +} + +JsonValue ApplyToGroupRequest::ToJson() const +{ + return ApplyToGroupRequest::ToJson(this->Model()); +} + +JsonValue ApplyToGroupRequest::ToJson(const PFGroupsApplyToGroupRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AutoAcceptOutstandingInvite", input.autoAcceptOutstandingInvite); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +HRESULT EntityWithLineage::FromJson(const JsonValue& input) +{ + std::optional key{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Key", key)); + if (key) + { + this->SetKey(std::move(*key)); + } + + ModelDictionaryEntryVector lineage{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Lineage", lineage)); + this->SetLineage(std::move(lineage)); + + return S_OK; +} + +size_t EntityWithLineage::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityWithLineage::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityWithLineage::RequiredBufferSize(const PFGroupsEntityWithLineage& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.key) + { + requiredSize += EntityKey::RequiredBufferSize(*model.key); + } + requiredSize += (alignof(PFEntityKeyDictionaryEntry) + sizeof(PFEntityKeyDictionaryEntry) * model.lineageCount); + for (size_t i = 0; i < model.lineageCount; ++i) + { + requiredSize += (std::strlen(model.lineage[i].key) + 1); + requiredSize += EntityKey::RequiredBufferSize(*model.lineage[i].value); + } + return requiredSize; +} + +HRESULT EntityWithLineage::Copy(const PFGroupsEntityWithLineage& input, PFGroupsEntityWithLineage& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.key); + RETURN_IF_FAILED(propCopyResult.hr); + output.key = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.lineage, input.lineageCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.lineage = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ApplyToGroupResponse::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expires", this->m_model.expires)); + + std::optional group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + if (group) + { + this->SetGroup(std::move(*group)); + } + + return S_OK; +} + +size_t ApplyToGroupResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ApplyToGroupResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ApplyToGroupResponse::RequiredBufferSize(const PFGroupsApplyToGroupResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.entity); + } + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + return requiredSize; +} + +HRESULT ApplyToGroupResponse::Copy(const PFGroupsApplyToGroupResponse& input, PFGroupsApplyToGroupResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue BlockEntityRequest::ToJson() const +{ + return BlockEntityRequest::ToJson(this->Model()); +} + +JsonValue BlockEntityRequest::ToJson(const PFGroupsBlockEntityRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +JsonValue ChangeMemberRoleRequest::ToJson() const +{ + return ChangeMemberRoleRequest::ToJson(this->Model()); +} + +JsonValue ChangeMemberRoleRequest::ToJson(const PFGroupsChangeMemberRoleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DestinationRoleId", input.destinationRoleId); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMemberArray(output, "Members", input.members, input.membersCount); + JsonUtils::ObjectAddMember(output, "OriginRoleId", input.originRoleId); + return output; +} + +JsonValue CreateGroupRequest::ToJson() const +{ + return CreateGroupRequest::ToJson(this->Model()); +} + +JsonValue CreateGroupRequest::ToJson(const PFGroupsCreateGroupRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "GroupName", input.groupName); + return output; +} + +HRESULT CreateGroupResponse::FromJson(const JsonValue& input) +{ + String adminRoleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AdminRoleId", adminRoleId)); + this->SetAdminRoleId(std::move(adminRoleId)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", this->m_model.created)); + + EntityKey group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + this->SetGroup(std::move(group)); + + String groupName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GroupName", groupName)); + this->SetGroupName(std::move(groupName)); + + String memberRoleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MemberRoleId", memberRoleId)); + this->SetMemberRoleId(std::move(memberRoleId)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + StringDictionaryEntryVector roles{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Roles", roles)); + this->SetRoles(std::move(roles)); + + return S_OK; +} + +size_t CreateGroupResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CreateGroupResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CreateGroupResponse::RequiredBufferSize(const PFGroupsCreateGroupResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.adminRoleId) + { + requiredSize += (std::strlen(model.adminRoleId) + 1); + } + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + if (model.groupName) + { + requiredSize += (std::strlen(model.groupName) + 1); + } + if (model.memberRoleId) + { + requiredSize += (std::strlen(model.memberRoleId) + 1); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.rolesCount); + for (size_t i = 0; i < model.rolesCount; ++i) + { + requiredSize += (std::strlen(model.roles[i].key) + 1); + requiredSize += (std::strlen(model.roles[i].value) + 1); + } + return requiredSize; +} + +HRESULT CreateGroupResponse::Copy(const PFGroupsCreateGroupResponse& input, PFGroupsCreateGroupResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.adminRoleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.adminRoleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.groupName); + RETURN_IF_FAILED(propCopyResult.hr); + output.groupName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.memberRoleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.memberRoleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.roles, input.rolesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.roles = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue CreateGroupRoleRequest::ToJson() const +{ + return CreateGroupRoleRequest::ToJson(this->Model()); +} + +JsonValue CreateGroupRoleRequest::ToJson(const PFGroupsCreateGroupRoleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMember(output, "RoleId", input.roleId); + JsonUtils::ObjectAddMember(output, "RoleName", input.roleName); + return output; +} + +HRESULT CreateGroupRoleResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + String roleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleId", roleId)); + this->SetRoleId(std::move(roleId)); + + String roleName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleName", roleName)); + this->SetRoleName(std::move(roleName)); + + return S_OK; +} + +size_t CreateGroupRoleResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CreateGroupRoleResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CreateGroupRoleResponse::RequiredBufferSize(const PFGroupsCreateGroupRoleResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.roleId) + { + requiredSize += (std::strlen(model.roleId) + 1); + } + if (model.roleName) + { + requiredSize += (std::strlen(model.roleName) + 1); + } + return requiredSize; +} + +HRESULT CreateGroupRoleResponse::Copy(const PFGroupsCreateGroupRoleResponse& input, PFGroupsCreateGroupRoleResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.roleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.roleName); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeleteGroupRequest::ToJson() const +{ + return DeleteGroupRequest::ToJson(this->Model()); +} + +JsonValue DeleteGroupRequest::ToJson(const PFGroupsDeleteGroupRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +JsonValue DeleteRoleRequest::ToJson() const +{ + return DeleteRoleRequest::ToJson(this->Model()); +} + +JsonValue DeleteRoleRequest::ToJson(const PFGroupsDeleteRoleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMember(output, "RoleId", input.roleId); + return output; +} + +JsonValue GetGroupRequest::ToJson() const +{ + return GetGroupRequest::ToJson(this->Model()); +} + +JsonValue GetGroupRequest::ToJson(const PFGroupsGetGroupRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMember(output, "GroupName", input.groupName); + return output; +} + +HRESULT GetGroupResponse::FromJson(const JsonValue& input) +{ + String adminRoleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AdminRoleId", adminRoleId)); + this->SetAdminRoleId(std::move(adminRoleId)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", this->m_model.created)); + + EntityKey group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + this->SetGroup(std::move(group)); + + String groupName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GroupName", groupName)); + this->SetGroupName(std::move(groupName)); + + String memberRoleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MemberRoleId", memberRoleId)); + this->SetMemberRoleId(std::move(memberRoleId)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + StringDictionaryEntryVector roles{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Roles", roles)); + this->SetRoles(std::move(roles)); + + return S_OK; +} + +size_t GetGroupResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetGroupResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetGroupResponse::RequiredBufferSize(const PFGroupsGetGroupResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.adminRoleId) + { + requiredSize += (std::strlen(model.adminRoleId) + 1); + } + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + if (model.groupName) + { + requiredSize += (std::strlen(model.groupName) + 1); + } + if (model.memberRoleId) + { + requiredSize += (std::strlen(model.memberRoleId) + 1); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.rolesCount); + for (size_t i = 0; i < model.rolesCount; ++i) + { + requiredSize += (std::strlen(model.roles[i].key) + 1); + requiredSize += (std::strlen(model.roles[i].value) + 1); + } + return requiredSize; +} + +HRESULT GetGroupResponse::Copy(const PFGroupsGetGroupResponse& input, PFGroupsGetGroupResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.adminRoleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.adminRoleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.groupName); + RETURN_IF_FAILED(propCopyResult.hr); + output.groupName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.memberRoleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.memberRoleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.roles, input.rolesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.roles = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue InviteToGroupRequest::ToJson() const +{ + return InviteToGroupRequest::ToJson(this->Model()); +} + +JsonValue InviteToGroupRequest::ToJson(const PFGroupsInviteToGroupRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AutoAcceptOutstandingApplication", input.autoAcceptOutstandingApplication); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMember(output, "RoleId", input.roleId); + return output; +} + +HRESULT InviteToGroupResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expires", this->m_model.expires)); + + std::optional group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + if (group) + { + this->SetGroup(std::move(*group)); + } + + std::optional invitedByEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "InvitedByEntity", invitedByEntity)); + if (invitedByEntity) + { + this->SetInvitedByEntity(std::move(*invitedByEntity)); + } + + std::optional invitedEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "InvitedEntity", invitedEntity)); + if (invitedEntity) + { + this->SetInvitedEntity(std::move(*invitedEntity)); + } + + String roleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleId", roleId)); + this->SetRoleId(std::move(roleId)); + + return S_OK; +} + +size_t InviteToGroupResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result InviteToGroupResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t InviteToGroupResponse::RequiredBufferSize(const PFGroupsInviteToGroupResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + if (model.invitedByEntity) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.invitedByEntity); + } + if (model.invitedEntity) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.invitedEntity); + } + if (model.roleId) + { + requiredSize += (std::strlen(model.roleId) + 1); + } + return requiredSize; +} + +HRESULT InviteToGroupResponse::Copy(const PFGroupsInviteToGroupResponse& input, PFGroupsInviteToGroupResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.invitedByEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.invitedByEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.invitedEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.invitedEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.roleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue IsMemberRequest::ToJson() const +{ + return IsMemberRequest::ToJson(this->Model()); +} + +JsonValue IsMemberRequest::ToJson(const PFGroupsIsMemberRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMember(output, "RoleId", input.roleId); + return output; +} + +HRESULT IsMemberResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsMember", this->m_model.isMember)); + + return S_OK; +} + +size_t IsMemberResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result IsMemberResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t IsMemberResponse::RequiredBufferSize(const PFGroupsIsMemberResponse& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT IsMemberResponse::Copy(const PFGroupsIsMemberResponse& input, PFGroupsIsMemberResponse& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +JsonValue ListGroupApplicationsRequest::ToJson() const +{ + return ListGroupApplicationsRequest::ToJson(this->Model()); +} + +JsonValue ListGroupApplicationsRequest::ToJson(const PFGroupsListGroupApplicationsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +HRESULT GroupApplication::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expires", this->m_model.expires)); + + std::optional group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + if (group) + { + this->SetGroup(std::move(*group)); + } + + return S_OK; +} + +size_t GroupApplication::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GroupApplication::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GroupApplication::RequiredBufferSize(const PFGroupsGroupApplication& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.entity); + } + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + return requiredSize; +} + +HRESULT GroupApplication::Copy(const PFGroupsGroupApplication& input, PFGroupsGroupApplication& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListGroupApplicationsResponse::FromJson(const JsonValue& input) +{ + ModelVector applications{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Applications", applications)); + this->SetApplications(std::move(applications)); + + return S_OK; +} + +size_t ListGroupApplicationsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListGroupApplicationsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListGroupApplicationsResponse::RequiredBufferSize(const PFGroupsListGroupApplicationsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFGroupsGroupApplication*) + sizeof(PFGroupsGroupApplication*) * model.applicationsCount); + for (size_t i = 0; i < model.applicationsCount; ++i) + { + requiredSize += GroupApplication::RequiredBufferSize(*model.applications[i]); + } + return requiredSize; +} + +HRESULT ListGroupApplicationsResponse::Copy(const PFGroupsListGroupApplicationsResponse& input, PFGroupsListGroupApplicationsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.applications, input.applicationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.applications = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListGroupBlocksRequest::ToJson() const +{ + return ListGroupBlocksRequest::ToJson(this->Model()); +} + +JsonValue ListGroupBlocksRequest::ToJson(const PFGroupsListGroupBlocksRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +HRESULT GroupBlock::FromJson(const JsonValue& input) +{ + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + EntityKey group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + this->SetGroup(std::move(group)); + + return S_OK; +} + +size_t GroupBlock::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GroupBlock::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GroupBlock::RequiredBufferSize(const PFGroupsGroupBlock& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.entity) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.entity); + } + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + return requiredSize; +} + +HRESULT GroupBlock::Copy(const PFGroupsGroupBlock& input, PFGroupsGroupBlock& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListGroupBlocksResponse::FromJson(const JsonValue& input) +{ + ModelVector blockedEntities{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BlockedEntities", blockedEntities)); + this->SetBlockedEntities(std::move(blockedEntities)); + + return S_OK; +} + +size_t ListGroupBlocksResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListGroupBlocksResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListGroupBlocksResponse::RequiredBufferSize(const PFGroupsListGroupBlocksResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFGroupsGroupBlock*) + sizeof(PFGroupsGroupBlock*) * model.blockedEntitiesCount); + for (size_t i = 0; i < model.blockedEntitiesCount; ++i) + { + requiredSize += GroupBlock::RequiredBufferSize(*model.blockedEntities[i]); + } + return requiredSize; +} + +HRESULT ListGroupBlocksResponse::Copy(const PFGroupsListGroupBlocksResponse& input, PFGroupsListGroupBlocksResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.blockedEntities, input.blockedEntitiesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.blockedEntities = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListGroupInvitationsRequest::ToJson() const +{ + return ListGroupInvitationsRequest::ToJson(this->Model()); +} + +JsonValue ListGroupInvitationsRequest::ToJson(const PFGroupsListGroupInvitationsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +HRESULT GroupInvitation::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Expires", this->m_model.expires)); + + std::optional group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + if (group) + { + this->SetGroup(std::move(*group)); + } + + std::optional invitedByEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "InvitedByEntity", invitedByEntity)); + if (invitedByEntity) + { + this->SetInvitedByEntity(std::move(*invitedByEntity)); + } + + std::optional invitedEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "InvitedEntity", invitedEntity)); + if (invitedEntity) + { + this->SetInvitedEntity(std::move(*invitedEntity)); + } + + String roleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleId", roleId)); + this->SetRoleId(std::move(roleId)); + + return S_OK; +} + +size_t GroupInvitation::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GroupInvitation::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GroupInvitation::RequiredBufferSize(const PFGroupsGroupInvitation& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + if (model.invitedByEntity) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.invitedByEntity); + } + if (model.invitedEntity) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.invitedEntity); + } + if (model.roleId) + { + requiredSize += (std::strlen(model.roleId) + 1); + } + return requiredSize; +} + +HRESULT GroupInvitation::Copy(const PFGroupsGroupInvitation& input, PFGroupsGroupInvitation& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.invitedByEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.invitedByEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.invitedEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.invitedEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.roleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListGroupInvitationsResponse::FromJson(const JsonValue& input) +{ + ModelVector invitations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Invitations", invitations)); + this->SetInvitations(std::move(invitations)); + + return S_OK; +} + +size_t ListGroupInvitationsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListGroupInvitationsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListGroupInvitationsResponse::RequiredBufferSize(const PFGroupsListGroupInvitationsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFGroupsGroupInvitation*) + sizeof(PFGroupsGroupInvitation*) * model.invitationsCount); + for (size_t i = 0; i < model.invitationsCount; ++i) + { + requiredSize += GroupInvitation::RequiredBufferSize(*model.invitations[i]); + } + return requiredSize; +} + +HRESULT ListGroupInvitationsResponse::Copy(const PFGroupsListGroupInvitationsResponse& input, PFGroupsListGroupInvitationsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.invitations, input.invitationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.invitations = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListGroupMembersRequest::ToJson() const +{ + return ListGroupMembersRequest::ToJson(this->Model()); +} + +JsonValue ListGroupMembersRequest::ToJson(const PFGroupsListGroupMembersRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +HRESULT EntityMemberRole::FromJson(const JsonValue& input) +{ + ModelVector members{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Members", members)); + this->SetMembers(std::move(members)); + + String roleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleId", roleId)); + this->SetRoleId(std::move(roleId)); + + String roleName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleName", roleName)); + this->SetRoleName(std::move(roleName)); + + return S_OK; +} + +size_t EntityMemberRole::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityMemberRole::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityMemberRole::RequiredBufferSize(const PFGroupsEntityMemberRole& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFGroupsEntityWithLineage*) + sizeof(PFGroupsEntityWithLineage*) * model.membersCount); + for (size_t i = 0; i < model.membersCount; ++i) + { + requiredSize += EntityWithLineage::RequiredBufferSize(*model.members[i]); + } + if (model.roleId) + { + requiredSize += (std::strlen(model.roleId) + 1); + } + if (model.roleName) + { + requiredSize += (std::strlen(model.roleName) + 1); + } + return requiredSize; +} + +HRESULT EntityMemberRole::Copy(const PFGroupsEntityMemberRole& input, PFGroupsEntityMemberRole& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.members, input.membersCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.members = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.roleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.roleName); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListGroupMembersResponse::FromJson(const JsonValue& input) +{ + ModelVector members{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Members", members)); + this->SetMembers(std::move(members)); + + return S_OK; +} + +size_t ListGroupMembersResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListGroupMembersResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListGroupMembersResponse::RequiredBufferSize(const PFGroupsListGroupMembersResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFGroupsEntityMemberRole*) + sizeof(PFGroupsEntityMemberRole*) * model.membersCount); + for (size_t i = 0; i < model.membersCount; ++i) + { + requiredSize += EntityMemberRole::RequiredBufferSize(*model.members[i]); + } + return requiredSize; +} + +HRESULT ListGroupMembersResponse::Copy(const PFGroupsListGroupMembersResponse& input, PFGroupsListGroupMembersResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.members, input.membersCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.members = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListMembershipRequest::ToJson() const +{ + return ListMembershipRequest::ToJson(this->Model()); +} + +JsonValue ListMembershipRequest::ToJson(const PFGroupsListMembershipRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT GroupRole::FromJson(const JsonValue& input) +{ + String roleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleId", roleId)); + this->SetRoleId(std::move(roleId)); + + String roleName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoleName", roleName)); + this->SetRoleName(std::move(roleName)); + + return S_OK; +} + +size_t GroupRole::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GroupRole::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GroupRole::RequiredBufferSize(const PFGroupsGroupRole& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.roleId) + { + requiredSize += (std::strlen(model.roleId) + 1); + } + if (model.roleName) + { + requiredSize += (std::strlen(model.roleName) + 1); + } + return requiredSize; +} + +HRESULT GroupRole::Copy(const PFGroupsGroupRole& input, PFGroupsGroupRole& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.roleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.roleName); + RETURN_IF_FAILED(propCopyResult.hr); + output.roleName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GroupWithRoles::FromJson(const JsonValue& input) +{ + std::optional group{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Group", group)); + if (group) + { + this->SetGroup(std::move(*group)); + } + + String groupName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GroupName", groupName)); + this->SetGroupName(std::move(groupName)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + ModelVector roles{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Roles", roles)); + this->SetRoles(std::move(roles)); + + return S_OK; +} + +size_t GroupWithRoles::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GroupWithRoles::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GroupWithRoles::RequiredBufferSize(const PFGroupsGroupWithRoles& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.group) + { + requiredSize += EntityKey::RequiredBufferSize(*model.group); + } + if (model.groupName) + { + requiredSize += (std::strlen(model.groupName) + 1); + } + requiredSize += (alignof(PFGroupsGroupRole*) + sizeof(PFGroupsGroupRole*) * model.rolesCount); + for (size_t i = 0; i < model.rolesCount; ++i) + { + requiredSize += GroupRole::RequiredBufferSize(*model.roles[i]); + } + return requiredSize; +} + +HRESULT GroupWithRoles::Copy(const PFGroupsGroupWithRoles& input, PFGroupsGroupWithRoles& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.group); + RETURN_IF_FAILED(propCopyResult.hr); + output.group = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.groupName); + RETURN_IF_FAILED(propCopyResult.hr); + output.groupName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.roles, input.rolesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.roles = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListMembershipResponse::FromJson(const JsonValue& input) +{ + ModelVector groups{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Groups", groups)); + this->SetGroups(std::move(groups)); + + return S_OK; +} + +size_t ListMembershipResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListMembershipResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListMembershipResponse::RequiredBufferSize(const PFGroupsListMembershipResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFGroupsGroupWithRoles*) + sizeof(PFGroupsGroupWithRoles*) * model.groupsCount); + for (size_t i = 0; i < model.groupsCount; ++i) + { + requiredSize += GroupWithRoles::RequiredBufferSize(*model.groups[i]); + } + return requiredSize; +} + +HRESULT ListMembershipResponse::Copy(const PFGroupsListMembershipResponse& input, PFGroupsListMembershipResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.groups, input.groupsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.groups = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListMembershipOpportunitiesRequest::ToJson() const +{ + return ListMembershipOpportunitiesRequest::ToJson(this->Model()); +} + +JsonValue ListMembershipOpportunitiesRequest::ToJson(const PFGroupsListMembershipOpportunitiesRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT ListMembershipOpportunitiesResponse::FromJson(const JsonValue& input) +{ + ModelVector applications{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Applications", applications)); + this->SetApplications(std::move(applications)); + + ModelVector invitations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Invitations", invitations)); + this->SetInvitations(std::move(invitations)); + + return S_OK; +} + +size_t ListMembershipOpportunitiesResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListMembershipOpportunitiesResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListMembershipOpportunitiesResponse::RequiredBufferSize(const PFGroupsListMembershipOpportunitiesResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFGroupsGroupApplication*) + sizeof(PFGroupsGroupApplication*) * model.applicationsCount); + for (size_t i = 0; i < model.applicationsCount; ++i) + { + requiredSize += GroupApplication::RequiredBufferSize(*model.applications[i]); + } + requiredSize += (alignof(PFGroupsGroupInvitation*) + sizeof(PFGroupsGroupInvitation*) * model.invitationsCount); + for (size_t i = 0; i < model.invitationsCount; ++i) + { + requiredSize += GroupInvitation::RequiredBufferSize(*model.invitations[i]); + } + return requiredSize; +} + +HRESULT ListMembershipOpportunitiesResponse::Copy(const PFGroupsListMembershipOpportunitiesResponse& input, PFGroupsListMembershipOpportunitiesResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.applications, input.applicationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.applications = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.invitations, input.invitationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.invitations = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RemoveGroupApplicationRequest::ToJson() const +{ + return RemoveGroupApplicationRequest::ToJson(this->Model()); +} + +JsonValue RemoveGroupApplicationRequest::ToJson(const PFGroupsRemoveGroupApplicationRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +JsonValue RemoveGroupInvitationRequest::ToJson() const +{ + return RemoveGroupInvitationRequest::ToJson(this->Model()); +} + +JsonValue RemoveGroupInvitationRequest::ToJson(const PFGroupsRemoveGroupInvitationRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +JsonValue RemoveMembersRequest::ToJson() const +{ + return RemoveMembersRequest::ToJson(this->Model()); +} + +JsonValue RemoveMembersRequest::ToJson(const PFGroupsRemoveMembersRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMemberArray(output, "Members", input.members, input.membersCount); + JsonUtils::ObjectAddMember(output, "RoleId", input.roleId); + return output; +} + +JsonValue UnblockEntityRequest::ToJson() const +{ + return UnblockEntityRequest::ToJson(this->Model()); +} + +JsonValue UnblockEntityRequest::ToJson(const PFGroupsUnblockEntityRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Group", input.group); + return output; +} + +JsonValue UpdateGroupRequest::ToJson() const +{ + return UpdateGroupRequest::ToJson(this->Model()); +} + +JsonValue UpdateGroupRequest::ToJson(const PFGroupsUpdateGroupRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AdminRoleId", input.adminRoleId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ExpectedProfileVersion", input.expectedProfileVersion); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMember(output, "GroupName", input.groupName); + JsonUtils::ObjectAddMember(output, "MemberRoleId", input.memberRoleId); + return output; +} + +HRESULT UpdateGroupResponse::FromJson(const JsonValue& input) +{ + String operationReason{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OperationReason", operationReason)); + this->SetOperationReason(std::move(operationReason)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + std::optional setResult{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SetResult", setResult)); + this->SetSetResult(std::move(setResult)); + + return S_OK; +} + +size_t UpdateGroupResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateGroupResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateGroupResponse::RequiredBufferSize(const PFGroupsUpdateGroupResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.operationReason) + { + requiredSize += (std::strlen(model.operationReason) + 1); + } + if (model.setResult) + { + requiredSize += (alignof(PFOperationTypes) + sizeof(PFOperationTypes)); + } + return requiredSize; +} + +HRESULT UpdateGroupResponse::Copy(const PFGroupsUpdateGroupResponse& input, PFGroupsUpdateGroupResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.operationReason); + RETURN_IF_FAILED(propCopyResult.hr); + output.operationReason = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.setResult); + RETURN_IF_FAILED(propCopyResult.hr); + output.setResult = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue UpdateGroupRoleRequest::ToJson() const +{ + return UpdateGroupRoleRequest::ToJson(this->Model()); +} + +JsonValue UpdateGroupRoleRequest::ToJson(const PFGroupsUpdateGroupRoleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "ExpectedProfileVersion", input.expectedProfileVersion); + JsonUtils::ObjectAddMember(output, "Group", input.group); + JsonUtils::ObjectAddMember(output, "RoleId", input.roleId); + JsonUtils::ObjectAddMember(output, "RoleName", input.roleName); + return output; +} + +HRESULT UpdateGroupRoleResponse::FromJson(const JsonValue& input) +{ + String operationReason{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OperationReason", operationReason)); + this->SetOperationReason(std::move(operationReason)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfileVersion", this->m_model.profileVersion)); + + std::optional setResult{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SetResult", setResult)); + this->SetSetResult(std::move(setResult)); + + return S_OK; +} + +size_t UpdateGroupRoleResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateGroupRoleResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateGroupRoleResponse::RequiredBufferSize(const PFGroupsUpdateGroupRoleResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.operationReason) + { + requiredSize += (std::strlen(model.operationReason) + 1); + } + if (model.setResult) + { + requiredSize += (alignof(PFOperationTypes) + sizeof(PFOperationTypes)); + } + return requiredSize; +} + +HRESULT UpdateGroupRoleResponse::Copy(const PFGroupsUpdateGroupRoleResponse& input, PFGroupsUpdateGroupRoleResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.operationReason); + RETURN_IF_FAILED(propCopyResult.hr); + output.operationReason = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.setResult); + RETURN_IF_FAILED(propCopyResult.hr); + output.setResult = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Groups +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/GroupsTypes.h b/Source/PlayFabServices/Source/Generated/GroupsTypes.h new file mode 100644 index 0000000..b819d52 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/GroupsTypes.h @@ -0,0 +1,764 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Groups +{ + +// Groups Classes +class AcceptGroupApplicationRequest : public Wrappers::PFGroupsAcceptGroupApplicationRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsAcceptGroupApplicationRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsAcceptGroupApplicationRequest& input); +}; + +class AcceptGroupInvitationRequest : public Wrappers::PFGroupsAcceptGroupInvitationRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsAcceptGroupInvitationRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsAcceptGroupInvitationRequest& input); +}; + +class AddMembersRequest : public Wrappers::PFGroupsAddMembersRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsAddMembersRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsAddMembersRequest& input); +}; + +class ApplyToGroupRequest : public Wrappers::PFGroupsApplyToGroupRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsApplyToGroupRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsApplyToGroupRequest& input); +}; + +class EntityWithLineage : public Wrappers::PFGroupsEntityWithLineageWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsEntityWithLineageWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsEntityWithLineage& model); + static HRESULT Copy(const PFGroupsEntityWithLineage& input, PFGroupsEntityWithLineage& output, ModelBuffer& buffer); +}; + +class ApplyToGroupResponse : public Wrappers::PFGroupsApplyToGroupResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsApplyToGroupResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsApplyToGroupResponse& model); + static HRESULT Copy(const PFGroupsApplyToGroupResponse& input, PFGroupsApplyToGroupResponse& output, ModelBuffer& buffer); +}; + +class BlockEntityRequest : public Wrappers::PFGroupsBlockEntityRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsBlockEntityRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsBlockEntityRequest& input); +}; + +class ChangeMemberRoleRequest : public Wrappers::PFGroupsChangeMemberRoleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsChangeMemberRoleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsChangeMemberRoleRequest& input); +}; + +class CreateGroupRequest : public Wrappers::PFGroupsCreateGroupRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsCreateGroupRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsCreateGroupRequest& input); +}; + +class CreateGroupResponse : public Wrappers::PFGroupsCreateGroupResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsCreateGroupResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsCreateGroupResponse& model); + static HRESULT Copy(const PFGroupsCreateGroupResponse& input, PFGroupsCreateGroupResponse& output, ModelBuffer& buffer); +}; + +class CreateGroupRoleRequest : public Wrappers::PFGroupsCreateGroupRoleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsCreateGroupRoleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsCreateGroupRoleRequest& input); +}; + +class CreateGroupRoleResponse : public Wrappers::PFGroupsCreateGroupRoleResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsCreateGroupRoleResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsCreateGroupRoleResponse& model); + static HRESULT Copy(const PFGroupsCreateGroupRoleResponse& input, PFGroupsCreateGroupRoleResponse& output, ModelBuffer& buffer); +}; + +class DeleteGroupRequest : public Wrappers::PFGroupsDeleteGroupRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsDeleteGroupRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsDeleteGroupRequest& input); +}; + +class DeleteRoleRequest : public Wrappers::PFGroupsDeleteRoleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsDeleteRoleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsDeleteRoleRequest& input); +}; + +class GetGroupRequest : public Wrappers::PFGroupsGetGroupRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsGetGroupRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsGetGroupRequest& input); +}; + +class GetGroupResponse : public Wrappers::PFGroupsGetGroupResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsGetGroupResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsGetGroupResponse& model); + static HRESULT Copy(const PFGroupsGetGroupResponse& input, PFGroupsGetGroupResponse& output, ModelBuffer& buffer); +}; + +class InviteToGroupRequest : public Wrappers::PFGroupsInviteToGroupRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsInviteToGroupRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsInviteToGroupRequest& input); +}; + +class InviteToGroupResponse : public Wrappers::PFGroupsInviteToGroupResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsInviteToGroupResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsInviteToGroupResponse& model); + static HRESULT Copy(const PFGroupsInviteToGroupResponse& input, PFGroupsInviteToGroupResponse& output, ModelBuffer& buffer); +}; + +class IsMemberRequest : public Wrappers::PFGroupsIsMemberRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsIsMemberRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsIsMemberRequest& input); +}; + +class IsMemberResponse : public Wrappers::PFGroupsIsMemberResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsIsMemberResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsIsMemberResponse& model); + static HRESULT Copy(const PFGroupsIsMemberResponse& input, PFGroupsIsMemberResponse& output, ModelBuffer& buffer); +}; + +class ListGroupApplicationsRequest : public Wrappers::PFGroupsListGroupApplicationsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupApplicationsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsListGroupApplicationsRequest& input); +}; + +class GroupApplication : public Wrappers::PFGroupsGroupApplicationWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsGroupApplicationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsGroupApplication& model); + static HRESULT Copy(const PFGroupsGroupApplication& input, PFGroupsGroupApplication& output, ModelBuffer& buffer); +}; + +class ListGroupApplicationsResponse : public Wrappers::PFGroupsListGroupApplicationsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupApplicationsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsListGroupApplicationsResponse& model); + static HRESULT Copy(const PFGroupsListGroupApplicationsResponse& input, PFGroupsListGroupApplicationsResponse& output, ModelBuffer& buffer); +}; + +class ListGroupBlocksRequest : public Wrappers::PFGroupsListGroupBlocksRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupBlocksRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsListGroupBlocksRequest& input); +}; + +class GroupBlock : public Wrappers::PFGroupsGroupBlockWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsGroupBlockWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsGroupBlock& model); + static HRESULT Copy(const PFGroupsGroupBlock& input, PFGroupsGroupBlock& output, ModelBuffer& buffer); +}; + +class ListGroupBlocksResponse : public Wrappers::PFGroupsListGroupBlocksResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupBlocksResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsListGroupBlocksResponse& model); + static HRESULT Copy(const PFGroupsListGroupBlocksResponse& input, PFGroupsListGroupBlocksResponse& output, ModelBuffer& buffer); +}; + +class ListGroupInvitationsRequest : public Wrappers::PFGroupsListGroupInvitationsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupInvitationsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsListGroupInvitationsRequest& input); +}; + +class GroupInvitation : public Wrappers::PFGroupsGroupInvitationWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsGroupInvitationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsGroupInvitation& model); + static HRESULT Copy(const PFGroupsGroupInvitation& input, PFGroupsGroupInvitation& output, ModelBuffer& buffer); +}; + +class ListGroupInvitationsResponse : public Wrappers::PFGroupsListGroupInvitationsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupInvitationsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsListGroupInvitationsResponse& model); + static HRESULT Copy(const PFGroupsListGroupInvitationsResponse& input, PFGroupsListGroupInvitationsResponse& output, ModelBuffer& buffer); +}; + +class ListGroupMembersRequest : public Wrappers::PFGroupsListGroupMembersRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupMembersRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsListGroupMembersRequest& input); +}; + +class EntityMemberRole : public Wrappers::PFGroupsEntityMemberRoleWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsEntityMemberRoleWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsEntityMemberRole& model); + static HRESULT Copy(const PFGroupsEntityMemberRole& input, PFGroupsEntityMemberRole& output, ModelBuffer& buffer); +}; + +class ListGroupMembersResponse : public Wrappers::PFGroupsListGroupMembersResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListGroupMembersResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsListGroupMembersResponse& model); + static HRESULT Copy(const PFGroupsListGroupMembersResponse& input, PFGroupsListGroupMembersResponse& output, ModelBuffer& buffer); +}; + +class ListMembershipRequest : public Wrappers::PFGroupsListMembershipRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListMembershipRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsListMembershipRequest& input); +}; + +class GroupRole : public Wrappers::PFGroupsGroupRoleWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsGroupRoleWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsGroupRole& model); + static HRESULT Copy(const PFGroupsGroupRole& input, PFGroupsGroupRole& output, ModelBuffer& buffer); +}; + +class GroupWithRoles : public Wrappers::PFGroupsGroupWithRolesWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsGroupWithRolesWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsGroupWithRoles& model); + static HRESULT Copy(const PFGroupsGroupWithRoles& input, PFGroupsGroupWithRoles& output, ModelBuffer& buffer); +}; + +class ListMembershipResponse : public Wrappers::PFGroupsListMembershipResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListMembershipResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsListMembershipResponse& model); + static HRESULT Copy(const PFGroupsListMembershipResponse& input, PFGroupsListMembershipResponse& output, ModelBuffer& buffer); +}; + +class ListMembershipOpportunitiesRequest : public Wrappers::PFGroupsListMembershipOpportunitiesRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListMembershipOpportunitiesRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsListMembershipOpportunitiesRequest& input); +}; + +class ListMembershipOpportunitiesResponse : public Wrappers::PFGroupsListMembershipOpportunitiesResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsListMembershipOpportunitiesResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsListMembershipOpportunitiesResponse& model); + static HRESULT Copy(const PFGroupsListMembershipOpportunitiesResponse& input, PFGroupsListMembershipOpportunitiesResponse& output, ModelBuffer& buffer); +}; + +class RemoveGroupApplicationRequest : public Wrappers::PFGroupsRemoveGroupApplicationRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsRemoveGroupApplicationRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsRemoveGroupApplicationRequest& input); +}; + +class RemoveGroupInvitationRequest : public Wrappers::PFGroupsRemoveGroupInvitationRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsRemoveGroupInvitationRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsRemoveGroupInvitationRequest& input); +}; + +class RemoveMembersRequest : public Wrappers::PFGroupsRemoveMembersRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsRemoveMembersRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsRemoveMembersRequest& input); +}; + +class UnblockEntityRequest : public Wrappers::PFGroupsUnblockEntityRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsUnblockEntityRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsUnblockEntityRequest& input); +}; + +class UpdateGroupRequest : public Wrappers::PFGroupsUpdateGroupRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsUpdateGroupRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsUpdateGroupRequest& input); +}; + +class UpdateGroupResponse : public Wrappers::PFGroupsUpdateGroupResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsUpdateGroupResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsUpdateGroupResponse& model); + static HRESULT Copy(const PFGroupsUpdateGroupResponse& input, PFGroupsUpdateGroupResponse& output, ModelBuffer& buffer); +}; + +class UpdateGroupRoleRequest : public Wrappers::PFGroupsUpdateGroupRoleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsUpdateGroupRoleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFGroupsUpdateGroupRoleRequest& input); +}; + +class UpdateGroupRoleResponse : public Wrappers::PFGroupsUpdateGroupRoleResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFGroupsUpdateGroupRoleResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFGroupsUpdateGroupRoleResponse& model); + static HRESULT Copy(const PFGroupsUpdateGroupRoleResponse& input, PFGroupsUpdateGroupRoleResponse& output, ModelBuffer& buffer); +}; + +} // namespace Groups +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Inventory.cpp b/Source/PlayFabServices/Source/Generated/Inventory.cpp new file mode 100644 index 0000000..30b36f5 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Inventory.cpp @@ -0,0 +1,642 @@ +#include "stdafx.h" +#include "Inventory.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Inventory +{ + + +AsyncOp InventoryAPI::AddInventoryItems( + Entity const& entity, + const AddInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/AddInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryAddInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + AddInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::DeleteInventoryCollection( + Entity const& entity, + const DeleteInventoryCollectionRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/DeleteInventoryCollection" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryDeleteInventoryCollection, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::DeleteInventoryItems( + Entity const& entity, + const DeleteInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/DeleteInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryDeleteInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + DeleteInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::ExecuteInventoryOperations( + Entity const& entity, + const ExecuteInventoryOperationsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/ExecuteInventoryOperations" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryExecuteInventoryOperations, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ExecuteInventoryOperationsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::GetInventoryCollectionIds( + Entity const& entity, + const GetInventoryCollectionIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/GetInventoryCollectionIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryGetInventoryCollectionIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetInventoryCollectionIdsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::GetInventoryItems( + Entity const& entity, + const GetInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/GetInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryGetInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::GetMicrosoftStoreAccessTokens( + Entity const& entity, + const GetMicrosoftStoreAccessTokensRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/GetMicrosoftStoreAccessTokens" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryGetMicrosoftStoreAccessTokens, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetMicrosoftStoreAccessTokensResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::GetTransactionHistory( + Entity const& entity, + const GetTransactionHistoryRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/GetTransactionHistory" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryGetTransactionHistory, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTransactionHistoryResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::PurchaseInventoryItems( + Entity const& entity, + const PurchaseInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/PurchaseInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryPurchaseInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + PurchaseInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::RedeemAppleAppStoreInventoryItems( + Entity const& entity, + const RedeemAppleAppStoreInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/RedeemAppleAppStoreInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryRedeemAppleAppStoreInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RedeemAppleAppStoreInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::RedeemGooglePlayInventoryItems( + Entity const& entity, + const RedeemGooglePlayInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/RedeemGooglePlayInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryRedeemGooglePlayInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RedeemGooglePlayInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +AsyncOp InventoryAPI::RedeemMicrosoftStoreInventoryItems( + Entity const& entity, + const RedeemMicrosoftStoreInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/RedeemMicrosoftStoreInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryRedeemMicrosoftStoreInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RedeemMicrosoftStoreInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} +#endif + +AsyncOp InventoryAPI::RedeemNintendoEShopInventoryItems( + Entity const& entity, + const RedeemNintendoEShopInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/RedeemNintendoEShopInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryRedeemNintendoEShopInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RedeemNintendoEShopInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::RedeemPlayStationStoreInventoryItems( + Entity const& entity, + const RedeemPlayStationStoreInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/RedeemPlayStationStoreInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryRedeemPlayStationStoreInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RedeemPlayStationStoreInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::RedeemSteamInventoryItems( + Entity const& entity, + const RedeemSteamInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/RedeemSteamInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryRedeemSteamInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RedeemSteamInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::SubtractInventoryItems( + Entity const& entity, + const SubtractInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/SubtractInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventorySubtractInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + SubtractInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::TransferInventoryItems( + Entity const& entity, + const TransferInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/TransferInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryTransferInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + TransferInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp InventoryAPI::UpdateInventoryItems( + Entity const& entity, + const UpdateInventoryItemsRequest& request, + RunContext rc +) +{ + const char* path{ "/Inventory/UpdateInventoryItems" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::InventoryUpdateInventoryItems, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateInventoryItemsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Inventory +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Inventory.h b/Source/PlayFabServices/Source/Generated/Inventory.h new file mode 100644 index 0000000..ab34503 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Inventory.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include "InventoryTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Inventory +{ + +class InventoryAPI +{ +public: + InventoryAPI() = delete; + InventoryAPI(const InventoryAPI& source) = delete; + InventoryAPI& operator=(const InventoryAPI& source) = delete; + ~InventoryAPI() = default; + + // ------------ Generated API calls + static AsyncOp AddInventoryItems(Entity const& entity, const AddInventoryItemsRequest& request, RunContext rc); + static AsyncOp DeleteInventoryCollection(Entity const& entity, const DeleteInventoryCollectionRequest& request, RunContext rc); + static AsyncOp DeleteInventoryItems(Entity const& entity, const DeleteInventoryItemsRequest& request, RunContext rc); + static AsyncOp ExecuteInventoryOperations(Entity const& entity, const ExecuteInventoryOperationsRequest& request, RunContext rc); + static AsyncOp GetInventoryCollectionIds(Entity const& entity, const GetInventoryCollectionIdsRequest& request, RunContext rc); + static AsyncOp GetInventoryItems(Entity const& entity, const GetInventoryItemsRequest& request, RunContext rc); + static AsyncOp GetMicrosoftStoreAccessTokens(Entity const& entity, const GetMicrosoftStoreAccessTokensRequest& request, RunContext rc); + static AsyncOp GetTransactionHistory(Entity const& entity, const GetTransactionHistoryRequest& request, RunContext rc); + static AsyncOp PurchaseInventoryItems(Entity const& entity, const PurchaseInventoryItemsRequest& request, RunContext rc); + static AsyncOp RedeemAppleAppStoreInventoryItems(Entity const& entity, const RedeemAppleAppStoreInventoryItemsRequest& request, RunContext rc); + static AsyncOp RedeemGooglePlayInventoryItems(Entity const& entity, const RedeemGooglePlayInventoryItemsRequest& request, RunContext rc); + static AsyncOp RedeemMicrosoftStoreInventoryItems(Entity const& entity, const RedeemMicrosoftStoreInventoryItemsRequest& request, RunContext rc); + static AsyncOp RedeemNintendoEShopInventoryItems(Entity const& entity, const RedeemNintendoEShopInventoryItemsRequest& request, RunContext rc); + static AsyncOp RedeemPlayStationStoreInventoryItems(Entity const& entity, const RedeemPlayStationStoreInventoryItemsRequest& request, RunContext rc); + static AsyncOp RedeemSteamInventoryItems(Entity const& entity, const RedeemSteamInventoryItemsRequest& request, RunContext rc); + static AsyncOp SubtractInventoryItems(Entity const& entity, const SubtractInventoryItemsRequest& request, RunContext rc); + static AsyncOp TransferInventoryItems(Entity const& entity, const TransferInventoryItemsRequest& request, RunContext rc); + static AsyncOp UpdateInventoryItems(Entity const& entity, const UpdateInventoryItemsRequest& request, RunContext rc); +}; + +} // namespace Inventory +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/InventoryTypes.cpp b/Source/PlayFabServices/Source/Generated/InventoryTypes.cpp new file mode 100644 index 0000000..01875a3 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/InventoryTypes.cpp @@ -0,0 +1,2312 @@ +#include "stdafx.h" +#include "InventoryTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Inventory +{ + +JsonValue AlternateId::ToJson() const +{ + return AlternateId::ToJson(this->Model()); +} + +JsonValue AlternateId::ToJson(const PFInventoryAlternateId& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Type", input.type); + JsonUtils::ObjectAddMember(output, "Value", input.value); + return output; +} + +JsonValue InventoryItemReference::ToJson() const +{ + return InventoryItemReference::ToJson(this->Model()); +} + +JsonValue InventoryItemReference::ToJson(const PFInventoryInventoryItemReference& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AlternateId", input.alternateId); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "StackId", input.stackId); + return output; +} + +JsonValue InitialValues::ToJson() const +{ + return InitialValues::ToJson(this->Model()); +} + +JsonValue InitialValues::ToJson(const PFInventoryInitialValues& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "DisplayProperties", input.displayProperties); + return output; +} + +JsonValue AddInventoryItemsRequest::ToJson() const +{ + return AddInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue AddInventoryItemsRequest::ToJson(const PFInventoryAddInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DurationInSeconds", input.durationInSeconds); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "IdempotencyId", input.idempotencyId); + JsonUtils::ObjectAddMember(output, "Item", input.item); + JsonUtils::ObjectAddMember(output, "NewStackValues", input.newStackValues); + return output; +} + +HRESULT AddInventoryItemsResponse::FromJson(const JsonValue& input) +{ + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + String idempotencyId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdempotencyId", idempotencyId)); + this->SetIdempotencyId(std::move(idempotencyId)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t AddInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AddInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AddInventoryItemsResponse::RequiredBufferSize(const PFInventoryAddInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + if (model.idempotencyId) + { + requiredSize += (std::strlen(model.idempotencyId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT AddInventoryItemsResponse::Copy(const PFInventoryAddInventoryItemsResponse& input, PFInventoryAddInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.idempotencyId); + RETURN_IF_FAILED(propCopyResult.hr); + output.idempotencyId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue DeleteInventoryCollectionRequest::ToJson() const +{ + return DeleteInventoryCollectionRequest::ToJson(this->Model()); +} + +JsonValue DeleteInventoryCollectionRequest::ToJson(const PFInventoryDeleteInventoryCollectionRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + return output; +} + +JsonValue DeleteInventoryItemsRequest::ToJson() const +{ + return DeleteInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue DeleteInventoryItemsRequest::ToJson(const PFInventoryDeleteInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "IdempotencyId", input.idempotencyId); + JsonUtils::ObjectAddMember(output, "Item", input.item); + return output; +} + +HRESULT DeleteInventoryItemsResponse::FromJson(const JsonValue& input) +{ + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + String idempotencyId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdempotencyId", idempotencyId)); + this->SetIdempotencyId(std::move(idempotencyId)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t DeleteInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DeleteInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DeleteInventoryItemsResponse::RequiredBufferSize(const PFInventoryDeleteInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + if (model.idempotencyId) + { + requiredSize += (std::strlen(model.idempotencyId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT DeleteInventoryItemsResponse::Copy(const PFInventoryDeleteInventoryItemsResponse& input, PFInventoryDeleteInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.idempotencyId); + RETURN_IF_FAILED(propCopyResult.hr); + output.idempotencyId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue AddInventoryItemsOperation::ToJson() const +{ + return AddInventoryItemsOperation::ToJson(this->Model()); +} + +JsonValue AddInventoryItemsOperation::ToJson(const PFInventoryAddInventoryItemsOperation& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "DurationInSeconds", input.durationInSeconds); + JsonUtils::ObjectAddMember(output, "Item", input.item); + JsonUtils::ObjectAddMember(output, "NewStackValues", input.newStackValues); + return output; +} + +JsonValue DeleteInventoryItemsOperation::ToJson() const +{ + return DeleteInventoryItemsOperation::ToJson(this->Model()); +} + +JsonValue DeleteInventoryItemsOperation::ToJson(const PFInventoryDeleteInventoryItemsOperation& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Item", input.item); + return output; +} + +JsonValue PurchasePriceAmount::ToJson() const +{ + return PurchasePriceAmount::ToJson(this->Model()); +} + +JsonValue PurchasePriceAmount::ToJson(const PFInventoryPurchasePriceAmount& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "ItemId", input.itemId); + JsonUtils::ObjectAddMember(output, "StackId", input.stackId); + return output; +} + +JsonValue PurchaseInventoryItemsOperation::ToJson() const +{ + return PurchaseInventoryItemsOperation::ToJson(this->Model()); +} + +JsonValue PurchaseInventoryItemsOperation::ToJson(const PFInventoryPurchaseInventoryItemsOperation& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "DeleteEmptyStacks", input.deleteEmptyStacks); + JsonUtils::ObjectAddMember(output, "DurationInSeconds", input.durationInSeconds); + JsonUtils::ObjectAddMember(output, "Item", input.item); + JsonUtils::ObjectAddMember(output, "NewStackValues", input.newStackValues); + JsonUtils::ObjectAddMemberArray(output, "PriceAmounts", input.priceAmounts, input.priceAmountsCount); + JsonUtils::ObjectAddMember(output, "StoreId", input.storeId); + return output; +} + +JsonValue SubtractInventoryItemsOperation::ToJson() const +{ + return SubtractInventoryItemsOperation::ToJson(this->Model()); +} + +JsonValue SubtractInventoryItemsOperation::ToJson(const PFInventorySubtractInventoryItemsOperation& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "DeleteEmptyStacks", input.deleteEmptyStacks); + JsonUtils::ObjectAddMember(output, "DurationInSeconds", input.durationInSeconds); + JsonUtils::ObjectAddMember(output, "Item", input.item); + return output; +} + +JsonValue TransferInventoryItemsOperation::ToJson() const +{ + return TransferInventoryItemsOperation::ToJson(this->Model()); +} + +JsonValue TransferInventoryItemsOperation::ToJson(const PFInventoryTransferInventoryItemsOperation& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "DeleteEmptyStacks", input.deleteEmptyStacks); + JsonUtils::ObjectAddMember(output, "GivingItem", input.givingItem); + JsonUtils::ObjectAddMember(output, "NewStackValues", input.newStackValues); + JsonUtils::ObjectAddMember(output, "ReceivingItem", input.receivingItem); + return output; +} + +JsonValue InventoryItem::ToJson() const +{ + return InventoryItem::ToJson(this->Model()); +} + +JsonValue InventoryItem::ToJson(const PFInventoryInventoryItem& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "DisplayProperties", input.displayProperties); + JsonUtils::ObjectAddMemberTime(output, "ExpirationDate", input.expirationDate); + JsonUtils::ObjectAddMember(output, "Id", input.id); + JsonUtils::ObjectAddMember(output, "StackId", input.stackId); + JsonUtils::ObjectAddMember(output, "Type", input.type); + return output; +} + +HRESULT InventoryItem::FromJson(const JsonValue& input) +{ + std::optional amount{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Amount", amount)); + this->SetAmount(std::move(amount)); + + JsonObject displayProperties{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayProperties", displayProperties)); + this->SetDisplayProperties(std::move(displayProperties)); + + std::optional expirationDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "ExpirationDate", expirationDate)); + this->SetExpirationDate(std::move(expirationDate)); + + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String stackId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StackId", stackId)); + this->SetStackId(std::move(stackId)); + + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + return S_OK; +} + +size_t InventoryItem::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result InventoryItem::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t InventoryItem::RequiredBufferSize(const PFInventoryInventoryItem& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.amount) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.displayProperties.stringValue) + { + requiredSize += (std::strlen(model.displayProperties.stringValue) + 1); + } + if (model.expirationDate) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.stackId) + { + requiredSize += (std::strlen(model.stackId) + 1); + } + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + return requiredSize; +} + +HRESULT InventoryItem::Copy(const PFInventoryInventoryItem& input, PFInventoryInventoryItem& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.amount); + RETURN_IF_FAILED(propCopyResult.hr); + output.amount = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayProperties.stringValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayProperties.stringValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.expirationDate); + RETURN_IF_FAILED(propCopyResult.hr); + output.expirationDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.stackId); + RETURN_IF_FAILED(propCopyResult.hr); + output.stackId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue UpdateInventoryItemsOperation::ToJson() const +{ + return UpdateInventoryItemsOperation::ToJson(this->Model()); +} + +JsonValue UpdateInventoryItemsOperation::ToJson(const PFInventoryUpdateInventoryItemsOperation& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Item", input.item); + return output; +} + +JsonValue InventoryOperation::ToJson() const +{ + return InventoryOperation::ToJson(this->Model()); +} + +JsonValue InventoryOperation::ToJson(const PFInventoryInventoryOperation& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Add", input.add); + JsonUtils::ObjectAddMember(output, "Delete", input.deleteOp); + JsonUtils::ObjectAddMember(output, "Purchase", input.purchase); + JsonUtils::ObjectAddMember(output, "Subtract", input.subtract); + JsonUtils::ObjectAddMember(output, "Transfer", input.transfer); + JsonUtils::ObjectAddMember(output, "Update", input.update); + return output; +} + +JsonValue ExecuteInventoryOperationsRequest::ToJson() const +{ + return ExecuteInventoryOperationsRequest::ToJson(this->Model()); +} + +JsonValue ExecuteInventoryOperationsRequest::ToJson(const PFInventoryExecuteInventoryOperationsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "IdempotencyId", input.idempotencyId); + JsonUtils::ObjectAddMemberArray(output, "Operations", input.operations, input.operationsCount); + return output; +} + +HRESULT ExecuteInventoryOperationsResponse::FromJson(const JsonValue& input) +{ + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + String idempotencyId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdempotencyId", idempotencyId)); + this->SetIdempotencyId(std::move(idempotencyId)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t ExecuteInventoryOperationsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ExecuteInventoryOperationsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ExecuteInventoryOperationsResponse::RequiredBufferSize(const PFInventoryExecuteInventoryOperationsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + if (model.idempotencyId) + { + requiredSize += (std::strlen(model.idempotencyId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT ExecuteInventoryOperationsResponse::Copy(const PFInventoryExecuteInventoryOperationsResponse& input, PFInventoryExecuteInventoryOperationsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.idempotencyId); + RETURN_IF_FAILED(propCopyResult.hr); + output.idempotencyId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetInventoryCollectionIdsRequest::ToJson() const +{ + return GetInventoryCollectionIdsRequest::ToJson(this->Model()); +} + +JsonValue GetInventoryCollectionIdsRequest::ToJson(const PFInventoryGetInventoryCollectionIdsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMember(output, "Count", input.count); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT GetInventoryCollectionIdsResponse::FromJson(const JsonValue& input) +{ + CStringVector collectionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CollectionIds", collectionIds)); + this->SetCollectionIds(std::move(collectionIds)); + + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + return S_OK; +} + +size_t GetInventoryCollectionIdsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetInventoryCollectionIdsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetInventoryCollectionIdsResponse::RequiredBufferSize(const PFInventoryGetInventoryCollectionIdsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.collectionIdsCount); + for (size_t i = 0; i < model.collectionIdsCount; ++i) + { + requiredSize += (std::strlen(model.collectionIds[i]) + 1); + } + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + return requiredSize; +} + +HRESULT GetInventoryCollectionIdsResponse::Copy(const PFInventoryGetInventoryCollectionIdsResponse& input, PFInventoryGetInventoryCollectionIdsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.collectionIds, input.collectionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.collectionIds = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetInventoryItemsRequest::ToJson() const +{ + return GetInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue GetInventoryItemsRequest::ToJson(const PFInventoryGetInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMember(output, "Count", input.count); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Filter", input.filter); + return output; +} + +HRESULT GetInventoryItemsResponse::FromJson(const JsonValue& input) +{ + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + ModelVector items{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Items", items)); + this->SetItems(std::move(items)); + + return S_OK; +} + +size_t GetInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetInventoryItemsResponse::RequiredBufferSize(const PFInventoryGetInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + requiredSize += (alignof(PFInventoryInventoryItem*) + sizeof(PFInventoryInventoryItem*) * model.itemsCount); + for (size_t i = 0; i < model.itemsCount; ++i) + { + requiredSize += InventoryItem::RequiredBufferSize(*model.items[i]); + } + return requiredSize; +} + +HRESULT GetInventoryItemsResponse::Copy(const PFInventoryGetInventoryItemsResponse& input, PFInventoryGetInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.items, input.itemsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.items = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetMicrosoftStoreAccessTokensRequest::ToJson() const +{ + return GetMicrosoftStoreAccessTokensRequest::ToJson(this->Model()); +} + +JsonValue GetMicrosoftStoreAccessTokensRequest::ToJson(const PFInventoryGetMicrosoftStoreAccessTokensRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +HRESULT GetMicrosoftStoreAccessTokensResponse::FromJson(const JsonValue& input) +{ + String collectionsAccessToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CollectionsAccessToken", collectionsAccessToken)); + this->SetCollectionsAccessToken(std::move(collectionsAccessToken)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "CollectionsAccessTokenExpirationDate", this->m_model.collectionsAccessTokenExpirationDate)); + + return S_OK; +} + +size_t GetMicrosoftStoreAccessTokensResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetMicrosoftStoreAccessTokensResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetMicrosoftStoreAccessTokensResponse::RequiredBufferSize(const PFInventoryGetMicrosoftStoreAccessTokensResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.collectionsAccessToken) + { + requiredSize += (std::strlen(model.collectionsAccessToken) + 1); + } + return requiredSize; +} + +HRESULT GetMicrosoftStoreAccessTokensResponse::Copy(const PFInventoryGetMicrosoftStoreAccessTokensResponse& input, PFInventoryGetMicrosoftStoreAccessTokensResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.collectionsAccessToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.collectionsAccessToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetTransactionHistoryRequest::ToJson() const +{ + return GetTransactionHistoryRequest::ToJson(this->Model()); +} + +JsonValue GetTransactionHistoryRequest::ToJson(const PFInventoryGetTransactionHistoryRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMember(output, "Count", input.count); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Filter", input.filter); + return output; +} + +HRESULT TransactionOperation::FromJson(const JsonValue& input) +{ + std::optional amount{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Amount", amount)); + this->SetAmount(std::move(amount)); + + std::optional durationInSeconds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DurationInSeconds", durationInSeconds)); + this->SetDurationInSeconds(std::move(durationInSeconds)); + + String itemId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemId", itemId)); + this->SetItemId(std::move(itemId)); + + String itemType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemType", itemType)); + this->SetItemType(std::move(itemType)); + + String stackId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StackId", stackId)); + this->SetStackId(std::move(stackId)); + + String type{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Type", type)); + this->SetType(std::move(type)); + + return S_OK; +} + +size_t TransactionOperation::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TransactionOperation::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TransactionOperation::RequiredBufferSize(const PFInventoryTransactionOperation& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.amount) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.durationInSeconds) + { + requiredSize += (alignof(double) + sizeof(double)); + } + if (model.itemId) + { + requiredSize += (std::strlen(model.itemId) + 1); + } + if (model.itemType) + { + requiredSize += (std::strlen(model.itemType) + 1); + } + if (model.stackId) + { + requiredSize += (std::strlen(model.stackId) + 1); + } + if (model.type) + { + requiredSize += (std::strlen(model.type) + 1); + } + return requiredSize; +} + +HRESULT TransactionOperation::Copy(const PFInventoryTransactionOperation& input, PFInventoryTransactionOperation& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.amount); + RETURN_IF_FAILED(propCopyResult.hr); + output.amount = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.durationInSeconds); + RETURN_IF_FAILED(propCopyResult.hr); + output.durationInSeconds = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemId); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemType); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemType = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.stackId); + RETURN_IF_FAILED(propCopyResult.hr); + output.stackId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.type); + RETURN_IF_FAILED(propCopyResult.hr); + output.type = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT TransactionPurchaseDetails::FromJson(const JsonValue& input) +{ + String storeId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StoreId", storeId)); + this->SetStoreId(std::move(storeId)); + + return S_OK; +} + +size_t TransactionPurchaseDetails::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TransactionPurchaseDetails::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TransactionPurchaseDetails::RequiredBufferSize(const PFInventoryTransactionPurchaseDetails& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.storeId) + { + requiredSize += (std::strlen(model.storeId) + 1); + } + return requiredSize; +} + +HRESULT TransactionPurchaseDetails::Copy(const PFInventoryTransactionPurchaseDetails& input, PFInventoryTransactionPurchaseDetails& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.storeId); + RETURN_IF_FAILED(propCopyResult.hr); + output.storeId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT TransactionRedeemDetails::FromJson(const JsonValue& input) +{ + String marketplace{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Marketplace", marketplace)); + this->SetMarketplace(std::move(marketplace)); + + String marketplaceTransactionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MarketplaceTransactionId", marketplaceTransactionId)); + this->SetMarketplaceTransactionId(std::move(marketplaceTransactionId)); + + String offerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OfferId", offerId)); + this->SetOfferId(std::move(offerId)); + + return S_OK; +} + +size_t TransactionRedeemDetails::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TransactionRedeemDetails::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TransactionRedeemDetails::RequiredBufferSize(const PFInventoryTransactionRedeemDetails& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.marketplace) + { + requiredSize += (std::strlen(model.marketplace) + 1); + } + if (model.marketplaceTransactionId) + { + requiredSize += (std::strlen(model.marketplaceTransactionId) + 1); + } + if (model.offerId) + { + requiredSize += (std::strlen(model.offerId) + 1); + } + return requiredSize; +} + +HRESULT TransactionRedeemDetails::Copy(const PFInventoryTransactionRedeemDetails& input, PFInventoryTransactionRedeemDetails& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.marketplace); + RETURN_IF_FAILED(propCopyResult.hr); + output.marketplace = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.marketplaceTransactionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.marketplaceTransactionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.offerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.offerId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT TransactionTransferDetails::FromJson(const JsonValue& input) +{ + String givingCollectionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GivingCollectionId", givingCollectionId)); + this->SetGivingCollectionId(std::move(givingCollectionId)); + + std::optional givingEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GivingEntity", givingEntity)); + if (givingEntity) + { + this->SetGivingEntity(std::move(*givingEntity)); + } + + String receivingCollectionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReceivingCollectionId", receivingCollectionId)); + this->SetReceivingCollectionId(std::move(receivingCollectionId)); + + std::optional receivingEntity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReceivingEntity", receivingEntity)); + if (receivingEntity) + { + this->SetReceivingEntity(std::move(*receivingEntity)); + } + + String transferId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransferId", transferId)); + this->SetTransferId(std::move(transferId)); + + return S_OK; +} + +size_t TransactionTransferDetails::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TransactionTransferDetails::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TransactionTransferDetails::RequiredBufferSize(const PFInventoryTransactionTransferDetails& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.givingCollectionId) + { + requiredSize += (std::strlen(model.givingCollectionId) + 1); + } + if (model.givingEntity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.givingEntity); + } + if (model.receivingCollectionId) + { + requiredSize += (std::strlen(model.receivingCollectionId) + 1); + } + if (model.receivingEntity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.receivingEntity); + } + if (model.transferId) + { + requiredSize += (std::strlen(model.transferId) + 1); + } + return requiredSize; +} + +HRESULT TransactionTransferDetails::Copy(const PFInventoryTransactionTransferDetails& input, PFInventoryTransactionTransferDetails& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.givingCollectionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.givingCollectionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.givingEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.givingEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.receivingCollectionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.receivingCollectionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.receivingEntity); + RETURN_IF_FAILED(propCopyResult.hr); + output.receivingEntity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.transferId); + RETURN_IF_FAILED(propCopyResult.hr); + output.transferId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT Transaction::FromJson(const JsonValue& input) +{ + String apiName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ApiName", apiName)); + this->SetApiName(std::move(apiName)); + + String itemType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ItemType", itemType)); + this->SetItemType(std::move(itemType)); + + ModelVector operations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Operations", operations)); + this->SetOperations(std::move(operations)); + + String operationType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OperationType", operationType)); + this->SetOperationType(std::move(operationType)); + + std::optional purchaseDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PurchaseDetails", purchaseDetails)); + if (purchaseDetails) + { + this->SetPurchaseDetails(std::move(*purchaseDetails)); + } + + std::optional redeemDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RedeemDetails", redeemDetails)); + if (redeemDetails) + { + this->SetRedeemDetails(std::move(*redeemDetails)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Timestamp", this->m_model.timestamp)); + + String transactionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionId", transactionId)); + this->SetTransactionId(std::move(transactionId)); + + std::optional transferDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransferDetails", transferDetails)); + if (transferDetails) + { + this->SetTransferDetails(std::move(*transferDetails)); + } + + return S_OK; +} + +size_t Transaction::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Transaction::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Transaction::RequiredBufferSize(const PFInventoryTransaction& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.apiName) + { + requiredSize += (std::strlen(model.apiName) + 1); + } + if (model.itemType) + { + requiredSize += (std::strlen(model.itemType) + 1); + } + requiredSize += (alignof(PFInventoryTransactionOperation*) + sizeof(PFInventoryTransactionOperation*) * model.operationsCount); + for (size_t i = 0; i < model.operationsCount; ++i) + { + requiredSize += TransactionOperation::RequiredBufferSize(*model.operations[i]); + } + if (model.operationType) + { + requiredSize += (std::strlen(model.operationType) + 1); + } + if (model.purchaseDetails) + { + requiredSize += TransactionPurchaseDetails::RequiredBufferSize(*model.purchaseDetails); + } + if (model.redeemDetails) + { + requiredSize += TransactionRedeemDetails::RequiredBufferSize(*model.redeemDetails); + } + if (model.transactionId) + { + requiredSize += (std::strlen(model.transactionId) + 1); + } + if (model.transferDetails) + { + requiredSize += TransactionTransferDetails::RequiredBufferSize(*model.transferDetails); + } + return requiredSize; +} + +HRESULT Transaction::Copy(const PFInventoryTransaction& input, PFInventoryTransaction& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.apiName); + RETURN_IF_FAILED(propCopyResult.hr); + output.apiName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.itemType); + RETURN_IF_FAILED(propCopyResult.hr); + output.itemType = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.operations, input.operationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.operations = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.operationType); + RETURN_IF_FAILED(propCopyResult.hr); + output.operationType = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.purchaseDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.purchaseDetails = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.redeemDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.redeemDetails = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.transactionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.transferDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.transferDetails = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetTransactionHistoryResponse::FromJson(const JsonValue& input) +{ + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + ModelVector transactions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Transactions", transactions)); + this->SetTransactions(std::move(transactions)); + + return S_OK; +} + +size_t GetTransactionHistoryResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTransactionHistoryResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTransactionHistoryResponse::RequiredBufferSize(const PFInventoryGetTransactionHistoryResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + requiredSize += (alignof(PFInventoryTransaction*) + sizeof(PFInventoryTransaction*) * model.transactionsCount); + for (size_t i = 0; i < model.transactionsCount; ++i) + { + requiredSize += Transaction::RequiredBufferSize(*model.transactions[i]); + } + return requiredSize; +} + +HRESULT GetTransactionHistoryResponse::Copy(const PFInventoryGetTransactionHistoryResponse& input, PFInventoryGetTransactionHistoryResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactions, input.transactionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactions = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue PurchaseInventoryItemsRequest::ToJson() const +{ + return PurchaseInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue PurchaseInventoryItemsRequest::ToJson(const PFInventoryPurchaseInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DeleteEmptyStacks", input.deleteEmptyStacks); + JsonUtils::ObjectAddMember(output, "DurationInSeconds", input.durationInSeconds); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "IdempotencyId", input.idempotencyId); + JsonUtils::ObjectAddMember(output, "Item", input.item); + JsonUtils::ObjectAddMember(output, "NewStackValues", input.newStackValues); + JsonUtils::ObjectAddMemberArray(output, "PriceAmounts", input.priceAmounts, input.priceAmountsCount); + JsonUtils::ObjectAddMember(output, "StoreId", input.storeId); + return output; +} + +HRESULT PurchaseInventoryItemsResponse::FromJson(const JsonValue& input) +{ + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + String idempotencyId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdempotencyId", idempotencyId)); + this->SetIdempotencyId(std::move(idempotencyId)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t PurchaseInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PurchaseInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PurchaseInventoryItemsResponse::RequiredBufferSize(const PFInventoryPurchaseInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + if (model.idempotencyId) + { + requiredSize += (std::strlen(model.idempotencyId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT PurchaseInventoryItemsResponse::Copy(const PFInventoryPurchaseInventoryItemsResponse& input, PFInventoryPurchaseInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.idempotencyId); + RETURN_IF_FAILED(propCopyResult.hr); + output.idempotencyId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RedeemAppleAppStoreInventoryItemsRequest::ToJson() const +{ + return RedeemAppleAppStoreInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue RedeemAppleAppStoreInventoryItemsRequest::ToJson(const PFInventoryRedeemAppleAppStoreInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "Receipt", input.receipt); + return output; +} + +HRESULT RedemptionFailure::FromJson(const JsonValue& input) +{ + String failureCode{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FailureCode", failureCode)); + this->SetFailureCode(std::move(failureCode)); + + String failureDetails{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FailureDetails", failureDetails)); + this->SetFailureDetails(std::move(failureDetails)); + + String marketplaceTransactionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MarketplaceTransactionId", marketplaceTransactionId)); + this->SetMarketplaceTransactionId(std::move(marketplaceTransactionId)); + + String offerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OfferId", offerId)); + this->SetOfferId(std::move(offerId)); + + return S_OK; +} + +size_t RedemptionFailure::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedemptionFailure::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedemptionFailure::RequiredBufferSize(const PFInventoryRedemptionFailure& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.failureCode) + { + requiredSize += (std::strlen(model.failureCode) + 1); + } + if (model.failureDetails) + { + requiredSize += (std::strlen(model.failureDetails) + 1); + } + if (model.marketplaceTransactionId) + { + requiredSize += (std::strlen(model.marketplaceTransactionId) + 1); + } + if (model.offerId) + { + requiredSize += (std::strlen(model.offerId) + 1); + } + return requiredSize; +} + +HRESULT RedemptionFailure::Copy(const PFInventoryRedemptionFailure& input, PFInventoryRedemptionFailure& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.failureCode); + RETURN_IF_FAILED(propCopyResult.hr); + output.failureCode = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.failureDetails); + RETURN_IF_FAILED(propCopyResult.hr); + output.failureDetails = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.marketplaceTransactionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.marketplaceTransactionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.offerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.offerId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT RedemptionSuccess::FromJson(const JsonValue& input) +{ + String marketplaceTransactionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MarketplaceTransactionId", marketplaceTransactionId)); + this->SetMarketplaceTransactionId(std::move(marketplaceTransactionId)); + + String offerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OfferId", offerId)); + this->SetOfferId(std::move(offerId)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "SuccessTimestamp", this->m_model.successTimestamp)); + + return S_OK; +} + +size_t RedemptionSuccess::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedemptionSuccess::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedemptionSuccess::RequiredBufferSize(const PFInventoryRedemptionSuccess& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.marketplaceTransactionId) + { + requiredSize += (std::strlen(model.marketplaceTransactionId) + 1); + } + if (model.offerId) + { + requiredSize += (std::strlen(model.offerId) + 1); + } + return requiredSize; +} + +HRESULT RedemptionSuccess::Copy(const PFInventoryRedemptionSuccess& input, PFInventoryRedemptionSuccess& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.marketplaceTransactionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.marketplaceTransactionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.offerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.offerId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT RedeemAppleAppStoreInventoryItemsResponse::FromJson(const JsonValue& input) +{ + ModelVector failed{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Failed", failed)); + this->SetFailed(std::move(failed)); + + ModelVector succeeded{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Succeeded", succeeded)); + this->SetSucceeded(std::move(succeeded)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t RedeemAppleAppStoreInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedeemAppleAppStoreInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedeemAppleAppStoreInventoryItemsResponse::RequiredBufferSize(const PFInventoryRedeemAppleAppStoreInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFInventoryRedemptionFailure*) + sizeof(PFInventoryRedemptionFailure*) * model.failedCount); + for (size_t i = 0; i < model.failedCount; ++i) + { + requiredSize += RedemptionFailure::RequiredBufferSize(*model.failed[i]); + } + requiredSize += (alignof(PFInventoryRedemptionSuccess*) + sizeof(PFInventoryRedemptionSuccess*) * model.succeededCount); + for (size_t i = 0; i < model.succeededCount; ++i) + { + requiredSize += RedemptionSuccess::RequiredBufferSize(*model.succeeded[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT RedeemAppleAppStoreInventoryItemsResponse::Copy(const PFInventoryRedeemAppleAppStoreInventoryItemsResponse& input, PFInventoryRedeemAppleAppStoreInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.failed, input.failedCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.failed = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.succeeded, input.succeededCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.succeeded = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GooglePlayProductPurchase::ToJson() const +{ + return GooglePlayProductPurchase::ToJson(this->Model()); +} + +JsonValue GooglePlayProductPurchase::ToJson(const PFInventoryGooglePlayProductPurchase& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ProductId", input.productId); + JsonUtils::ObjectAddMember(output, "Token", input.token); + return output; +} + +JsonValue RedeemGooglePlayInventoryItemsRequest::ToJson() const +{ + return RedeemGooglePlayInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue RedeemGooglePlayInventoryItemsRequest::ToJson(const PFInventoryRedeemGooglePlayInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "Purchases", input.purchases, input.purchasesCount); + return output; +} + +HRESULT RedeemGooglePlayInventoryItemsResponse::FromJson(const JsonValue& input) +{ + ModelVector failed{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Failed", failed)); + this->SetFailed(std::move(failed)); + + ModelVector succeeded{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Succeeded", succeeded)); + this->SetSucceeded(std::move(succeeded)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t RedeemGooglePlayInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedeemGooglePlayInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedeemGooglePlayInventoryItemsResponse::RequiredBufferSize(const PFInventoryRedeemGooglePlayInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFInventoryRedemptionFailure*) + sizeof(PFInventoryRedemptionFailure*) * model.failedCount); + for (size_t i = 0; i < model.failedCount; ++i) + { + requiredSize += RedemptionFailure::RequiredBufferSize(*model.failed[i]); + } + requiredSize += (alignof(PFInventoryRedemptionSuccess*) + sizeof(PFInventoryRedemptionSuccess*) * model.succeededCount); + for (size_t i = 0; i < model.succeededCount; ++i) + { + requiredSize += RedemptionSuccess::RequiredBufferSize(*model.succeeded[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT RedeemGooglePlayInventoryItemsResponse::Copy(const PFInventoryRedeemGooglePlayInventoryItemsResponse& input, PFInventoryRedeemGooglePlayInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.failed, input.failedCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.failed = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.succeeded, input.succeededCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.succeeded = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RedeemMicrosoftStoreInventoryItemsRequest::ToJson() const +{ + return RedeemMicrosoftStoreInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue RedeemMicrosoftStoreInventoryItemsRequest::ToJson(const PFInventoryRedeemMicrosoftStoreInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMember(output, "CollectionsIdKey", input.collectionsIdKey); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); +#if HC_PLATFORM != HC_PLATFORM_GDK + JsonUtils::ObjectAddMember(output, "XboxToken", input.xboxToken); +#endif + return output; +} + +HRESULT RedeemMicrosoftStoreInventoryItemsResponse::FromJson(const JsonValue& input) +{ + ModelVector failed{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Failed", failed)); + this->SetFailed(std::move(failed)); + + ModelVector succeeded{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Succeeded", succeeded)); + this->SetSucceeded(std::move(succeeded)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t RedeemMicrosoftStoreInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedeemMicrosoftStoreInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedeemMicrosoftStoreInventoryItemsResponse::RequiredBufferSize(const PFInventoryRedeemMicrosoftStoreInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFInventoryRedemptionFailure*) + sizeof(PFInventoryRedemptionFailure*) * model.failedCount); + for (size_t i = 0; i < model.failedCount; ++i) + { + requiredSize += RedemptionFailure::RequiredBufferSize(*model.failed[i]); + } + requiredSize += (alignof(PFInventoryRedemptionSuccess*) + sizeof(PFInventoryRedemptionSuccess*) * model.succeededCount); + for (size_t i = 0; i < model.succeededCount; ++i) + { + requiredSize += RedemptionSuccess::RequiredBufferSize(*model.succeeded[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT RedeemMicrosoftStoreInventoryItemsResponse::Copy(const PFInventoryRedeemMicrosoftStoreInventoryItemsResponse& input, PFInventoryRedeemMicrosoftStoreInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.failed, input.failedCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.failed = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.succeeded, input.succeededCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.succeeded = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RedeemNintendoEShopInventoryItemsRequest::ToJson() const +{ + return RedeemNintendoEShopInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue RedeemNintendoEShopInventoryItemsRequest::ToJson(const PFInventoryRedeemNintendoEShopInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "NintendoServiceAccountIdToken", input.nintendoServiceAccountIdToken); + return output; +} + +HRESULT RedeemNintendoEShopInventoryItemsResponse::FromJson(const JsonValue& input) +{ + ModelVector failed{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Failed", failed)); + this->SetFailed(std::move(failed)); + + ModelVector succeeded{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Succeeded", succeeded)); + this->SetSucceeded(std::move(succeeded)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t RedeemNintendoEShopInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedeemNintendoEShopInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedeemNintendoEShopInventoryItemsResponse::RequiredBufferSize(const PFInventoryRedeemNintendoEShopInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFInventoryRedemptionFailure*) + sizeof(PFInventoryRedemptionFailure*) * model.failedCount); + for (size_t i = 0; i < model.failedCount; ++i) + { + requiredSize += RedemptionFailure::RequiredBufferSize(*model.failed[i]); + } + requiredSize += (alignof(PFInventoryRedemptionSuccess*) + sizeof(PFInventoryRedemptionSuccess*) * model.succeededCount); + for (size_t i = 0; i < model.succeededCount; ++i) + { + requiredSize += RedemptionSuccess::RequiredBufferSize(*model.succeeded[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT RedeemNintendoEShopInventoryItemsResponse::Copy(const PFInventoryRedeemNintendoEShopInventoryItemsResponse& input, PFInventoryRedeemNintendoEShopInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.failed, input.failedCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.failed = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.succeeded, input.succeededCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.succeeded = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RedeemPlayStationStoreInventoryItemsRequest::ToJson() const +{ + return RedeemPlayStationStoreInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue RedeemPlayStationStoreInventoryItemsRequest::ToJson(const PFInventoryRedeemPlayStationStoreInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AuthorizationCode", input.authorizationCode); + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "RedirectUri", input.redirectUri); + JsonUtils::ObjectAddMember(output, "ServiceLabel", input.serviceLabel); + return output; +} + +HRESULT RedeemPlayStationStoreInventoryItemsResponse::FromJson(const JsonValue& input) +{ + ModelVector failed{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Failed", failed)); + this->SetFailed(std::move(failed)); + + ModelVector succeeded{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Succeeded", succeeded)); + this->SetSucceeded(std::move(succeeded)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t RedeemPlayStationStoreInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedeemPlayStationStoreInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedeemPlayStationStoreInventoryItemsResponse::RequiredBufferSize(const PFInventoryRedeemPlayStationStoreInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFInventoryRedemptionFailure*) + sizeof(PFInventoryRedemptionFailure*) * model.failedCount); + for (size_t i = 0; i < model.failedCount; ++i) + { + requiredSize += RedemptionFailure::RequiredBufferSize(*model.failed[i]); + } + requiredSize += (alignof(PFInventoryRedemptionSuccess*) + sizeof(PFInventoryRedemptionSuccess*) * model.succeededCount); + for (size_t i = 0; i < model.succeededCount; ++i) + { + requiredSize += RedemptionSuccess::RequiredBufferSize(*model.succeeded[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT RedeemPlayStationStoreInventoryItemsResponse::Copy(const PFInventoryRedeemPlayStationStoreInventoryItemsResponse& input, PFInventoryRedeemPlayStationStoreInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.failed, input.failedCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.failed = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.succeeded, input.succeededCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.succeeded = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RedeemSteamInventoryItemsRequest::ToJson() const +{ + return RedeemSteamInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue RedeemSteamInventoryItemsRequest::ToJson(const PFInventoryRedeemSteamInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT RedeemSteamInventoryItemsResponse::FromJson(const JsonValue& input) +{ + ModelVector failed{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Failed", failed)); + this->SetFailed(std::move(failed)); + + ModelVector succeeded{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Succeeded", succeeded)); + this->SetSucceeded(std::move(succeeded)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t RedeemSteamInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RedeemSteamInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RedeemSteamInventoryItemsResponse::RequiredBufferSize(const PFInventoryRedeemSteamInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFInventoryRedemptionFailure*) + sizeof(PFInventoryRedemptionFailure*) * model.failedCount); + for (size_t i = 0; i < model.failedCount; ++i) + { + requiredSize += RedemptionFailure::RequiredBufferSize(*model.failed[i]); + } + requiredSize += (alignof(PFInventoryRedemptionSuccess*) + sizeof(PFInventoryRedemptionSuccess*) * model.succeededCount); + for (size_t i = 0; i < model.succeededCount; ++i) + { + requiredSize += RedemptionSuccess::RequiredBufferSize(*model.succeeded[i]); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT RedeemSteamInventoryItemsResponse::Copy(const PFInventoryRedeemSteamInventoryItemsResponse& input, PFInventoryRedeemSteamInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.failed, input.failedCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.failed = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.succeeded, input.succeededCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.succeeded = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SubtractInventoryItemsRequest::ToJson() const +{ + return SubtractInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue SubtractInventoryItemsRequest::ToJson(const PFInventorySubtractInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DeleteEmptyStacks", input.deleteEmptyStacks); + JsonUtils::ObjectAddMember(output, "DurationInSeconds", input.durationInSeconds); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "IdempotencyId", input.idempotencyId); + JsonUtils::ObjectAddMember(output, "Item", input.item); + return output; +} + +HRESULT SubtractInventoryItemsResponse::FromJson(const JsonValue& input) +{ + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + String idempotencyId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdempotencyId", idempotencyId)); + this->SetIdempotencyId(std::move(idempotencyId)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t SubtractInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SubtractInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SubtractInventoryItemsResponse::RequiredBufferSize(const PFInventorySubtractInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + if (model.idempotencyId) + { + requiredSize += (std::strlen(model.idempotencyId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT SubtractInventoryItemsResponse::Copy(const PFInventorySubtractInventoryItemsResponse& input, PFInventorySubtractInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.idempotencyId); + RETURN_IF_FAILED(propCopyResult.hr); + output.idempotencyId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue TransferInventoryItemsRequest::ToJson() const +{ + return TransferInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue TransferInventoryItemsRequest::ToJson(const PFInventoryTransferInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Amount", input.amount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DeleteEmptyStacks", input.deleteEmptyStacks); + JsonUtils::ObjectAddMember(output, "GivingCollectionId", input.givingCollectionId); + JsonUtils::ObjectAddMember(output, "GivingEntity", input.givingEntity); + JsonUtils::ObjectAddMember(output, "GivingETag", input.givingETag); + JsonUtils::ObjectAddMember(output, "GivingItem", input.givingItem); + JsonUtils::ObjectAddMember(output, "IdempotencyId", input.idempotencyId); + JsonUtils::ObjectAddMember(output, "NewStackValues", input.newStackValues); + JsonUtils::ObjectAddMember(output, "ReceivingCollectionId", input.receivingCollectionId); + JsonUtils::ObjectAddMember(output, "ReceivingEntity", input.receivingEntity); + JsonUtils::ObjectAddMember(output, "ReceivingItem", input.receivingItem); + return output; +} + +HRESULT TransferInventoryItemsResponse::FromJson(const JsonValue& input) +{ + String givingETag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GivingETag", givingETag)); + this->SetGivingETag(std::move(givingETag)); + + CStringVector givingTransactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "GivingTransactionIds", givingTransactionIds)); + this->SetGivingTransactionIds(std::move(givingTransactionIds)); + + String idempotencyId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdempotencyId", idempotencyId)); + this->SetIdempotencyId(std::move(idempotencyId)); + + CStringVector receivingTransactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ReceivingTransactionIds", receivingTransactionIds)); + this->SetReceivingTransactionIds(std::move(receivingTransactionIds)); + + return S_OK; +} + +size_t TransferInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TransferInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TransferInventoryItemsResponse::RequiredBufferSize(const PFInventoryTransferInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.givingETag) + { + requiredSize += (std::strlen(model.givingETag) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.givingTransactionIdsCount); + for (size_t i = 0; i < model.givingTransactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.givingTransactionIds[i]) + 1); + } + if (model.idempotencyId) + { + requiredSize += (std::strlen(model.idempotencyId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.receivingTransactionIdsCount); + for (size_t i = 0; i < model.receivingTransactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.receivingTransactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT TransferInventoryItemsResponse::Copy(const PFInventoryTransferInventoryItemsResponse& input, PFInventoryTransferInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.givingETag); + RETURN_IF_FAILED(propCopyResult.hr); + output.givingETag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.givingTransactionIds, input.givingTransactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.givingTransactionIds = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.idempotencyId); + RETURN_IF_FAILED(propCopyResult.hr); + output.idempotencyId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.receivingTransactionIds, input.receivingTransactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.receivingTransactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue UpdateInventoryItemsRequest::ToJson() const +{ + return UpdateInventoryItemsRequest::ToJson(this->Model()); +} + +JsonValue UpdateInventoryItemsRequest::ToJson(const PFInventoryUpdateInventoryItemsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "CollectionId", input.collectionId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ETag", input.eTag); + JsonUtils::ObjectAddMember(output, "IdempotencyId", input.idempotencyId); + JsonUtils::ObjectAddMember(output, "Item", input.item); + return output; +} + +HRESULT UpdateInventoryItemsResponse::FromJson(const JsonValue& input) +{ + String eTag{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ETag", eTag)); + this->SetETag(std::move(eTag)); + + String idempotencyId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IdempotencyId", idempotencyId)); + this->SetIdempotencyId(std::move(idempotencyId)); + + CStringVector transactionIds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TransactionIds", transactionIds)); + this->SetTransactionIds(std::move(transactionIds)); + + return S_OK; +} + +size_t UpdateInventoryItemsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateInventoryItemsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateInventoryItemsResponse::RequiredBufferSize(const PFInventoryUpdateInventoryItemsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.eTag) + { + requiredSize += (std::strlen(model.eTag) + 1); + } + if (model.idempotencyId) + { + requiredSize += (std::strlen(model.idempotencyId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.transactionIdsCount); + for (size_t i = 0; i < model.transactionIdsCount; ++i) + { + requiredSize += (std::strlen(model.transactionIds[i]) + 1); + } + return requiredSize; +} + +HRESULT UpdateInventoryItemsResponse::Copy(const PFInventoryUpdateInventoryItemsResponse& input, PFInventoryUpdateInventoryItemsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.eTag); + RETURN_IF_FAILED(propCopyResult.hr); + output.eTag = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.idempotencyId); + RETURN_IF_FAILED(propCopyResult.hr); + output.idempotencyId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.transactionIds, input.transactionIdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.transactionIds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Inventory +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/InventoryTypes.h b/Source/PlayFabServices/Source/Generated/InventoryTypes.h new file mode 100644 index 0000000..3ca942a --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/InventoryTypes.h @@ -0,0 +1,913 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Inventory +{ + +// Inventory Classes +class AlternateId : public Wrappers::PFInventoryAlternateIdWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryAlternateIdWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryAlternateId& input); +}; + +class InventoryItemReference : public Wrappers::PFInventoryInventoryItemReferenceWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryInventoryItemReferenceWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryInventoryItemReference& input); +}; + +class InitialValues : public Wrappers::PFInventoryInitialValuesWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryInitialValuesWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryInitialValues& input); +}; + +class AddInventoryItemsRequest : public Wrappers::PFInventoryAddInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryAddInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryAddInventoryItemsRequest& input); +}; + +class AddInventoryItemsResponse : public Wrappers::PFInventoryAddInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryAddInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryAddInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryAddInventoryItemsResponse& input, PFInventoryAddInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class DeleteInventoryCollectionRequest : public Wrappers::PFInventoryDeleteInventoryCollectionRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryDeleteInventoryCollectionRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryDeleteInventoryCollectionRequest& input); +}; + +class DeleteInventoryItemsRequest : public Wrappers::PFInventoryDeleteInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryDeleteInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryDeleteInventoryItemsRequest& input); +}; + +class DeleteInventoryItemsResponse : public Wrappers::PFInventoryDeleteInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryDeleteInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryDeleteInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryDeleteInventoryItemsResponse& input, PFInventoryDeleteInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class AddInventoryItemsOperation : public Wrappers::PFInventoryAddInventoryItemsOperationWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryAddInventoryItemsOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryAddInventoryItemsOperation& input); +}; + +class DeleteInventoryItemsOperation : public Wrappers::PFInventoryDeleteInventoryItemsOperationWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryDeleteInventoryItemsOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryDeleteInventoryItemsOperation& input); +}; + +class PurchasePriceAmount : public Wrappers::PFInventoryPurchasePriceAmountWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryPurchasePriceAmountWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryPurchasePriceAmount& input); +}; + +class PurchaseInventoryItemsOperation : public Wrappers::PFInventoryPurchaseInventoryItemsOperationWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryPurchaseInventoryItemsOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryPurchaseInventoryItemsOperation& input); +}; + +class SubtractInventoryItemsOperation : public Wrappers::PFInventorySubtractInventoryItemsOperationWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventorySubtractInventoryItemsOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventorySubtractInventoryItemsOperation& input); +}; + +class TransferInventoryItemsOperation : public Wrappers::PFInventoryTransferInventoryItemsOperationWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransferInventoryItemsOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryTransferInventoryItemsOperation& input); +}; + +class InventoryItem : public Wrappers::PFInventoryInventoryItemWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryInventoryItemWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryInventoryItem& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryInventoryItem& model); + static HRESULT Copy(const PFInventoryInventoryItem& input, PFInventoryInventoryItem& output, ModelBuffer& buffer); +}; + +class UpdateInventoryItemsOperation : public Wrappers::PFInventoryUpdateInventoryItemsOperationWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryUpdateInventoryItemsOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryUpdateInventoryItemsOperation& input); +}; + +class InventoryOperation : public Wrappers::PFInventoryInventoryOperationWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryInventoryOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryInventoryOperation& input); +}; + +class ExecuteInventoryOperationsRequest : public Wrappers::PFInventoryExecuteInventoryOperationsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryExecuteInventoryOperationsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryExecuteInventoryOperationsRequest& input); +}; + +class ExecuteInventoryOperationsResponse : public Wrappers::PFInventoryExecuteInventoryOperationsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryExecuteInventoryOperationsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryExecuteInventoryOperationsResponse& model); + static HRESULT Copy(const PFInventoryExecuteInventoryOperationsResponse& input, PFInventoryExecuteInventoryOperationsResponse& output, ModelBuffer& buffer); +}; + +class GetInventoryCollectionIdsRequest : public Wrappers::PFInventoryGetInventoryCollectionIdsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetInventoryCollectionIdsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryGetInventoryCollectionIdsRequest& input); +}; + +class GetInventoryCollectionIdsResponse : public Wrappers::PFInventoryGetInventoryCollectionIdsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetInventoryCollectionIdsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryGetInventoryCollectionIdsResponse& model); + static HRESULT Copy(const PFInventoryGetInventoryCollectionIdsResponse& input, PFInventoryGetInventoryCollectionIdsResponse& output, ModelBuffer& buffer); +}; + +class GetInventoryItemsRequest : public Wrappers::PFInventoryGetInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryGetInventoryItemsRequest& input); +}; + +class GetInventoryItemsResponse : public Wrappers::PFInventoryGetInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryGetInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryGetInventoryItemsResponse& input, PFInventoryGetInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class GetMicrosoftStoreAccessTokensRequest : public Wrappers::PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryGetMicrosoftStoreAccessTokensRequest& input); +}; + +class GetMicrosoftStoreAccessTokensResponse : public Wrappers::PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryGetMicrosoftStoreAccessTokensResponse& model); + static HRESULT Copy(const PFInventoryGetMicrosoftStoreAccessTokensResponse& input, PFInventoryGetMicrosoftStoreAccessTokensResponse& output, ModelBuffer& buffer); +}; + +class GetTransactionHistoryRequest : public Wrappers::PFInventoryGetTransactionHistoryRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetTransactionHistoryRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryGetTransactionHistoryRequest& input); +}; + +class TransactionOperation : public Wrappers::PFInventoryTransactionOperationWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransactionOperationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryTransactionOperation& model); + static HRESULT Copy(const PFInventoryTransactionOperation& input, PFInventoryTransactionOperation& output, ModelBuffer& buffer); +}; + +class TransactionPurchaseDetails : public Wrappers::PFInventoryTransactionPurchaseDetailsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransactionPurchaseDetailsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryTransactionPurchaseDetails& model); + static HRESULT Copy(const PFInventoryTransactionPurchaseDetails& input, PFInventoryTransactionPurchaseDetails& output, ModelBuffer& buffer); +}; + +class TransactionRedeemDetails : public Wrappers::PFInventoryTransactionRedeemDetailsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransactionRedeemDetailsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryTransactionRedeemDetails& model); + static HRESULT Copy(const PFInventoryTransactionRedeemDetails& input, PFInventoryTransactionRedeemDetails& output, ModelBuffer& buffer); +}; + +class TransactionTransferDetails : public Wrappers::PFInventoryTransactionTransferDetailsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransactionTransferDetailsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryTransactionTransferDetails& model); + static HRESULT Copy(const PFInventoryTransactionTransferDetails& input, PFInventoryTransactionTransferDetails& output, ModelBuffer& buffer); +}; + +class Transaction : public Wrappers::PFInventoryTransactionWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransactionWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryTransaction& model); + static HRESULT Copy(const PFInventoryTransaction& input, PFInventoryTransaction& output, ModelBuffer& buffer); +}; + +class GetTransactionHistoryResponse : public Wrappers::PFInventoryGetTransactionHistoryResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGetTransactionHistoryResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryGetTransactionHistoryResponse& model); + static HRESULT Copy(const PFInventoryGetTransactionHistoryResponse& input, PFInventoryGetTransactionHistoryResponse& output, ModelBuffer& buffer); +}; + +class PurchaseInventoryItemsRequest : public Wrappers::PFInventoryPurchaseInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryPurchaseInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryPurchaseInventoryItemsRequest& input); +}; + +class PurchaseInventoryItemsResponse : public Wrappers::PFInventoryPurchaseInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryPurchaseInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryPurchaseInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryPurchaseInventoryItemsResponse& input, PFInventoryPurchaseInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class RedeemAppleAppStoreInventoryItemsRequest : public Wrappers::PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryRedeemAppleAppStoreInventoryItemsRequest& input); +}; + +class RedemptionFailure : public Wrappers::PFInventoryRedemptionFailureWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedemptionFailureWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedemptionFailure& model); + static HRESULT Copy(const PFInventoryRedemptionFailure& input, PFInventoryRedemptionFailure& output, ModelBuffer& buffer); +}; + +class RedemptionSuccess : public Wrappers::PFInventoryRedemptionSuccessWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedemptionSuccessWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedemptionSuccess& model); + static HRESULT Copy(const PFInventoryRedemptionSuccess& input, PFInventoryRedemptionSuccess& output, ModelBuffer& buffer); +}; + +class RedeemAppleAppStoreInventoryItemsResponse : public Wrappers::PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedeemAppleAppStoreInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryRedeemAppleAppStoreInventoryItemsResponse& input, PFInventoryRedeemAppleAppStoreInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class GooglePlayProductPurchase : public Wrappers::PFInventoryGooglePlayProductPurchaseWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryGooglePlayProductPurchaseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryGooglePlayProductPurchase& input); +}; + +class RedeemGooglePlayInventoryItemsRequest : public Wrappers::PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryRedeemGooglePlayInventoryItemsRequest& input); +}; + +class RedeemGooglePlayInventoryItemsResponse : public Wrappers::PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedeemGooglePlayInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryRedeemGooglePlayInventoryItemsResponse& input, PFInventoryRedeemGooglePlayInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class RedeemMicrosoftStoreInventoryItemsRequest : public Wrappers::PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryRedeemMicrosoftStoreInventoryItemsRequest& input); +}; + +class RedeemMicrosoftStoreInventoryItemsResponse : public Wrappers::PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedeemMicrosoftStoreInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryRedeemMicrosoftStoreInventoryItemsResponse& input, PFInventoryRedeemMicrosoftStoreInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class RedeemNintendoEShopInventoryItemsRequest : public Wrappers::PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryRedeemNintendoEShopInventoryItemsRequest& input); +}; + +class RedeemNintendoEShopInventoryItemsResponse : public Wrappers::PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedeemNintendoEShopInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryRedeemNintendoEShopInventoryItemsResponse& input, PFInventoryRedeemNintendoEShopInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class RedeemPlayStationStoreInventoryItemsRequest : public Wrappers::PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryRedeemPlayStationStoreInventoryItemsRequest& input); +}; + +class RedeemPlayStationStoreInventoryItemsResponse : public Wrappers::PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedeemPlayStationStoreInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryRedeemPlayStationStoreInventoryItemsResponse& input, PFInventoryRedeemPlayStationStoreInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class RedeemSteamInventoryItemsRequest : public Wrappers::PFInventoryRedeemSteamInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemSteamInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryRedeemSteamInventoryItemsRequest& input); +}; + +class RedeemSteamInventoryItemsResponse : public Wrappers::PFInventoryRedeemSteamInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryRedeemSteamInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryRedeemSteamInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryRedeemSteamInventoryItemsResponse& input, PFInventoryRedeemSteamInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class SubtractInventoryItemsRequest : public Wrappers::PFInventorySubtractInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventorySubtractInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventorySubtractInventoryItemsRequest& input); +}; + +class SubtractInventoryItemsResponse : public Wrappers::PFInventorySubtractInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventorySubtractInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventorySubtractInventoryItemsResponse& model); + static HRESULT Copy(const PFInventorySubtractInventoryItemsResponse& input, PFInventorySubtractInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class TransferInventoryItemsRequest : public Wrappers::PFInventoryTransferInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransferInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryTransferInventoryItemsRequest& input); +}; + +class TransferInventoryItemsResponse : public Wrappers::PFInventoryTransferInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryTransferInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryTransferInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryTransferInventoryItemsResponse& input, PFInventoryTransferInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +class UpdateInventoryItemsRequest : public Wrappers::PFInventoryUpdateInventoryItemsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryUpdateInventoryItemsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFInventoryUpdateInventoryItemsRequest& input); +}; + +class UpdateInventoryItemsResponse : public Wrappers::PFInventoryUpdateInventoryItemsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFInventoryUpdateInventoryItemsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFInventoryUpdateInventoryItemsResponse& model); + static HRESULT Copy(const PFInventoryUpdateInventoryItemsResponse& input, PFInventoryUpdateInventoryItemsResponse& output, ModelBuffer& buffer); +}; + +} // namespace Inventory +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Localization.cpp b/Source/PlayFabServices/Source/Generated/Localization.cpp new file mode 100644 index 0000000..933386f --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Localization.cpp @@ -0,0 +1,47 @@ +#include "stdafx.h" +#include "Localization.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Localization +{ + + +AsyncOp LocalizationAPI::GetLanguageList( + Entity const& entity, + const GetLanguageListRequest& request, + RunContext rc +) +{ + const char* path{ "/Locale/GetLanguageList" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::LocalizationGetLanguageList, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetLanguageListResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Localization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Localization.h b/Source/PlayFabServices/Source/Generated/Localization.h new file mode 100644 index 0000000..2fe28e8 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Localization.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include "LocalizationTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Localization +{ + +class LocalizationAPI +{ +public: + LocalizationAPI() = delete; + LocalizationAPI(const LocalizationAPI& source) = delete; + LocalizationAPI& operator=(const LocalizationAPI& source) = delete; + ~LocalizationAPI() = default; + + // ------------ Generated API calls + static AsyncOp GetLanguageList(Entity const& entity, const GetLanguageListRequest& request, RunContext rc); +}; + +} // namespace Localization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/LocalizationTypes.cpp b/Source/PlayFabServices/Source/Generated/LocalizationTypes.cpp new file mode 100644 index 0000000..671fd1e --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/LocalizationTypes.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "LocalizationTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Localization +{ + +JsonValue GetLanguageListRequest::ToJson() const +{ + return GetLanguageListRequest::ToJson(this->Model()); +} + +JsonValue GetLanguageListRequest::ToJson(const PFLocalizationGetLanguageListRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + return output; +} + +HRESULT GetLanguageListResponse::FromJson(const JsonValue& input) +{ + CStringVector languageList{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "LanguageList", languageList)); + this->SetLanguageList(std::move(languageList)); + + return S_OK; +} + +size_t GetLanguageListResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetLanguageListResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetLanguageListResponse::RequiredBufferSize(const PFLocalizationGetLanguageListResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(char*) + sizeof(char*) * model.languageListCount); + for (size_t i = 0; i < model.languageListCount; ++i) + { + requiredSize += (std::strlen(model.languageList[i]) + 1); + } + return requiredSize; +} + +HRESULT GetLanguageListResponse::Copy(const PFLocalizationGetLanguageListResponse& input, PFLocalizationGetLanguageListResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.languageList, input.languageListCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.languageList = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Localization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/LocalizationTypes.h b/Source/PlayFabServices/Source/Generated/LocalizationTypes.h new file mode 100644 index 0000000..5e631a4 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/LocalizationTypes.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Localization +{ + +// Localization Classes +class GetLanguageListRequest : public Wrappers::PFLocalizationGetLanguageListRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFLocalizationGetLanguageListRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFLocalizationGetLanguageListRequest& input); +}; + +class GetLanguageListResponse : public Wrappers::PFLocalizationGetLanguageListResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFLocalizationGetLanguageListResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFLocalizationGetLanguageListResponse& model); + static HRESULT Copy(const PFLocalizationGetLanguageListResponse& input, PFLocalizationGetLanguageListResponse& output, ModelBuffer& buffer); +}; + +} // namespace Localization +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/MultiplayerServer.cpp b/Source/PlayFabServices/Source/Generated/MultiplayerServer.cpp new file mode 100644 index 0000000..2020fec --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/MultiplayerServer.cpp @@ -0,0 +1,152 @@ +#include "stdafx.h" +#include "MultiplayerServer.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace MultiplayerServer +{ + + +AsyncOp MultiplayerServerAPI::ListBuildAliases( + Entity const& entity, + const ListBuildAliasesRequest& request, + RunContext rc +) +{ + const char* path{ "/MultiplayerServer/ListBuildAliases" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::MultiplayerServerListBuildAliases, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListBuildAliasesResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp MultiplayerServerAPI::ListBuildSummariesV2( + Entity const& entity, + const ListBuildSummariesRequest& request, + RunContext rc +) +{ + const char* path{ "/MultiplayerServer/ListBuildSummariesV2" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::MultiplayerServerListBuildSummariesV2, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListBuildSummariesResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp MultiplayerServerAPI::ListQosServersForTitle( + Entity const& entity, + const ListQosServersForTitleRequest& request, + RunContext rc +) +{ + const char* path{ "/MultiplayerServer/ListQosServersForTitle" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::MultiplayerServerListQosServersForTitle, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ListQosServersForTitleResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp MultiplayerServerAPI::RequestMultiplayerServer( + Entity const& entity, + const RequestMultiplayerServerRequest& request, + RunContext rc +) +{ + const char* path{ "/MultiplayerServer/RequestMultiplayerServer" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::MultiplayerServerRequestMultiplayerServer, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + RequestMultiplayerServerResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace MultiplayerServer +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/MultiplayerServer.h b/Source/PlayFabServices/Source/Generated/MultiplayerServer.h new file mode 100644 index 0000000..4b7a910 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/MultiplayerServer.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include "MultiplayerServerTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace MultiplayerServer +{ + +class MultiplayerServerAPI +{ +public: + MultiplayerServerAPI() = delete; + MultiplayerServerAPI(const MultiplayerServerAPI& source) = delete; + MultiplayerServerAPI& operator=(const MultiplayerServerAPI& source) = delete; + ~MultiplayerServerAPI() = default; + + // ------------ Generated API calls + static AsyncOp ListBuildAliases(Entity const& entity, const ListBuildAliasesRequest& request, RunContext rc); + static AsyncOp ListBuildSummariesV2(Entity const& entity, const ListBuildSummariesRequest& request, RunContext rc); + static AsyncOp ListQosServersForTitle(Entity const& entity, const ListQosServersForTitleRequest& request, RunContext rc); + static AsyncOp RequestMultiplayerServer(Entity const& entity, const RequestMultiplayerServerRequest& request, RunContext rc); +}; + +} // namespace MultiplayerServer +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.cpp b/Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.cpp new file mode 100644 index 0000000..98e583e --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.cpp @@ -0,0 +1,1193 @@ +#include "stdafx.h" +#include "MultiplayerServerTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace MultiplayerServer +{ + +JsonValue ListBuildAliasesRequest::ToJson() const +{ + return ListBuildAliasesRequest::ToJson(this->Model()); +} + +JsonValue ListBuildAliasesRequest::ToJson(const PFMultiplayerServerListBuildAliasesRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PageSize", input.pageSize); + JsonUtils::ObjectAddMember(output, "SkipToken", input.skipToken); + return output; +} + +HRESULT BuildSelectionCriterion::FromJson(const JsonValue& input) +{ + DictionaryEntryVector buildWeightDistribution{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BuildWeightDistribution", buildWeightDistribution)); + this->SetBuildWeightDistribution(std::move(buildWeightDistribution)); + + return S_OK; +} + +size_t BuildSelectionCriterion::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result BuildSelectionCriterion::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t BuildSelectionCriterion::RequiredBufferSize(const PFMultiplayerServerBuildSelectionCriterion& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFUint32DictionaryEntry) + sizeof(PFUint32DictionaryEntry) * model.buildWeightDistributionCount); + for (size_t i = 0; i < model.buildWeightDistributionCount; ++i) + { + requiredSize += (std::strlen(model.buildWeightDistribution[i].key) + 1); + } + return requiredSize; +} + +HRESULT BuildSelectionCriterion::Copy(const PFMultiplayerServerBuildSelectionCriterion& input, PFMultiplayerServerBuildSelectionCriterion& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToDictionary(input.buildWeightDistribution, input.buildWeightDistributionCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.buildWeightDistribution = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT BuildAliasDetailsResponse::FromJson(const JsonValue& input) +{ + String aliasId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AliasId", aliasId)); + this->SetAliasId(std::move(aliasId)); + + String aliasName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AliasName", aliasName)); + this->SetAliasName(std::move(aliasName)); + + ModelVector buildSelectionCriteria{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BuildSelectionCriteria", buildSelectionCriteria)); + this->SetBuildSelectionCriteria(std::move(buildSelectionCriteria)); + + return S_OK; +} + +size_t BuildAliasDetailsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result BuildAliasDetailsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t BuildAliasDetailsResponse::RequiredBufferSize(const PFMultiplayerServerBuildAliasDetailsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.aliasId) + { + requiredSize += (std::strlen(model.aliasId) + 1); + } + if (model.aliasName) + { + requiredSize += (std::strlen(model.aliasName) + 1); + } + requiredSize += (alignof(PFMultiplayerServerBuildSelectionCriterion*) + sizeof(PFMultiplayerServerBuildSelectionCriterion*) * model.buildSelectionCriteriaCount); + for (size_t i = 0; i < model.buildSelectionCriteriaCount; ++i) + { + requiredSize += BuildSelectionCriterion::RequiredBufferSize(*model.buildSelectionCriteria[i]); + } + return requiredSize; +} + +HRESULT BuildAliasDetailsResponse::Copy(const PFMultiplayerServerBuildAliasDetailsResponse& input, PFMultiplayerServerBuildAliasDetailsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.aliasId); + RETURN_IF_FAILED(propCopyResult.hr); + output.aliasId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.aliasName); + RETURN_IF_FAILED(propCopyResult.hr); + output.aliasName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.buildSelectionCriteria, input.buildSelectionCriteriaCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.buildSelectionCriteria = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListBuildAliasesResponse::FromJson(const JsonValue& input) +{ + ModelVector buildAliases{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BuildAliases", buildAliases)); + this->SetBuildAliases(std::move(buildAliases)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PageSize", this->m_model.pageSize)); + + String skipToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SkipToken", skipToken)); + this->SetSkipToken(std::move(skipToken)); + + return S_OK; +} + +size_t ListBuildAliasesResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListBuildAliasesResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListBuildAliasesResponse::RequiredBufferSize(const PFMultiplayerServerListBuildAliasesResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFMultiplayerServerBuildAliasDetailsResponse*) + sizeof(PFMultiplayerServerBuildAliasDetailsResponse*) * model.buildAliasesCount); + for (size_t i = 0; i < model.buildAliasesCount; ++i) + { + requiredSize += BuildAliasDetailsResponse::RequiredBufferSize(*model.buildAliases[i]); + } + if (model.skipToken) + { + requiredSize += (std::strlen(model.skipToken) + 1); + } + return requiredSize; +} + +HRESULT ListBuildAliasesResponse::Copy(const PFMultiplayerServerListBuildAliasesResponse& input, PFMultiplayerServerListBuildAliasesResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.buildAliases, input.buildAliasesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.buildAliases = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.skipToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.skipToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListBuildSummariesRequest::ToJson() const +{ + return ListBuildSummariesRequest::ToJson(this->Model()); +} + +JsonValue ListBuildSummariesRequest::ToJson(const PFMultiplayerServerListBuildSummariesRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PageSize", input.pageSize); + JsonUtils::ObjectAddMember(output, "SkipToken", input.skipToken); + return output; +} + +HRESULT CurrentServerStats::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Active", this->m_model.active)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Propping", this->m_model.propping)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StandingBy", this->m_model.standingBy)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Total", this->m_model.total)); + + return S_OK; +} + +size_t CurrentServerStats::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result CurrentServerStats::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t CurrentServerStats::RequiredBufferSize(const PFMultiplayerServerCurrentServerStats& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT CurrentServerStats::Copy(const PFMultiplayerServerCurrentServerStats& input, PFMultiplayerServerCurrentServerStats& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +HRESULT DynamicStandbyThreshold::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Multiplier", this->m_model.multiplier)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TriggerThresholdPercentage", this->m_model.triggerThresholdPercentage)); + + return S_OK; +} + +size_t DynamicStandbyThreshold::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DynamicStandbyThreshold::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DynamicStandbyThreshold::RequiredBufferSize(const PFMultiplayerServerDynamicStandbyThreshold& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT DynamicStandbyThreshold::Copy(const PFMultiplayerServerDynamicStandbyThreshold& input, PFMultiplayerServerDynamicStandbyThreshold& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +HRESULT DynamicStandbySettings::FromJson(const JsonValue& input) +{ + ModelVector dynamicFloorMultiplierThresholds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DynamicFloorMultiplierThresholds", dynamicFloorMultiplierThresholds)); + this->SetDynamicFloorMultiplierThresholds(std::move(dynamicFloorMultiplierThresholds)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsEnabled", this->m_model.isEnabled)); + + std::optional rampDownSeconds{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RampDownSeconds", rampDownSeconds)); + this->SetRampDownSeconds(std::move(rampDownSeconds)); + + return S_OK; +} + +size_t DynamicStandbySettings::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result DynamicStandbySettings::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t DynamicStandbySettings::RequiredBufferSize(const PFMultiplayerServerDynamicStandbySettings& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFMultiplayerServerDynamicStandbyThreshold*) + sizeof(PFMultiplayerServerDynamicStandbyThreshold*) * model.dynamicFloorMultiplierThresholdsCount); + for (size_t i = 0; i < model.dynamicFloorMultiplierThresholdsCount; ++i) + { + requiredSize += DynamicStandbyThreshold::RequiredBufferSize(*model.dynamicFloorMultiplierThresholds[i]); + } + if (model.rampDownSeconds) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + return requiredSize; +} + +HRESULT DynamicStandbySettings::Copy(const PFMultiplayerServerDynamicStandbySettings& input, PFMultiplayerServerDynamicStandbySettings& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.dynamicFloorMultiplierThresholds, input.dynamicFloorMultiplierThresholdsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.dynamicFloorMultiplierThresholds = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.rampDownSeconds); + RETURN_IF_FAILED(propCopyResult.hr); + output.rampDownSeconds = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT Schedule::FromJson(const JsonValue& input) +{ + String description{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Description", description)); + this->SetDescription(std::move(description)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "EndTime", this->m_model.endTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsDisabled", this->m_model.isDisabled)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsRecurringWeekly", this->m_model.isRecurringWeekly)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "StartTime", this->m_model.startTime)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TargetStandby", this->m_model.targetStandby)); + + return S_OK; +} + +size_t Schedule::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Schedule::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Schedule::RequiredBufferSize(const PFMultiplayerServerSchedule& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.description) + { + requiredSize += (std::strlen(model.description) + 1); + } + return requiredSize; +} + +HRESULT Schedule::Copy(const PFMultiplayerServerSchedule& input, PFMultiplayerServerSchedule& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.description); + RETURN_IF_FAILED(propCopyResult.hr); + output.description = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ScheduledStandbySettings::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsEnabled", this->m_model.isEnabled)); + + ModelVector scheduleList{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ScheduleList", scheduleList)); + this->SetScheduleList(std::move(scheduleList)); + + return S_OK; +} + +size_t ScheduledStandbySettings::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ScheduledStandbySettings::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ScheduledStandbySettings::RequiredBufferSize(const PFMultiplayerServerScheduledStandbySettings& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFMultiplayerServerSchedule*) + sizeof(PFMultiplayerServerSchedule*) * model.scheduleListCount); + for (size_t i = 0; i < model.scheduleListCount; ++i) + { + requiredSize += Schedule::RequiredBufferSize(*model.scheduleList[i]); + } + return requiredSize; +} + +HRESULT ScheduledStandbySettings::Copy(const PFMultiplayerServerScheduledStandbySettings& input, PFMultiplayerServerScheduledStandbySettings& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.scheduleList, input.scheduleListCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.scheduleList = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT BuildRegion::FromJson(const JsonValue& input) +{ + std::optional currentServerStats{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CurrentServerStats", currentServerStats)); + if (currentServerStats) + { + this->SetCurrentServerStats(std::move(*currentServerStats)); + } + + std::optional dynamicStandbySettings{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DynamicStandbySettings", dynamicStandbySettings)); + if (dynamicStandbySettings) + { + this->SetDynamicStandbySettings(std::move(*dynamicStandbySettings)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IsAssetReplicationComplete", this->m_model.isAssetReplicationComplete)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MaxServers", this->m_model.maxServers)); + + std::optional multiplayerServerCountPerVm{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "MultiplayerServerCountPerVm", multiplayerServerCountPerVm)); + this->SetMultiplayerServerCountPerVm(std::move(multiplayerServerCountPerVm)); + + String region{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Region", region)); + this->SetRegion(std::move(region)); + + std::optional scheduledStandbySettings{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ScheduledStandbySettings", scheduledStandbySettings)); + if (scheduledStandbySettings) + { + this->SetScheduledStandbySettings(std::move(*scheduledStandbySettings)); + } + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StandbyServers", this->m_model.standbyServers)); + + String status{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Status", status)); + this->SetStatus(std::move(status)); + + std::optional vmSize{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VmSize", vmSize)); + this->SetVmSize(std::move(vmSize)); + + return S_OK; +} + +size_t BuildRegion::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result BuildRegion::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t BuildRegion::RequiredBufferSize(const PFMultiplayerServerBuildRegion& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.currentServerStats) + { + requiredSize += CurrentServerStats::RequiredBufferSize(*model.currentServerStats); + } + if (model.dynamicStandbySettings) + { + requiredSize += DynamicStandbySettings::RequiredBufferSize(*model.dynamicStandbySettings); + } + if (model.multiplayerServerCountPerVm) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + if (model.region) + { + requiredSize += (std::strlen(model.region) + 1); + } + if (model.scheduledStandbySettings) + { + requiredSize += ScheduledStandbySettings::RequiredBufferSize(*model.scheduledStandbySettings); + } + if (model.status) + { + requiredSize += (std::strlen(model.status) + 1); + } + if (model.vmSize) + { + requiredSize += (alignof(PFMultiplayerServerAzureVmSize) + sizeof(PFMultiplayerServerAzureVmSize)); + } + return requiredSize; +} + +HRESULT BuildRegion::Copy(const PFMultiplayerServerBuildRegion& input, PFMultiplayerServerBuildRegion& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.currentServerStats); + RETURN_IF_FAILED(propCopyResult.hr); + output.currentServerStats = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.dynamicStandbySettings); + RETURN_IF_FAILED(propCopyResult.hr); + output.dynamicStandbySettings = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.multiplayerServerCountPerVm); + RETURN_IF_FAILED(propCopyResult.hr); + output.multiplayerServerCountPerVm = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.region); + RETURN_IF_FAILED(propCopyResult.hr); + output.region = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.scheduledStandbySettings); + RETURN_IF_FAILED(propCopyResult.hr); + output.scheduledStandbySettings = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.status); + RETURN_IF_FAILED(propCopyResult.hr); + output.status = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.vmSize); + RETURN_IF_FAILED(propCopyResult.hr); + output.vmSize = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT BuildSummary::FromJson(const JsonValue& input) +{ + String buildId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BuildId", buildId)); + this->SetBuildId(std::move(buildId)); + + String buildName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BuildName", buildName)); + this->SetBuildName(std::move(buildName)); + + std::optional creationTime{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "CreationTime", creationTime)); + this->SetCreationTime(std::move(creationTime)); + + StringDictionaryEntryVector metadata{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Metadata", metadata)); + this->SetMetadata(std::move(metadata)); + + ModelVector regionConfigurations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RegionConfigurations", regionConfigurations)); + this->SetRegionConfigurations(std::move(regionConfigurations)); + + return S_OK; +} + +size_t BuildSummary::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result BuildSummary::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t BuildSummary::RequiredBufferSize(const PFMultiplayerServerBuildSummary& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.buildId) + { + requiredSize += (std::strlen(model.buildId) + 1); + } + if (model.buildName) + { + requiredSize += (std::strlen(model.buildName) + 1); + } + if (model.creationTime) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.metadataCount); + for (size_t i = 0; i < model.metadataCount; ++i) + { + requiredSize += (std::strlen(model.metadata[i].key) + 1); + requiredSize += (std::strlen(model.metadata[i].value) + 1); + } + requiredSize += (alignof(PFMultiplayerServerBuildRegion*) + sizeof(PFMultiplayerServerBuildRegion*) * model.regionConfigurationsCount); + for (size_t i = 0; i < model.regionConfigurationsCount; ++i) + { + requiredSize += BuildRegion::RequiredBufferSize(*model.regionConfigurations[i]); + } + return requiredSize; +} + +HRESULT BuildSummary::Copy(const PFMultiplayerServerBuildSummary& input, PFMultiplayerServerBuildSummary& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.buildId); + RETURN_IF_FAILED(propCopyResult.hr); + output.buildId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.buildName); + RETURN_IF_FAILED(propCopyResult.hr); + output.buildName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.creationTime); + RETURN_IF_FAILED(propCopyResult.hr); + output.creationTime = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.metadata, input.metadataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.metadata = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.regionConfigurations, input.regionConfigurationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.regionConfigurations = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListBuildSummariesResponse::FromJson(const JsonValue& input) +{ + ModelVector buildSummaries{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BuildSummaries", buildSummaries)); + this->SetBuildSummaries(std::move(buildSummaries)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PageSize", this->m_model.pageSize)); + + String skipToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SkipToken", skipToken)); + this->SetSkipToken(std::move(skipToken)); + + return S_OK; +} + +size_t ListBuildSummariesResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListBuildSummariesResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListBuildSummariesResponse::RequiredBufferSize(const PFMultiplayerServerListBuildSummariesResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFMultiplayerServerBuildSummary*) + sizeof(PFMultiplayerServerBuildSummary*) * model.buildSummariesCount); + for (size_t i = 0; i < model.buildSummariesCount; ++i) + { + requiredSize += BuildSummary::RequiredBufferSize(*model.buildSummaries[i]); + } + if (model.skipToken) + { + requiredSize += (std::strlen(model.skipToken) + 1); + } + return requiredSize; +} + +HRESULT ListBuildSummariesResponse::Copy(const PFMultiplayerServerListBuildSummariesResponse& input, PFMultiplayerServerListBuildSummariesResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.buildSummaries, input.buildSummariesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.buildSummaries = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.skipToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.skipToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ListQosServersForTitleRequest::ToJson() const +{ + return ListQosServersForTitleRequest::ToJson(this->Model()); +} + +JsonValue ListQosServersForTitleRequest::ToJson(const PFMultiplayerServerListQosServersForTitleRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "IncludeAllRegions", input.includeAllRegions); + return output; +} + +HRESULT QosServer::FromJson(const JsonValue& input) +{ + String region{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Region", region)); + this->SetRegion(std::move(region)); + + String serverUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ServerUrl", serverUrl)); + this->SetServerUrl(std::move(serverUrl)); + + return S_OK; +} + +size_t QosServer::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result QosServer::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t QosServer::RequiredBufferSize(const PFMultiplayerServerQosServer& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.region) + { + requiredSize += (std::strlen(model.region) + 1); + } + if (model.serverUrl) + { + requiredSize += (std::strlen(model.serverUrl) + 1); + } + return requiredSize; +} + +HRESULT QosServer::Copy(const PFMultiplayerServerQosServer& input, PFMultiplayerServerQosServer& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.region); + RETURN_IF_FAILED(propCopyResult.hr); + output.region = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.serverUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.serverUrl = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ListQosServersForTitleResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PageSize", this->m_model.pageSize)); + + ModelVector qosServers{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "QosServers", qosServers)); + this->SetQosServers(std::move(qosServers)); + + String skipToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SkipToken", skipToken)); + this->SetSkipToken(std::move(skipToken)); + + return S_OK; +} + +size_t ListQosServersForTitleResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ListQosServersForTitleResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ListQosServersForTitleResponse::RequiredBufferSize(const PFMultiplayerServerListQosServersForTitleResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFMultiplayerServerQosServer*) + sizeof(PFMultiplayerServerQosServer*) * model.qosServersCount); + for (size_t i = 0; i < model.qosServersCount; ++i) + { + requiredSize += QosServer::RequiredBufferSize(*model.qosServers[i]); + } + if (model.skipToken) + { + requiredSize += (std::strlen(model.skipToken) + 1); + } + return requiredSize; +} + +HRESULT ListQosServersForTitleResponse::Copy(const PFMultiplayerServerListQosServersForTitleResponse& input, PFMultiplayerServerListQosServersForTitleResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.qosServers, input.qosServersCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.qosServers = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.skipToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.skipToken = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue BuildAliasParams::ToJson() const +{ + return BuildAliasParams::ToJson(this->Model()); +} + +JsonValue BuildAliasParams::ToJson(const PFMultiplayerServerBuildAliasParams& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AliasId", input.aliasId); + return output; +} + +JsonValue RequestMultiplayerServerRequest::ToJson() const +{ + return RequestMultiplayerServerRequest::ToJson(this->Model()); +} + +JsonValue RequestMultiplayerServerRequest::ToJson(const PFMultiplayerServerRequestMultiplayerServerRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "BuildAliasParams", input.buildAliasParams); + JsonUtils::ObjectAddMember(output, "BuildId", input.buildId); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberArray(output, "InitialPlayers", input.initialPlayers, input.initialPlayersCount); + JsonUtils::ObjectAddMemberArray(output, "PreferredRegions", input.preferredRegions, input.preferredRegionsCount); + JsonUtils::ObjectAddMember(output, "SessionCookie", input.sessionCookie); + JsonUtils::ObjectAddMember(output, "SessionId", input.sessionId); + return output; +} + +HRESULT ConnectedPlayer::FromJson(const JsonValue& input) +{ + String playerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerId", playerId)); + this->SetPlayerId(std::move(playerId)); + + return S_OK; +} + +size_t ConnectedPlayer::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ConnectedPlayer::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ConnectedPlayer::RequiredBufferSize(const PFMultiplayerServerConnectedPlayer& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playerId) + { + requiredSize += (std::strlen(model.playerId) + 1); + } + return requiredSize; +} + +HRESULT ConnectedPlayer::Copy(const PFMultiplayerServerConnectedPlayer& input, PFMultiplayerServerConnectedPlayer& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT Port::FromJson(const JsonValue& input) +{ + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Num", this->m_model.num)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Protocol", this->m_model.protocol)); + + return S_OK; +} + +size_t Port::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result Port::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t Port::RequiredBufferSize(const PFMultiplayerServerPort& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + return requiredSize; +} + +HRESULT Port::Copy(const PFMultiplayerServerPort& input, PFMultiplayerServerPort& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PublicIpAddress::FromJson(const JsonValue& input) +{ + String fQDN{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FQDN", fQDN)); + this->SetFQDN(std::move(fQDN)); + + String ipAddress{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IpAddress", ipAddress)); + this->SetIpAddress(std::move(ipAddress)); + + String routingType{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "RoutingType", routingType)); + this->SetRoutingType(std::move(routingType)); + + return S_OK; +} + +size_t PublicIpAddress::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PublicIpAddress::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PublicIpAddress::RequiredBufferSize(const PFMultiplayerServerPublicIpAddress& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.fQDN) + { + requiredSize += (std::strlen(model.fQDN) + 1); + } + if (model.ipAddress) + { + requiredSize += (std::strlen(model.ipAddress) + 1); + } + if (model.routingType) + { + requiredSize += (std::strlen(model.routingType) + 1); + } + return requiredSize; +} + +HRESULT PublicIpAddress::Copy(const PFMultiplayerServerPublicIpAddress& input, PFMultiplayerServerPublicIpAddress& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.fQDN); + RETURN_IF_FAILED(propCopyResult.hr); + output.fQDN = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.ipAddress); + RETURN_IF_FAILED(propCopyResult.hr); + output.ipAddress = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.routingType); + RETURN_IF_FAILED(propCopyResult.hr); + output.routingType = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT RequestMultiplayerServerResponse::FromJson(const JsonValue& input) +{ + String buildId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "BuildId", buildId)); + this->SetBuildId(std::move(buildId)); + + ModelVector connectedPlayers{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ConnectedPlayers", connectedPlayers)); + this->SetConnectedPlayers(std::move(connectedPlayers)); + + String fQDN{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FQDN", fQDN)); + this->SetFQDN(std::move(fQDN)); + + String iPV4Address{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "IPV4Address", iPV4Address)); + this->SetIPV4Address(std::move(iPV4Address)); + + std::optional lastStateTransitionTime{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastStateTransitionTime", lastStateTransitionTime)); + this->SetLastStateTransitionTime(std::move(lastStateTransitionTime)); + + ModelVector ports{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Ports", ports)); + this->SetPorts(std::move(ports)); + + ModelVector publicIPV4Addresses{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PublicIPV4Addresses", publicIPV4Addresses)); + this->SetPublicIPV4Addresses(std::move(publicIPV4Addresses)); + + String region{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Region", region)); + this->SetRegion(std::move(region)); + + String serverId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ServerId", serverId)); + this->SetServerId(std::move(serverId)); + + String sessionId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "SessionId", sessionId)); + this->SetSessionId(std::move(sessionId)); + + String state{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "State", state)); + this->SetState(std::move(state)); + + String vmId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VmId", vmId)); + this->SetVmId(std::move(vmId)); + + return S_OK; +} + +size_t RequestMultiplayerServerResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result RequestMultiplayerServerResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t RequestMultiplayerServerResponse::RequiredBufferSize(const PFMultiplayerServerRequestMultiplayerServerResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.buildId) + { + requiredSize += (std::strlen(model.buildId) + 1); + } + requiredSize += (alignof(PFMultiplayerServerConnectedPlayer*) + sizeof(PFMultiplayerServerConnectedPlayer*) * model.connectedPlayersCount); + for (size_t i = 0; i < model.connectedPlayersCount; ++i) + { + requiredSize += ConnectedPlayer::RequiredBufferSize(*model.connectedPlayers[i]); + } + if (model.fQDN) + { + requiredSize += (std::strlen(model.fQDN) + 1); + } + if (model.iPV4Address) + { + requiredSize += (std::strlen(model.iPV4Address) + 1); + } + if (model.lastStateTransitionTime) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFMultiplayerServerPort*) + sizeof(PFMultiplayerServerPort*) * model.portsCount); + for (size_t i = 0; i < model.portsCount; ++i) + { + requiredSize += Port::RequiredBufferSize(*model.ports[i]); + } + requiredSize += (alignof(PFMultiplayerServerPublicIpAddress*) + sizeof(PFMultiplayerServerPublicIpAddress*) * model.publicIPV4AddressesCount); + for (size_t i = 0; i < model.publicIPV4AddressesCount; ++i) + { + requiredSize += PublicIpAddress::RequiredBufferSize(*model.publicIPV4Addresses[i]); + } + if (model.region) + { + requiredSize += (std::strlen(model.region) + 1); + } + if (model.serverId) + { + requiredSize += (std::strlen(model.serverId) + 1); + } + if (model.sessionId) + { + requiredSize += (std::strlen(model.sessionId) + 1); + } + if (model.state) + { + requiredSize += (std::strlen(model.state) + 1); + } + if (model.vmId) + { + requiredSize += (std::strlen(model.vmId) + 1); + } + return requiredSize; +} + +HRESULT RequestMultiplayerServerResponse::Copy(const PFMultiplayerServerRequestMultiplayerServerResponse& input, PFMultiplayerServerRequestMultiplayerServerResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.buildId); + RETURN_IF_FAILED(propCopyResult.hr); + output.buildId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.connectedPlayers, input.connectedPlayersCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.connectedPlayers = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.fQDN); + RETURN_IF_FAILED(propCopyResult.hr); + output.fQDN = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.iPV4Address); + RETURN_IF_FAILED(propCopyResult.hr); + output.iPV4Address = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastStateTransitionTime); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastStateTransitionTime = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.ports, input.portsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.ports = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.publicIPV4Addresses, input.publicIPV4AddressesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.publicIPV4Addresses = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.region); + RETURN_IF_FAILED(propCopyResult.hr); + output.region = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.serverId); + RETURN_IF_FAILED(propCopyResult.hr); + output.serverId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.sessionId); + RETURN_IF_FAILED(propCopyResult.hr); + output.sessionId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.state); + RETURN_IF_FAILED(propCopyResult.hr); + output.state = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.vmId); + RETURN_IF_FAILED(propCopyResult.hr); + output.vmId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace MultiplayerServer +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.h b/Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.h new file mode 100644 index 0000000..3331b69 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/MultiplayerServerTypes.h @@ -0,0 +1,408 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace MultiplayerServer +{ + +// MultiplayerServer Classes +class ListBuildAliasesRequest : public Wrappers::PFMultiplayerServerListBuildAliasesRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerListBuildAliasesRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFMultiplayerServerListBuildAliasesRequest& input); +}; + +class BuildSelectionCriterion : public Wrappers::PFMultiplayerServerBuildSelectionCriterionWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerBuildSelectionCriterionWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerBuildSelectionCriterion& model); + static HRESULT Copy(const PFMultiplayerServerBuildSelectionCriterion& input, PFMultiplayerServerBuildSelectionCriterion& output, ModelBuffer& buffer); +}; + +class BuildAliasDetailsResponse : public Wrappers::PFMultiplayerServerBuildAliasDetailsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerBuildAliasDetailsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerBuildAliasDetailsResponse& model); + static HRESULT Copy(const PFMultiplayerServerBuildAliasDetailsResponse& input, PFMultiplayerServerBuildAliasDetailsResponse& output, ModelBuffer& buffer); +}; + +class ListBuildAliasesResponse : public Wrappers::PFMultiplayerServerListBuildAliasesResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerListBuildAliasesResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerListBuildAliasesResponse& model); + static HRESULT Copy(const PFMultiplayerServerListBuildAliasesResponse& input, PFMultiplayerServerListBuildAliasesResponse& output, ModelBuffer& buffer); +}; + +class ListBuildSummariesRequest : public Wrappers::PFMultiplayerServerListBuildSummariesRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerListBuildSummariesRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFMultiplayerServerListBuildSummariesRequest& input); +}; + +class CurrentServerStats : public Wrappers::PFMultiplayerServerCurrentServerStatsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerCurrentServerStatsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerCurrentServerStats& model); + static HRESULT Copy(const PFMultiplayerServerCurrentServerStats& input, PFMultiplayerServerCurrentServerStats& output, ModelBuffer& buffer); +}; + +class DynamicStandbyThreshold : public Wrappers::PFMultiplayerServerDynamicStandbyThresholdWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerDynamicStandbyThresholdWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerDynamicStandbyThreshold& model); + static HRESULT Copy(const PFMultiplayerServerDynamicStandbyThreshold& input, PFMultiplayerServerDynamicStandbyThreshold& output, ModelBuffer& buffer); +}; + +class DynamicStandbySettings : public Wrappers::PFMultiplayerServerDynamicStandbySettingsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerDynamicStandbySettingsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerDynamicStandbySettings& model); + static HRESULT Copy(const PFMultiplayerServerDynamicStandbySettings& input, PFMultiplayerServerDynamicStandbySettings& output, ModelBuffer& buffer); +}; + +class Schedule : public Wrappers::PFMultiplayerServerScheduleWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerScheduleWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerSchedule& model); + static HRESULT Copy(const PFMultiplayerServerSchedule& input, PFMultiplayerServerSchedule& output, ModelBuffer& buffer); +}; + +class ScheduledStandbySettings : public Wrappers::PFMultiplayerServerScheduledStandbySettingsWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerScheduledStandbySettingsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerScheduledStandbySettings& model); + static HRESULT Copy(const PFMultiplayerServerScheduledStandbySettings& input, PFMultiplayerServerScheduledStandbySettings& output, ModelBuffer& buffer); +}; + +class BuildRegion : public Wrappers::PFMultiplayerServerBuildRegionWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerBuildRegionWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerBuildRegion& model); + static HRESULT Copy(const PFMultiplayerServerBuildRegion& input, PFMultiplayerServerBuildRegion& output, ModelBuffer& buffer); +}; + +class BuildSummary : public Wrappers::PFMultiplayerServerBuildSummaryWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerBuildSummaryWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerBuildSummary& model); + static HRESULT Copy(const PFMultiplayerServerBuildSummary& input, PFMultiplayerServerBuildSummary& output, ModelBuffer& buffer); +}; + +class ListBuildSummariesResponse : public Wrappers::PFMultiplayerServerListBuildSummariesResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerListBuildSummariesResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerListBuildSummariesResponse& model); + static HRESULT Copy(const PFMultiplayerServerListBuildSummariesResponse& input, PFMultiplayerServerListBuildSummariesResponse& output, ModelBuffer& buffer); +}; + +class ListQosServersForTitleRequest : public Wrappers::PFMultiplayerServerListQosServersForTitleRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerListQosServersForTitleRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFMultiplayerServerListQosServersForTitleRequest& input); +}; + +class QosServer : public Wrappers::PFMultiplayerServerQosServerWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerQosServerWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerQosServer& model); + static HRESULT Copy(const PFMultiplayerServerQosServer& input, PFMultiplayerServerQosServer& output, ModelBuffer& buffer); +}; + +class ListQosServersForTitleResponse : public Wrappers::PFMultiplayerServerListQosServersForTitleResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerListQosServersForTitleResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerListQosServersForTitleResponse& model); + static HRESULT Copy(const PFMultiplayerServerListQosServersForTitleResponse& input, PFMultiplayerServerListQosServersForTitleResponse& output, ModelBuffer& buffer); +}; + +class BuildAliasParams : public Wrappers::PFMultiplayerServerBuildAliasParamsWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerBuildAliasParamsWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFMultiplayerServerBuildAliasParams& input); +}; + +class RequestMultiplayerServerRequest : public Wrappers::PFMultiplayerServerRequestMultiplayerServerRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerRequestMultiplayerServerRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFMultiplayerServerRequestMultiplayerServerRequest& input); +}; + +class ConnectedPlayer : public Wrappers::PFMultiplayerServerConnectedPlayerWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerConnectedPlayerWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerConnectedPlayer& model); + static HRESULT Copy(const PFMultiplayerServerConnectedPlayer& input, PFMultiplayerServerConnectedPlayer& output, ModelBuffer& buffer); +}; + +class Port : public Wrappers::PFMultiplayerServerPortWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerPortWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerPort& model); + static HRESULT Copy(const PFMultiplayerServerPort& input, PFMultiplayerServerPort& output, ModelBuffer& buffer); +}; + +class PublicIpAddress : public Wrappers::PFMultiplayerServerPublicIpAddressWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerPublicIpAddressWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerPublicIpAddress& model); + static HRESULT Copy(const PFMultiplayerServerPublicIpAddress& input, PFMultiplayerServerPublicIpAddress& output, ModelBuffer& buffer); +}; + +class RequestMultiplayerServerResponse : public Wrappers::PFMultiplayerServerRequestMultiplayerServerResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFMultiplayerServerRequestMultiplayerServerResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFMultiplayerServerRequestMultiplayerServerResponse& model); + static HRESULT Copy(const PFMultiplayerServerRequestMultiplayerServerResponse& input, PFMultiplayerServerRequestMultiplayerServerResponse& output, ModelBuffer& buffer); +}; + +} // namespace MultiplayerServer +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PFAccountManagement.cpp b/Source/PlayFabServices/Source/Generated/PFAccountManagement.cpp new file mode 100644 index 0000000..7ecb6be --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFAccountManagement.cpp @@ -0,0 +1,2842 @@ +#include "stdafx.h" +#include +#include "Generated/AccountManagement.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::AccountManagement; + +#if 0 +PF_API PFAccountManagementClientAddOrUpdateContactEmailAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementAddOrUpdateContactEmailRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientAddOrUpdateContactEmailAsync), + std::bind(&AccountManagementAPI::ClientAddOrUpdateContactEmail, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientAddUsernamePasswordAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementAddUsernamePasswordRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientAddUsernamePasswordAsync), + std::bind(&AccountManagementAPI::ClientAddUsernamePassword, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientAddUsernamePasswordGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientAddUsernamePasswordGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementAddUsernamePasswordResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +PF_API PFAccountManagementClientGetAccountInfoAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetAccountInfoRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetAccountInfoAsync), + std::bind(&AccountManagementAPI::ClientGetAccountInfo, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetAccountInfoGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetAccountInfoGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetAccountInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFAccountManagementClientGetPlayerCombinedInfoAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayerCombinedInfoRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayerCombinedInfoAsync), + std::bind(&AccountManagementAPI::ClientGetPlayerCombinedInfo, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayerCombinedInfoGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayerCombinedInfoGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerCombinedInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFAccountManagementClientGetPlayerProfileAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayerProfileRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayerProfileAsync), + std::bind(&AccountManagementAPI::ClientGetPlayerProfile, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayerProfileGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayerProfileGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerProfileResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromFacebookIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromFacebookIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromFacebookInstantGamesIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromGameCenterIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromGoogleIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromGoogleIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromGoogleIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromGoogleIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromGoogleIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromGoogleIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromGoogleIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromKongregateIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromKongregateIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromKongregateIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromKongregateIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromKongregateIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromKongregateIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromKongregateIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromNintendoServiceAccountIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromNintendoSwitchDeviceIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromPSNAccountIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +PF_API PFAccountManagementClientGetPlayFabIDsFromSteamIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromSteamIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromSteamIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromSteamIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromSteamIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromSteamIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromSteamIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientGetPlayFabIDsFromTwitchIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromTwitchIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromTwitchIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromTwitchIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromTwitchIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromTwitchIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsAsync), + std::bind(&AccountManagementAPI::ClientGetPlayFabIDsFromXboxLiveIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkAndroidDeviceIDAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkAndroidDeviceIDRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkAndroidDeviceIDAsync), + std::bind(&AccountManagementAPI::ClientLinkAndroidDeviceID, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkAppleAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkAppleRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkAppleAsync), + std::bind(&AccountManagementAPI::ClientLinkApple, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAccountManagementClientLinkCustomIDAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkCustomIDRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkCustomIDAsync), + std::bind(&AccountManagementAPI::ClientLinkCustomID, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFAccountManagementClientLinkFacebookAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkFacebookAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkFacebookAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkFacebookAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkFacebookInstantGamesIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkFacebookInstantGamesIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkFacebookInstantGamesIdAsync), + std::bind(&AccountManagementAPI::ClientLinkFacebookInstantGamesId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkGameCenterAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkGameCenterAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkGameCenterAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkGameCenterAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkGoogleAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkGoogleAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkGoogleAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkGoogleAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkGooglePlayGamesServicesAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkGooglePlayGamesServicesAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkGooglePlayGamesServicesAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkGooglePlayGamesServicesAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkIOSDeviceIDAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkIOSDeviceIDRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkIOSDeviceIDAsync), + std::bind(&AccountManagementAPI::ClientLinkIOSDeviceID, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkKongregateAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkKongregateAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkKongregateAsync), + std::bind(&AccountManagementAPI::ClientLinkKongregate, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +PF_API PFAccountManagementClientLinkNintendoServiceAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientLinkNintendoServiceAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkNintendoServiceAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkNintendoServiceAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientLinkNintendoSwitchDeviceIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkNintendoSwitchDeviceIdAsync), + std::bind(&AccountManagementAPI::ClientLinkNintendoSwitchDeviceId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAccountManagementClientLinkOpenIdConnectAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkOpenIdConnectRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkOpenIdConnectAsync), + std::bind(&AccountManagementAPI::ClientLinkOpenIdConnect, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFAccountManagementClientLinkPSNAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientLinkPSNAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkPSNAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkPSNAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +PF_API PFAccountManagementClientLinkSteamAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkSteamAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkSteamAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkSteamAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientLinkTwitchAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkTwitchAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkTwitchAsync), + std::bind(&AccountManagementAPI::ClientLinkTwitch, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFAccountManagementClientLinkXboxAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientLinkXboxAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientLinkXboxAccountAsync), + std::bind(&AccountManagementAPI::ClientLinkXboxAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientRemoveContactEmailAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementRemoveContactEmailRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientRemoveContactEmailAsync), + std::bind(&AccountManagementAPI::ClientRemoveContactEmail, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAccountManagementClientReportPlayerAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementReportPlayerClientRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientReportPlayerAsync), + std::bind(&AccountManagementAPI::ClientReportPlayer, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientReportPlayerGetResult( + _In_ XAsyncBlock* async, + _Out_ PFAccountManagementReportPlayerClientResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFAccountManagementReportPlayerClientResult), result, nullptr); +} + +#if 0 +PF_API PFAccountManagementClientSendAccountRecoveryEmailAsync( + _In_ PFServiceConfigHandle contextHandle, + _In_ const PFAccountManagementSendAccountRecoveryEmailRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientSendAccountRecoveryEmailAsync), + std::bind(&AccountManagementAPI::ClientSendAccountRecoveryEmail, ServiceConfig::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkAndroidDeviceIDAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkAndroidDeviceIDRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkAndroidDeviceIDAsync), + std::bind(&AccountManagementAPI::ClientUnlinkAndroidDeviceID, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkAppleAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkAppleRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkAppleAsync), + std::bind(&AccountManagementAPI::ClientUnlinkApple, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAccountManagementClientUnlinkCustomIDAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkCustomIDRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkCustomIDAsync), + std::bind(&AccountManagementAPI::ClientUnlinkCustomID, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFAccountManagementClientUnlinkFacebookAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkFacebookAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkFacebookAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkFacebookAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkFacebookInstantGamesIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkFacebookInstantGamesIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkFacebookInstantGamesIdAsync), + std::bind(&AccountManagementAPI::ClientUnlinkFacebookInstantGamesId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkGameCenterAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkGameCenterAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkGameCenterAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkGameCenterAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkGoogleAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkGoogleAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkGoogleAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkGoogleAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkGooglePlayGamesServicesAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkGooglePlayGamesServicesAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkGooglePlayGamesServicesAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkIOSDeviceIDAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkIOSDeviceIDRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkIOSDeviceIDAsync), + std::bind(&AccountManagementAPI::ClientUnlinkIOSDeviceID, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkKongregateAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkKongregateAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkKongregateAsync), + std::bind(&AccountManagementAPI::ClientUnlinkKongregate, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +PF_API PFAccountManagementClientUnlinkNintendoServiceAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientUnlinkNintendoServiceAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkNintendoServiceAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkNintendoServiceAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkNintendoSwitchDeviceIdAsync), + std::bind(&AccountManagementAPI::ClientUnlinkNintendoSwitchDeviceId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAccountManagementClientUnlinkOpenIdConnectAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkOpenIdConnectRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkOpenIdConnectAsync), + std::bind(&AccountManagementAPI::ClientUnlinkOpenIdConnect, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFAccountManagementClientUnlinkPSNAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientUnlinkPSNAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkPSNAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkPSNAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +PF_API PFAccountManagementClientUnlinkSteamAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkSteamAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkSteamAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkSteamAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementClientUnlinkTwitchAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkTwitchAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkTwitchAsync), + std::bind(&AccountManagementAPI::ClientUnlinkTwitch, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFAccountManagementClientUnlinkXboxAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientUnlinkXboxAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUnlinkXboxAccountAsync), + std::bind(&AccountManagementAPI::ClientUnlinkXboxAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFAccountManagementClientUpdateAvatarUrlAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementClientUpdateAvatarUrlRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUpdateAvatarUrlAsync), + std::bind(&AccountManagementAPI::ClientUpdateAvatarUrl, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFAccountManagementClientUpdateUserTitleDisplayNameAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUpdateUserTitleDisplayNameRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementClientUpdateUserTitleDisplayNameAsync), + std::bind(&AccountManagementAPI::ClientUpdateUserTitleDisplayName, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementClientUpdateUserTitleDisplayNameGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementClientUpdateUserTitleDisplayNameGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementUpdateUserTitleDisplayNameResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerBanUsersAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementBanUsersRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerBanUsersAsync), + std::bind(&AccountManagementAPI::ServerBanUsers, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerBanUsersGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerBanUsersGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementBanUsersResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerDeletePlayerAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementDeletePlayerRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerDeletePlayerAsync), + std::bind(&AccountManagementAPI::ServerDeletePlayer, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayerCombinedInfoAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayerCombinedInfoRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayerCombinedInfoAsync), + std::bind(&AccountManagementAPI::ServerGetPlayerCombinedInfo, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayerCombinedInfoGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayerCombinedInfoGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerCombinedInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayerProfileAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayerProfileRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayerProfileAsync), + std::bind(&AccountManagementAPI::ServerGetPlayerProfile, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayerProfileGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayerProfileGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayerProfileResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromFacebookIDsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromFacebookIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromFacebookInstantGamesIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromNintendoServiceAccountIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromNintendoSwitchDeviceIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromPSNAccountIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromSteamIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromSteamIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromSteamIDsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromSteamIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromSteamIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromSteamIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromSteamIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromTwitchIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromTwitchIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromTwitchIDsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromTwitchIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromTwitchIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromTwitchIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromTwitchIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsAsync), + std::bind(&AccountManagementAPI::ServerGetPlayFabIDsFromXboxLiveIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsAsync), + std::bind(&AccountManagementAPI::ServerGetServerCustomIDsFromPlayFabIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetUserAccountInfoAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetUserAccountInfoRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetUserAccountInfoAsync), + std::bind(&AccountManagementAPI::ServerGetUserAccountInfo, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetUserAccountInfoGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetUserAccountInfoGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetUserAccountInfoResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerGetUserBansAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetUserBansRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerGetUserBansAsync), + std::bind(&AccountManagementAPI::ServerGetUserBans, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerGetUserBansGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerGetUserBansGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetUserBansResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerLinkNintendoServiceAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerLinkNintendoServiceAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerLinkNintendoServiceAccountAsync), + std::bind(&AccountManagementAPI::ServerLinkNintendoServiceAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerLinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerLinkNintendoSwitchDeviceIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerLinkNintendoSwitchDeviceIdAsync), + std::bind(&AccountManagementAPI::ServerLinkNintendoSwitchDeviceId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerLinkPSNAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerLinkPSNAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerLinkPSNAccountAsync), + std::bind(&AccountManagementAPI::ServerLinkPSNAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerLinkPSNIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkPSNIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerLinkPSNIdAsync), + std::bind(&AccountManagementAPI::ServerLinkPSNId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerLinkServerCustomIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkServerCustomIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerLinkServerCustomIdAsync), + std::bind(&AccountManagementAPI::ServerLinkServerCustomId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerLinkSteamIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementLinkSteamIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerLinkSteamIdAsync), + std::bind(&AccountManagementAPI::ServerLinkSteamId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerLinkXboxAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerLinkXboxAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerLinkXboxAccountAsync), + std::bind(&AccountManagementAPI::ServerLinkXboxAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerRevokeAllBansForUserAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementRevokeAllBansForUserRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerRevokeAllBansForUserAsync), + std::bind(&AccountManagementAPI::ServerRevokeAllBansForUser, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerRevokeAllBansForUserGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerRevokeAllBansForUserGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementRevokeAllBansForUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerRevokeBansAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementRevokeBansRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerRevokeBansAsync), + std::bind(&AccountManagementAPI::ServerRevokeBans, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerRevokeBansGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerRevokeBansGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementRevokeBansResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementServerSendCustomAccountRecoveryEmailAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementSendCustomAccountRecoveryEmailRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerSendCustomAccountRecoveryEmailAsync), + std::bind(&AccountManagementAPI::ServerSendCustomAccountRecoveryEmail, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerSendEmailFromTemplateAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementSendEmailFromTemplateRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerSendEmailFromTemplateAsync), + std::bind(&AccountManagementAPI::ServerSendEmailFromTemplate, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUnlinkNintendoServiceAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerUnlinkNintendoServiceAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUnlinkNintendoServiceAccountAsync), + std::bind(&AccountManagementAPI::ServerUnlinkNintendoServiceAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUnlinkNintendoSwitchDeviceIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUnlinkNintendoSwitchDeviceIdAsync), + std::bind(&AccountManagementAPI::ServerUnlinkNintendoSwitchDeviceId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUnlinkPSNAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerUnlinkPSNAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUnlinkPSNAccountAsync), + std::bind(&AccountManagementAPI::ServerUnlinkPSNAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUnlinkServerCustomIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkServerCustomIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUnlinkServerCustomIdAsync), + std::bind(&AccountManagementAPI::ServerUnlinkServerCustomId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUnlinkSteamIdAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUnlinkSteamIdRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUnlinkSteamIdAsync), + std::bind(&AccountManagementAPI::ServerUnlinkSteamId, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUnlinkXboxAccountAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerUnlinkXboxAccountRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUnlinkXboxAccountAsync), + std::bind(&AccountManagementAPI::ServerUnlinkXboxAccount, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUpdateAvatarUrlAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementServerUpdateAvatarUrlRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUpdateAvatarUrlAsync), + std::bind(&AccountManagementAPI::ServerUpdateAvatarUrl, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFAccountManagementServerUpdateBansAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementUpdateBansRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementServerUpdateBansAsync), + std::bind(&AccountManagementAPI::ServerUpdateBans, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementServerUpdateBansGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementServerUpdateBansGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementUpdateBansResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFAccountManagementGetTitlePlayersFromXboxLiveIDsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFAccountManagementGetTitlePlayersFromXboxLiveIDsAsync), + std::bind(&AccountManagementAPI::GetTitlePlayersFromXboxLiveIDs, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFAccountManagementGetTitlePlayersFromXboxLiveIDsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFAccountManagementGetTitlePlayersFromXboxLiveIDsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFAccountManagementGetTitlePlayersFromProviderIDsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFCatalog.cpp b/Source/PlayFabServices/Source/Generated/PFCatalog.cpp new file mode 100644 index 0000000..694de60 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFCatalog.cpp @@ -0,0 +1,926 @@ +#include "stdafx.h" +#include +#include "Generated/Catalog.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Catalog; + +PF_API PFCatalogCreateDraftItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogCreateDraftItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogCreateDraftItemAsync), + std::bind(&CatalogAPI::CreateDraftItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogCreateDraftItemGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogCreateDraftItemGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogCreateDraftItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogCreateUploadUrlsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogCreateUploadUrlsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogCreateUploadUrlsAsync), + std::bind(&CatalogAPI::CreateUploadUrls, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogCreateUploadUrlsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogCreateUploadUrlsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogCreateUploadUrlsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if 0 +PF_API PFCatalogDeleteEntityItemReviewsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogDeleteEntityItemReviewsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogDeleteEntityItemReviewsAsync), + std::bind(&CatalogAPI::DeleteEntityItemReviews, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFCatalogDeleteItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogDeleteItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogDeleteItemAsync), + std::bind(&CatalogAPI::DeleteItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFCatalogGetCatalogConfigAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetCatalogConfigRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetCatalogConfigAsync), + std::bind(&CatalogAPI::GetCatalogConfig, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetCatalogConfigGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetCatalogConfigGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetCatalogConfigResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +PF_API PFCatalogGetDraftItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetDraftItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetDraftItemAsync), + std::bind(&CatalogAPI::GetDraftItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetDraftItemGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetDraftItemGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetDraftItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetDraftItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetDraftItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetDraftItemsAsync), + std::bind(&CatalogAPI::GetDraftItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetDraftItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetDraftItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetDraftItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetEntityDraftItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetEntityDraftItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetEntityDraftItemsAsync), + std::bind(&CatalogAPI::GetEntityDraftItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetEntityDraftItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetEntityDraftItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetEntityDraftItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetEntityItemReviewAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetEntityItemReviewRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetEntityItemReviewAsync), + std::bind(&CatalogAPI::GetEntityItemReview, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetEntityItemReviewGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetEntityItemReviewGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetEntityItemReviewResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetItemAsync), + std::bind(&CatalogAPI::GetItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetItemGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetItemGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetItemContainersAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetItemContainersRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetItemContainersAsync), + std::bind(&CatalogAPI::GetItemContainers, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetItemContainersGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetItemContainersGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemContainersResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if 0 +PF_API PFCatalogGetItemModerationStateAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetItemModerationStateRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetItemModerationStateAsync), + std::bind(&CatalogAPI::GetItemModerationState, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetItemModerationStateGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetItemModerationStateGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemModerationStateResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +PF_API PFCatalogGetItemPublishStatusAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetItemPublishStatusRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetItemPublishStatusAsync), + std::bind(&CatalogAPI::GetItemPublishStatus, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetItemPublishStatusGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetItemPublishStatusGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemPublishStatusResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetItemReviewsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetItemReviewsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetItemReviewsAsync), + std::bind(&CatalogAPI::GetItemReviews, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetItemReviewsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetItemReviewsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemReviewsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetItemReviewSummaryAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetItemReviewSummaryRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetItemReviewSummaryAsync), + std::bind(&CatalogAPI::GetItemReviewSummary, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetItemReviewSummaryGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetItemReviewSummaryGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemReviewSummaryResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogGetItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogGetItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogGetItemsAsync), + std::bind(&CatalogAPI::GetItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogGetItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogGetItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogGetItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFCatalogPublishDraftItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogPublishDraftItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogPublishDraftItemAsync), + std::bind(&CatalogAPI::PublishDraftItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogReportItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogReportItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogReportItemAsync), + std::bind(&CatalogAPI::ReportItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogReportItemReviewAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogReportItemReviewRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogReportItemReviewAsync), + std::bind(&CatalogAPI::ReportItemReview, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogReviewItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogReviewItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogReviewItemAsync), + std::bind(&CatalogAPI::ReviewItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogSearchItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogSearchItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogSearchItemsAsync), + std::bind(&CatalogAPI::SearchItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogSearchItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogSearchItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogSearchItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if 0 +PF_API PFCatalogSetItemModerationStateAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogSetItemModerationStateRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogSetItemModerationStateAsync), + std::bind(&CatalogAPI::SetItemModerationState, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFCatalogSubmitItemReviewVoteAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogSubmitItemReviewVoteRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogSubmitItemReviewVoteAsync), + std::bind(&CatalogAPI::SubmitItemReviewVote, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFCatalogTakedownItemReviewsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogTakedownItemReviewsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogTakedownItemReviewsAsync), + std::bind(&CatalogAPI::TakedownItemReviews, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFCatalogUpdateCatalogConfigAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogUpdateCatalogConfigRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogUpdateCatalogConfigAsync), + std::bind(&CatalogAPI::UpdateCatalogConfig, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +PF_API PFCatalogUpdateDraftItemAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCatalogUpdateDraftItemRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCatalogUpdateDraftItemAsync), + std::bind(&CatalogAPI::UpdateDraftItem, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCatalogUpdateDraftItemGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCatalogUpdateDraftItemGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCatalogUpdateDraftItemResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFCharacter.cpp b/Source/PlayFabServices/Source/Generated/PFCharacter.cpp new file mode 100644 index 0000000..78c7b32 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFCharacter.cpp @@ -0,0 +1,566 @@ +#include "stdafx.h" +#include +#include "Generated/Character.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Character; + +#if 0 +PF_API PFCharacterClientGetAllUsersCharactersAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterListUsersCharactersRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterClientGetAllUsersCharactersAsync), + std::bind(&CharacterAPI::ClientGetAllUsersCharacters, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterClientGetAllUsersCharactersGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterClientGetAllUsersCharactersGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterListUsersCharactersResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterClientGetCharacterDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterClientGetCharacterDataAsync), + std::bind(&CharacterAPI::ClientGetCharacterData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterClientGetCharacterDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterClientGetCharacterDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterClientGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterClientGetCharacterReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterClientGetCharacterReadOnlyDataAsync), + std::bind(&CharacterAPI::ClientGetCharacterReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterClientGetCharacterReadOnlyDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterClientGetCharacterReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterClientGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterClientGrantCharacterToUserAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterClientGrantCharacterToUserRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterClientGrantCharacterToUserAsync), + std::bind(&CharacterAPI::ClientGrantCharacterToUser, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterClientGrantCharacterToUserGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterClientGrantCharacterToUserGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterClientGrantCharacterToUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterClientUpdateCharacterDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterClientUpdateCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterClientUpdateCharacterDataAsync), + std::bind(&CharacterAPI::ClientUpdateCharacterData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterClientUpdateCharacterDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFCharacterUpdateCharacterDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFCharacterServerDeleteCharacterFromUserAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterDeleteCharacterFromUserRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerDeleteCharacterFromUserAsync), + std::bind(&CharacterAPI::ServerDeleteCharacterFromUser, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFCharacterServerGetAllUsersCharactersAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterListUsersCharactersRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerGetAllUsersCharactersAsync), + std::bind(&CharacterAPI::ServerGetAllUsersCharacters, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerGetAllUsersCharactersGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterServerGetAllUsersCharactersGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterListUsersCharactersResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterServerGetCharacterDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerGetCharacterDataAsync), + std::bind(&CharacterAPI::ServerGetCharacterData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerGetCharacterDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterServerGetCharacterDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterServerGetCharacterInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerGetCharacterInternalDataAsync), + std::bind(&CharacterAPI::ServerGetCharacterInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerGetCharacterInternalDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterServerGetCharacterInternalDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterServerGetCharacterReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterGetCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerGetCharacterReadOnlyDataAsync), + std::bind(&CharacterAPI::ServerGetCharacterReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerGetCharacterReadOnlyDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterServerGetCharacterReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGetCharacterDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterServerGrantCharacterToUserAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterServerGrantCharacterToUserRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerGrantCharacterToUserAsync), + std::bind(&CharacterAPI::ServerGrantCharacterToUser, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerGrantCharacterToUserGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCharacterServerGrantCharacterToUserGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCharacterServerGrantCharacterToUserResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFCharacterServerUpdateCharacterDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterServerUpdateCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerUpdateCharacterDataAsync), + std::bind(&CharacterAPI::ServerUpdateCharacterData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerUpdateCharacterDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFCharacterUpdateCharacterDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFCharacterServerUpdateCharacterInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterServerUpdateCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerUpdateCharacterInternalDataAsync), + std::bind(&CharacterAPI::ServerUpdateCharacterInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerUpdateCharacterInternalDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFCharacterUpdateCharacterDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFCharacterServerUpdateCharacterReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCharacterServerUpdateCharacterDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCharacterServerUpdateCharacterReadOnlyDataAsync), + std::bind(&CharacterAPI::ServerUpdateCharacterReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCharacterServerUpdateCharacterReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFCharacterUpdateCharacterDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFCharacterUpdateCharacterDataResult), result, nullptr); +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFCloudScript.cpp b/Source/PlayFabServices/Source/Generated/PFCloudScript.cpp new file mode 100644 index 0000000..40f792a --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFCloudScript.cpp @@ -0,0 +1,54 @@ +#include "stdafx.h" +#include +#include "Generated/CloudScript.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::CloudScript; + +PF_API PFCloudScriptExecuteFunctionAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFCloudScriptExecuteFunctionRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFCloudScriptExecuteFunctionAsync), + std::bind(&CloudScriptAPI::ExecuteFunction, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFCloudScriptExecuteFunctionGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFCloudScriptExecuteFunctionGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFCloudScriptExecuteFunctionResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFData.cpp b/Source/PlayFabServices/Source/Generated/PFData.cpp new file mode 100644 index 0000000..681c5e0 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFData.cpp @@ -0,0 +1,318 @@ +#include "stdafx.h" +#include +#include "Generated/Data.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Data; + +PF_API PFDataAbortFileUploadsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFDataAbortFileUploadsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFDataAbortFileUploadsAsync), + std::bind(&DataAPI::AbortFileUploads, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFDataAbortFileUploadsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFDataAbortFileUploadsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataAbortFileUploadsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFDataDeleteFilesAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFDataDeleteFilesRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFDataDeleteFilesAsync), + std::bind(&DataAPI::DeleteFiles, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFDataDeleteFilesGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFDataDeleteFilesGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataDeleteFilesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFDataFinalizeFileUploadsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFDataFinalizeFileUploadsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFDataFinalizeFileUploadsAsync), + std::bind(&DataAPI::FinalizeFileUploads, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFDataFinalizeFileUploadsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFDataFinalizeFileUploadsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataFinalizeFileUploadsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFDataGetFilesAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFDataGetFilesRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFDataGetFilesAsync), + std::bind(&DataAPI::GetFiles, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFDataGetFilesGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFDataGetFilesGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataGetFilesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFDataGetObjectsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFDataGetObjectsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFDataGetObjectsAsync), + std::bind(&DataAPI::GetObjects, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFDataGetObjectsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFDataGetObjectsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataGetObjectsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFDataInitiateFileUploadsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFDataInitiateFileUploadsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFDataInitiateFileUploadsAsync), + std::bind(&DataAPI::InitiateFileUploads, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFDataInitiateFileUploadsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFDataInitiateFileUploadsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataInitiateFileUploadsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFDataSetObjectsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFDataSetObjectsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFDataSetObjectsAsync), + std::bind(&DataAPI::SetObjects, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFDataSetObjectsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFDataSetObjectsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFDataSetObjectsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFExperimentation.cpp b/Source/PlayFabServices/Source/Generated/PFExperimentation.cpp new file mode 100644 index 0000000..601f766 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFExperimentation.cpp @@ -0,0 +1,54 @@ +#include "stdafx.h" +#include +#include "Generated/Experimentation.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Experimentation; + +PF_API PFExperimentationGetTreatmentAssignmentAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFExperimentationGetTreatmentAssignmentRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFExperimentationGetTreatmentAssignmentAsync), + std::bind(&ExperimentationAPI::GetTreatmentAssignment, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFExperimentationGetTreatmentAssignmentGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFExperimentationGetTreatmentAssignmentGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFExperimentationGetTreatmentAssignmentResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFFriends.cpp b/Source/PlayFabServices/Source/Generated/PFFriends.cpp new file mode 100644 index 0000000..9e5e17a --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFFriends.cpp @@ -0,0 +1,234 @@ +#include "stdafx.h" +#include +#include "Generated/Friends.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Friends; + +PF_API PFFriendsClientAddFriendAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsClientAddFriendRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsClientAddFriendAsync), + std::bind(&FriendsAPI::ClientAddFriend, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFFriendsClientAddFriendGetResult( + _In_ XAsyncBlock* async, + _Out_ PFFriendsAddFriendResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFFriendsAddFriendResult), result, nullptr); +} + +PF_API PFFriendsClientGetFriendsListAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsClientGetFriendsListRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsClientGetFriendsListAsync), + std::bind(&FriendsAPI::ClientGetFriendsList, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFFriendsClientGetFriendsListGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFFriendsClientGetFriendsListGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFFriendsGetFriendsListResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFFriendsClientRemoveFriendAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsClientRemoveFriendRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsClientRemoveFriendAsync), + std::bind(&FriendsAPI::ClientRemoveFriend, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFFriendsClientSetFriendTagsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsClientSetFriendTagsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsClientSetFriendTagsAsync), + std::bind(&FriendsAPI::ClientSetFriendTags, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +#if 0 +PF_API PFFriendsServerAddFriendAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsServerAddFriendRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsServerAddFriendAsync), + std::bind(&FriendsAPI::ServerAddFriend, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFFriendsServerGetFriendsListAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsServerGetFriendsListRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsServerGetFriendsListAsync), + std::bind(&FriendsAPI::ServerGetFriendsList, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFFriendsServerGetFriendsListGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFFriendsServerGetFriendsListGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFFriendsGetFriendsListResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFFriendsServerRemoveFriendAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsServerRemoveFriendRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsServerRemoveFriendAsync), + std::bind(&FriendsAPI::ServerRemoveFriend, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFFriendsServerSetFriendTagsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFFriendsServerSetFriendTagsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFFriendsServerSetFriendTagsAsync), + std::bind(&FriendsAPI::ServerSetFriendTags, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFGroups.cpp b/Source/PlayFabServices/Source/Generated/PFGroups.cpp new file mode 100644 index 0000000..2de3c79 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFGroups.cpp @@ -0,0 +1,830 @@ +#include "stdafx.h" +#include +#include "Generated/Groups.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Groups; + +PF_API PFGroupsAcceptGroupApplicationAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsAcceptGroupApplicationRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsAcceptGroupApplicationAsync), + std::bind(&GroupsAPI::AcceptGroupApplication, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsAcceptGroupInvitationAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsAcceptGroupInvitationRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsAcceptGroupInvitationAsync), + std::bind(&GroupsAPI::AcceptGroupInvitation, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsAddMembersAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsAddMembersRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsAddMembersAsync), + std::bind(&GroupsAPI::AddMembers, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsApplyToGroupAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsApplyToGroupRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsApplyToGroupAsync), + std::bind(&GroupsAPI::ApplyToGroup, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsApplyToGroupGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsApplyToGroupGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsApplyToGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsBlockEntityAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsBlockEntityRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsBlockEntityAsync), + std::bind(&GroupsAPI::BlockEntity, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsChangeMemberRoleAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsChangeMemberRoleRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsChangeMemberRoleAsync), + std::bind(&GroupsAPI::ChangeMemberRole, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsCreateGroupAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsCreateGroupRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsCreateGroupAsync), + std::bind(&GroupsAPI::CreateGroup, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsCreateGroupGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsCreateGroupGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsCreateGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsCreateRoleAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsCreateGroupRoleRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsCreateRoleAsync), + std::bind(&GroupsAPI::CreateRole, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsCreateRoleGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsCreateRoleGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsCreateGroupRoleResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsDeleteGroupAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsDeleteGroupRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsDeleteGroupAsync), + std::bind(&GroupsAPI::DeleteGroup, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsDeleteRoleAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsDeleteRoleRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsDeleteRoleAsync), + std::bind(&GroupsAPI::DeleteRole, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsGetGroupAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsGetGroupRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsGetGroupAsync), + std::bind(&GroupsAPI::GetGroup, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsGetGroupGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsGetGroupGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsGetGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsInviteToGroupAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsInviteToGroupRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsInviteToGroupAsync), + std::bind(&GroupsAPI::InviteToGroup, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsInviteToGroupGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsInviteToGroupGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsInviteToGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsIsMemberAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsIsMemberRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsIsMemberAsync), + std::bind(&GroupsAPI::IsMember, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsIsMemberGetResult( + _In_ XAsyncBlock* async, + _Out_ PFGroupsIsMemberResponse* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFGroupsIsMemberResponse), result, nullptr); +} + +PF_API PFGroupsListGroupApplicationsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsListGroupApplicationsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsListGroupApplicationsAsync), + std::bind(&GroupsAPI::ListGroupApplications, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsListGroupApplicationsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsListGroupApplicationsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupApplicationsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsListGroupBlocksAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsListGroupBlocksRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsListGroupBlocksAsync), + std::bind(&GroupsAPI::ListGroupBlocks, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsListGroupBlocksGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsListGroupBlocksGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupBlocksResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsListGroupInvitationsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsListGroupInvitationsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsListGroupInvitationsAsync), + std::bind(&GroupsAPI::ListGroupInvitations, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsListGroupInvitationsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsListGroupInvitationsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupInvitationsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsListGroupMembersAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsListGroupMembersRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsListGroupMembersAsync), + std::bind(&GroupsAPI::ListGroupMembers, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsListGroupMembersGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsListGroupMembersGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListGroupMembersResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsListMembershipAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsListMembershipRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsListMembershipAsync), + std::bind(&GroupsAPI::ListMembership, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsListMembershipGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsListMembershipGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListMembershipResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsListMembershipOpportunitiesAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsListMembershipOpportunitiesRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsListMembershipOpportunitiesAsync), + std::bind(&GroupsAPI::ListMembershipOpportunities, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsListMembershipOpportunitiesGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsListMembershipOpportunitiesGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsListMembershipOpportunitiesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsRemoveGroupApplicationAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsRemoveGroupApplicationRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsRemoveGroupApplicationAsync), + std::bind(&GroupsAPI::RemoveGroupApplication, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsRemoveGroupInvitationAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsRemoveGroupInvitationRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsRemoveGroupInvitationAsync), + std::bind(&GroupsAPI::RemoveGroupInvitation, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsRemoveMembersAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsRemoveMembersRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsRemoveMembersAsync), + std::bind(&GroupsAPI::RemoveMembers, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsUnblockEntityAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsUnblockEntityRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsUnblockEntityAsync), + std::bind(&GroupsAPI::UnblockEntity, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsUpdateGroupAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsUpdateGroupRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsUpdateGroupAsync), + std::bind(&GroupsAPI::UpdateGroup, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsUpdateGroupGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsUpdateGroupGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsUpdateGroupResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFGroupsUpdateRoleAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFGroupsUpdateGroupRoleRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFGroupsUpdateRoleAsync), + std::bind(&GroupsAPI::UpdateRole, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFGroupsUpdateRoleGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFGroupsUpdateRoleGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFGroupsUpdateGroupRoleResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFInventory.cpp b/Source/PlayFabServices/Source/Generated/PFInventory.cpp new file mode 100644 index 0000000..4058a89 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFInventory.cpp @@ -0,0 +1,794 @@ +#include "stdafx.h" +#include +#include "Generated/Inventory.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Inventory; + +PF_API PFInventoryAddInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryAddInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryAddInventoryItemsAsync), + std::bind(&InventoryAPI::AddInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryAddInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryAddInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryAddInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFInventoryDeleteInventoryCollectionAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryDeleteInventoryCollectionRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryDeleteInventoryCollectionAsync), + std::bind(&InventoryAPI::DeleteInventoryCollection, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryDeleteInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryDeleteInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryDeleteInventoryItemsAsync), + std::bind(&InventoryAPI::DeleteInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryDeleteInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryDeleteInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryDeleteInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFInventoryExecuteInventoryOperationsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryExecuteInventoryOperationsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryExecuteInventoryOperationsAsync), + std::bind(&InventoryAPI::ExecuteInventoryOperations, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryExecuteInventoryOperationsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryExecuteInventoryOperationsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryExecuteInventoryOperationsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFInventoryGetInventoryCollectionIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryGetInventoryCollectionIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryGetInventoryCollectionIdsAsync), + std::bind(&InventoryAPI::GetInventoryCollectionIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryGetInventoryCollectionIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryGetInventoryCollectionIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetInventoryCollectionIdsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFInventoryGetInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryGetInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryGetInventoryItemsAsync), + std::bind(&InventoryAPI::GetInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryGetInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryGetInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFInventoryGetMicrosoftStoreAccessTokensAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryGetMicrosoftStoreAccessTokensRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryGetMicrosoftStoreAccessTokensAsync), + std::bind(&InventoryAPI::GetMicrosoftStoreAccessTokens, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryGetMicrosoftStoreAccessTokensGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryGetMicrosoftStoreAccessTokensGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetMicrosoftStoreAccessTokensResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFInventoryGetTransactionHistoryAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryGetTransactionHistoryRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryGetTransactionHistoryAsync), + std::bind(&InventoryAPI::GetTransactionHistory, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryGetTransactionHistoryGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryGetTransactionHistoryGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryGetTransactionHistoryResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +PF_API PFInventoryPurchaseInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryPurchaseInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryPurchaseInventoryItemsAsync), + std::bind(&InventoryAPI::PurchaseInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryPurchaseInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryPurchaseInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryPurchaseInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if 0 +PF_API PFInventoryRedeemAppleAppStoreInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryRedeemAppleAppStoreInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryRedeemAppleAppStoreInventoryItemsAsync), + std::bind(&InventoryAPI::RedeemAppleAppStoreInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryRedeemAppleAppStoreInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryRedeemAppleAppStoreInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemAppleAppStoreInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFInventoryRedeemGooglePlayInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryRedeemGooglePlayInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryRedeemGooglePlayInventoryItemsAsync), + std::bind(&InventoryAPI::RedeemGooglePlayInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryRedeemGooglePlayInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryRedeemGooglePlayInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemGooglePlayInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +PF_API PFInventoryRedeemMicrosoftStoreInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryRedeemMicrosoftStoreInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryRedeemMicrosoftStoreInventoryItemsAsync), + std::bind(&InventoryAPI::RedeemMicrosoftStoreInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryRedeemMicrosoftStoreInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryRedeemMicrosoftStoreInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemMicrosoftStoreInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +PF_API PFInventoryRedeemNintendoEShopInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryRedeemNintendoEShopInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryRedeemNintendoEShopInventoryItemsAsync), + std::bind(&InventoryAPI::RedeemNintendoEShopInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryRedeemNintendoEShopInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryRedeemNintendoEShopInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemNintendoEShopInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +PF_API PFInventoryRedeemPlayStationStoreInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryRedeemPlayStationStoreInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryRedeemPlayStationStoreInventoryItemsAsync), + std::bind(&InventoryAPI::RedeemPlayStationStoreInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryRedeemPlayStationStoreInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryRedeemPlayStationStoreInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemPlayStationStoreInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +PF_API PFInventoryRedeemSteamInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryRedeemSteamInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryRedeemSteamInventoryItemsAsync), + std::bind(&InventoryAPI::RedeemSteamInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryRedeemSteamInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryRedeemSteamInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryRedeemSteamInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +PF_API PFInventorySubtractInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventorySubtractInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventorySubtractInventoryItemsAsync), + std::bind(&InventoryAPI::SubtractInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventorySubtractInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventorySubtractInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventorySubtractInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFInventoryTransferInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryTransferInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryTransferInventoryItemsAsync), + std::bind(&InventoryAPI::TransferInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryTransferInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryTransferInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryTransferInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFInventoryUpdateInventoryItemsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFInventoryUpdateInventoryItemsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFInventoryUpdateInventoryItemsAsync), + std::bind(&InventoryAPI::UpdateInventoryItems, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFInventoryUpdateInventoryItemsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFInventoryUpdateInventoryItemsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFInventoryUpdateInventoryItemsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFLocalization.cpp b/Source/PlayFabServices/Source/Generated/PFLocalization.cpp new file mode 100644 index 0000000..c36d767 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFLocalization.cpp @@ -0,0 +1,56 @@ +#include "stdafx.h" +#include +#include "Generated/Localization.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Localization; + +#if 0 +PF_API PFLocalizationGetLanguageListAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFLocalizationGetLanguageListRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFLocalizationGetLanguageListAsync), + std::bind(&LocalizationAPI::GetLanguageList, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFLocalizationGetLanguageListGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFLocalizationGetLanguageListGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFLocalizationGetLanguageListResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFMultiplayerServer.cpp b/Source/PlayFabServices/Source/Generated/PFMultiplayerServer.cpp new file mode 100644 index 0000000..d9f1a1d --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFMultiplayerServer.cpp @@ -0,0 +1,186 @@ +#include "stdafx.h" +#include +#include "Generated/MultiplayerServer.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::MultiplayerServer; + +PF_API PFMultiplayerServerListBuildAliasesAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFMultiplayerServerListBuildAliasesRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFMultiplayerServerListBuildAliasesAsync), + std::bind(&MultiplayerServerAPI::ListBuildAliases, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFMultiplayerServerListBuildAliasesGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFMultiplayerServerListBuildAliasesGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerListBuildAliasesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFMultiplayerServerListBuildSummariesV2Async( + _In_ PFEntityHandle contextHandle, + _In_ const PFMultiplayerServerListBuildSummariesRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFMultiplayerServerListBuildSummariesV2Async), + std::bind(&MultiplayerServerAPI::ListBuildSummariesV2, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFMultiplayerServerListBuildSummariesV2GetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFMultiplayerServerListBuildSummariesV2GetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerListBuildSummariesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFMultiplayerServerListQosServersForTitleAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFMultiplayerServerListQosServersForTitleRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFMultiplayerServerListQosServersForTitleAsync), + std::bind(&MultiplayerServerAPI::ListQosServersForTitle, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFMultiplayerServerListQosServersForTitleGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFMultiplayerServerListQosServersForTitleGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerListQosServersForTitleResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFMultiplayerServerRequestMultiplayerServerAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFMultiplayerServerRequestMultiplayerServerRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFMultiplayerServerRequestMultiplayerServerAsync), + std::bind(&MultiplayerServerAPI::RequestMultiplayerServer, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFMultiplayerServerRequestMultiplayerServerGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFMultiplayerServerRequestMultiplayerServerGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFMultiplayerServerRequestMultiplayerServerResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFPlatformSpecific.cpp b/Source/PlayFabServices/Source/Generated/PFPlatformSpecific.cpp new file mode 100644 index 0000000..0fb36cb --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFPlatformSpecific.cpp @@ -0,0 +1,122 @@ +#include "stdafx.h" +#include +#include "Generated/PlatformSpecific.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::PlatformSpecific; + +#if 0 +PF_API PFPlatformSpecificClientAndroidDevicePushNotificationRegistrationAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlatformSpecificClientAndroidDevicePushNotificationRegistrationAsync), + std::bind(&PlatformSpecificAPI::ClientAndroidDevicePushNotificationRegistration, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFPlatformSpecificClientRefreshPSNAuthTokenAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlatformSpecificRefreshPSNAuthTokenRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlatformSpecificClientRefreshPSNAuthTokenAsync), + std::bind(&PlatformSpecificAPI::ClientRefreshPSNAuthToken, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFPlatformSpecificClientRegisterForIOSPushNotificationAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlatformSpecificRegisterForIOSPushNotificationRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlatformSpecificClientRegisterForIOSPushNotificationAsync), + std::bind(&PlatformSpecificAPI::ClientRegisterForIOSPushNotification, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFPlatformSpecificServerAwardSteamAchievementAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlatformSpecificAwardSteamAchievementRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlatformSpecificServerAwardSteamAchievementAsync), + std::bind(&PlatformSpecificAPI::ServerAwardSteamAchievement, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlatformSpecificServerAwardSteamAchievementGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlatformSpecificServerAwardSteamAchievementGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlatformSpecificAwardSteamAchievementResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFPlayerDataManagement.cpp b/Source/PlayFabServices/Source/Generated/PFPlayerDataManagement.cpp new file mode 100644 index 0000000..e7992fb --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFPlayerDataManagement.cpp @@ -0,0 +1,698 @@ +#include "stdafx.h" +#include +#include "Generated/PlayerDataManagement.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::PlayerDataManagement; + +PF_API PFPlayerDataManagementClientGetUserDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementClientGetUserDataAsync), + std::bind(&PlayerDataManagementAPI::ClientGetUserData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementClientGetUserDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementClientGetUserDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFPlayerDataManagementClientGetUserPublisherDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementClientGetUserPublisherDataAsync), + std::bind(&PlayerDataManagementAPI::ClientGetUserPublisherData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementClientGetUserPublisherDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementClientGetUserPublisherDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFPlayerDataManagementClientGetUserPublisherReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementClientGetUserPublisherReadOnlyDataAsync), + std::bind(&PlayerDataManagementAPI::ClientGetUserPublisherReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementClientGetUserPublisherReadOnlyDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementClientGetUserPublisherReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFPlayerDataManagementClientGetUserReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementClientGetUserReadOnlyDataAsync), + std::bind(&PlayerDataManagementAPI::ClientGetUserReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementClientGetUserReadOnlyDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementClientGetUserReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementClientGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFPlayerDataManagementClientUpdateUserDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementClientUpdateUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementClientUpdateUserDataAsync), + std::bind(&PlayerDataManagementAPI::ClientUpdateUserData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementClientUpdateUserDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} + +PF_API PFPlayerDataManagementClientUpdateUserPublisherDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementClientUpdateUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementClientUpdateUserPublisherDataAsync), + std::bind(&PlayerDataManagementAPI::ClientUpdateUserPublisherData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementClientUpdateUserPublisherDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} + +#if 0 +PF_API PFPlayerDataManagementServerGetUserDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerGetUserDataAsync), + std::bind(&PlayerDataManagementAPI::ServerGetUserData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerGetUserDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementServerGetUserDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerGetUserInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerGetUserInternalDataAsync), + std::bind(&PlayerDataManagementAPI::ServerGetUserInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerGetUserInternalDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementServerGetUserInternalDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerGetUserPublisherDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerGetUserPublisherDataAsync), + std::bind(&PlayerDataManagementAPI::ServerGetUserPublisherData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerGetUserPublisherDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementServerGetUserPublisherDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerGetUserPublisherInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerGetUserPublisherInternalDataAsync), + std::bind(&PlayerDataManagementAPI::ServerGetUserPublisherInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerGetUserPublisherInternalDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementServerGetUserPublisherInternalDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerGetUserPublisherReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerGetUserPublisherReadOnlyDataAsync), + std::bind(&PlayerDataManagementAPI::ServerGetUserPublisherReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerGetUserPublisherReadOnlyDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementServerGetUserPublisherReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerGetUserReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementGetUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerGetUserReadOnlyDataAsync), + std::bind(&PlayerDataManagementAPI::ServerGetUserReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerGetUserReadOnlyDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFPlayerDataManagementServerGetUserReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFPlayerDataManagementServerGetUserDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerUpdateUserDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerUpdateUserDataAsync), + std::bind(&PlayerDataManagementAPI::ServerUpdateUserData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerUpdateUserDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerUpdateUserInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementUpdateUserInternalDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerUpdateUserInternalDataAsync), + std::bind(&PlayerDataManagementAPI::ServerUpdateUserInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerUpdateUserInternalDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerUpdateUserPublisherDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerUpdateUserPublisherDataAsync), + std::bind(&PlayerDataManagementAPI::ServerUpdateUserPublisherData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerUpdateUserPublisherDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerUpdateUserPublisherInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementUpdateUserInternalDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerUpdateUserPublisherInternalDataAsync), + std::bind(&PlayerDataManagementAPI::ServerUpdateUserPublisherInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerUpdateUserPublisherInternalDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataAsync), + std::bind(&PlayerDataManagementAPI::ServerUpdateUserPublisherReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFPlayerDataManagementServerUpdateUserReadOnlyDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPlayerDataManagementServerUpdateUserDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPlayerDataManagementServerUpdateUserReadOnlyDataAsync), + std::bind(&PlayerDataManagementAPI::ServerUpdateUserReadOnlyData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFPlayerDataManagementServerUpdateUserReadOnlyDataGetResult( + _In_ XAsyncBlock* async, + _Out_ PFPlayerDataManagementUpdateUserDataResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFPlayerDataManagementUpdateUserDataResult), result, nullptr); +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFProfiles.cpp b/Source/PlayFabServices/Source/Generated/PFProfiles.cpp new file mode 100644 index 0000000..2c68a50 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFProfiles.cpp @@ -0,0 +1,230 @@ +#include "stdafx.h" +#include +#include "Generated/Profiles.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Profiles; + +PF_API PFProfilesGetProfileAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFProfilesGetEntityProfileRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFProfilesGetProfileAsync), + std::bind(&ProfilesAPI::GetProfile, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFProfilesGetProfileGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFProfilesGetProfileGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesGetEntityProfileResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFProfilesGetProfilesAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFProfilesGetEntityProfilesRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFProfilesGetProfilesAsync), + std::bind(&ProfilesAPI::GetProfiles, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFProfilesGetProfilesGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFProfilesGetProfilesGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesGetEntityProfilesResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsAsync), + std::bind(&ProfilesAPI::GetTitlePlayersFromMasterPlayerAccountIds, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFProfilesSetProfileLanguageAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFProfilesSetProfileLanguageRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFProfilesSetProfileLanguageAsync), + std::bind(&ProfilesAPI::SetProfileLanguage, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFProfilesSetProfileLanguageGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFProfilesSetProfileLanguageGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesSetProfileLanguageResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFProfilesSetProfilePolicyAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFProfilesSetEntityProfilePolicyRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFProfilesSetProfilePolicyAsync), + std::bind(&ProfilesAPI::SetProfilePolicy, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFProfilesSetProfilePolicyGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFProfilesSetProfilePolicyGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFProfilesSetEntityProfilePolicyResponse** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + diff --git a/Source/PlayFabServices/Source/Generated/PFPushNotifications.cpp b/Source/PlayFabServices/Source/Generated/PFPushNotifications.cpp new file mode 100644 index 0000000..f5042c9 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFPushNotifications.cpp @@ -0,0 +1,54 @@ +#include "stdafx.h" +#include +#include "Generated/PushNotifications.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::PushNotifications; + +#if 0 +PF_API PFPushNotificationsServerSendPushNotificationAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPushNotificationsSendPushNotificationRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPushNotificationsServerSendPushNotificationAsync), + std::bind(&PushNotificationsAPI::ServerSendPushNotification, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFPushNotificationsServerSendPushNotificationFromTemplateAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFPushNotificationsSendPushNotificationFromTemplateRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFPushNotificationsServerSendPushNotificationFromTemplateAsync), + std::bind(&PushNotificationsAPI::ServerSendPushNotificationFromTemplate, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFSegments.cpp b/Source/PlayFabServices/Source/Generated/PFSegments.cpp new file mode 100644 index 0000000..b13b28a --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFSegments.cpp @@ -0,0 +1,322 @@ +#include "stdafx.h" +#include +#include "Generated/Segments.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::Segments; + +PF_API PFSegmentsClientGetPlayerSegmentsAsync( + _In_ PFEntityHandle contextHandle, + _In_ XAsyncBlock* async +) noexcept +{ + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsClientGetPlayerSegmentsAsync), + std::bind(&SegmentsAPI::ClientGetPlayerSegments, Entity::Duplicate(contextHandle), std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFSegmentsClientGetPlayerSegmentsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFSegmentsClientGetPlayerSegmentsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerSegmentsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFSegmentsClientGetPlayerTagsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFSegmentsGetPlayerTagsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsClientGetPlayerTagsAsync), + std::bind(&SegmentsAPI::ClientGetPlayerTags, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFSegmentsClientGetPlayerTagsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFSegmentsClientGetPlayerTagsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerTagsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if 0 +PF_API PFSegmentsServerAddPlayerTagAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFSegmentsAddPlayerTagRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsServerAddPlayerTagAsync), + std::bind(&SegmentsAPI::ServerAddPlayerTag, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFSegmentsServerGetAllSegmentsAsync( + _In_ PFEntityHandle contextHandle, + _In_ XAsyncBlock* async +) noexcept +{ + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsServerGetAllSegmentsAsync), + std::bind(&SegmentsAPI::ServerGetAllSegments, Entity::Duplicate(contextHandle), std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFSegmentsServerGetAllSegmentsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFSegmentsServerGetAllSegmentsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetAllSegmentsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFSegmentsServerGetPlayerSegmentsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFSegmentsGetPlayersSegmentsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsServerGetPlayerSegmentsAsync), + std::bind(&SegmentsAPI::ServerGetPlayerSegments, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFSegmentsServerGetPlayerSegmentsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFSegmentsServerGetPlayerSegmentsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerSegmentsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFSegmentsServerGetPlayersInSegmentAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFSegmentsGetPlayersInSegmentRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsServerGetPlayersInSegmentAsync), + std::bind(&SegmentsAPI::ServerGetPlayersInSegment, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFSegmentsServerGetPlayersInSegmentGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFSegmentsServerGetPlayersInSegmentGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayersInSegmentResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFSegmentsServerGetPlayerTagsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFSegmentsGetPlayerTagsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsServerGetPlayerTagsAsync), + std::bind(&SegmentsAPI::ServerGetPlayerTags, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFSegmentsServerGetPlayerTagsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFSegmentsServerGetPlayerTagsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFSegmentsGetPlayerTagsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFSegmentsServerRemovePlayerTagAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFSegmentsRemovePlayerTagRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFSegmentsServerRemovePlayerTagAsync), + std::bind(&SegmentsAPI::ServerRemovePlayerTag, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PFTitleDataManagement.cpp b/Source/PlayFabServices/Source/Generated/PFTitleDataManagement.cpp new file mode 100644 index 0000000..078b0c1 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PFTitleDataManagement.cpp @@ -0,0 +1,446 @@ +#include "stdafx.h" +#include +#include "Generated/TitleDataManagement.h" +#include "ApiXAsyncProvider.h" +#include "GlobalState.h" +#include + +using namespace PlayFab; +using namespace PlayFab::TitleDataManagement; + +PF_API PFTitleDataManagementClientGetPublisherDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementGetPublisherDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementClientGetPublisherDataAsync), + std::bind(&TitleDataManagementAPI::ClientGetPublisherData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementClientGetPublisherDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFTitleDataManagementClientGetPublisherDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetPublisherDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFTitleDataManagementClientGetTimeAsync( + _In_ PFEntityHandle contextHandle, + _In_ XAsyncBlock* async +) noexcept +{ + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementClientGetTimeAsync), + std::bind(&TitleDataManagementAPI::ClientGetTime, Entity::Duplicate(contextHandle), std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementClientGetTimeGetResult( + _In_ XAsyncBlock* async, + _Out_ PFTitleDataManagementGetTimeResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFTitleDataManagementGetTimeResult), result, nullptr); +} + +PF_API PFTitleDataManagementClientGetTitleDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementGetTitleDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementClientGetTitleDataAsync), + std::bind(&TitleDataManagementAPI::ClientGetTitleData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementClientGetTitleDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFTitleDataManagementClientGetTitleDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +PF_API PFTitleDataManagementClientGetTitleNewsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementGetTitleNewsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementClientGetTitleNewsAsync), + std::bind(&TitleDataManagementAPI::ClientGetTitleNews, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementClientGetTitleNewsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFTitleDataManagementClientGetTitleNewsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleNewsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} + +#if 0 +PF_API PFTitleDataManagementServerGetPublisherDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementGetPublisherDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerGetPublisherDataAsync), + std::bind(&TitleDataManagementAPI::ServerGetPublisherData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementServerGetPublisherDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFTitleDataManagementServerGetPublisherDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetPublisherDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFTitleDataManagementServerGetTimeAsync( + _In_ PFEntityHandle contextHandle, + _In_ XAsyncBlock* async +) noexcept +{ + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerGetTimeAsync), + std::bind(&TitleDataManagementAPI::ServerGetTime, Entity::Duplicate(contextHandle), std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementServerGetTimeGetResult( + _In_ XAsyncBlock* async, + _Out_ PFTitleDataManagementGetTimeResult* result +) noexcept +{ + return XAsyncGetResult(async, nullptr, sizeof(PFTitleDataManagementGetTimeResult), result, nullptr); +} +#endif + +#if 0 +PF_API PFTitleDataManagementServerGetTitleDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementGetTitleDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerGetTitleDataAsync), + std::bind(&TitleDataManagementAPI::ServerGetTitleData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementServerGetTitleDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFTitleDataManagementServerGetTitleDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFTitleDataManagementServerGetTitleInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementGetTitleDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerGetTitleInternalDataAsync), + std::bind(&TitleDataManagementAPI::ServerGetTitleInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementServerGetTitleInternalDataGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFTitleDataManagementServerGetTitleInternalDataGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleDataResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFTitleDataManagementServerGetTitleNewsAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementGetTitleNewsRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerGetTitleNewsAsync), + std::bind(&TitleDataManagementAPI::ServerGetTitleNews, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} + +PF_API PFTitleDataManagementServerGetTitleNewsGetResultSize( + _In_ XAsyncBlock* async, + _Out_ size_t* bufferSize +) noexcept +{ + return XAsyncGetResultSize(async, bufferSize); +} + +PF_API PFTitleDataManagementServerGetTitleNewsGetResult( + _In_ XAsyncBlock* async, + _In_ size_t bufferSize, + _Out_writes_bytes_to_(bufferSize, *bufferUsed) void* buffer, + _Outptr_ PFTitleDataManagementGetTitleNewsResult** result, + _Out_opt_ size_t* bufferUsed +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(result); + + RETURN_IF_FAILED(XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed)); + *result = static_cast(buffer); + + return S_OK; +} +#endif + +#if 0 +PF_API PFTitleDataManagementServerSetPublisherDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementSetPublisherDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerSetPublisherDataAsync), + std::bind(&TitleDataManagementAPI::ServerSetPublisherData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFTitleDataManagementServerSetTitleDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementSetTitleDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerSetTitleDataAsync), + std::bind(&TitleDataManagementAPI::ServerSetTitleData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + +#if 0 +PF_API PFTitleDataManagementServerSetTitleInternalDataAsync( + _In_ PFEntityHandle contextHandle, + _In_ const PFTitleDataManagementSetTitleDataRequest* request, + _In_ XAsyncBlock* async +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(request); + + SharedPtr state{ nullptr }; + RETURN_IF_FAILED(GlobalState::Get(state)); + + auto provider = MakeProvider( + state->RunContext().DeriveOnQueue(async->queue), + async, + XASYNC_IDENTITY(PFTitleDataManagementServerSetTitleInternalDataAsync), + std::bind(&TitleDataManagementAPI::ServerSetTitleInternalData, Entity::Duplicate(contextHandle), *request, std::placeholders::_1) + ); + return XAsyncProviderBase::Run(std::move(provider)); +} +#endif + diff --git a/Source/PlayFabServices/Source/Generated/PlatformSpecific.cpp b/Source/PlayFabServices/Source/Generated/PlatformSpecific.cpp new file mode 100644 index 0000000..22722a8 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlatformSpecific.cpp @@ -0,0 +1,146 @@ +#include "stdafx.h" +#include "PlatformSpecific.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace PlatformSpecific +{ + + +AsyncOp PlatformSpecificAPI::ClientAndroidDevicePushNotificationRegistration( + Entity const& entity, + const AndroidDevicePushNotificationRegistrationRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/AndroidDevicePushNotificationRegistration" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlatformSpecificClientAndroidDevicePushNotificationRegistration, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlatformSpecificAPI::ClientRefreshPSNAuthToken( + Entity const& entity, + const RefreshPSNAuthTokenRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/RefreshPSNAuthToken" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlatformSpecificClientRefreshPSNAuthToken, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlatformSpecificAPI::ClientRegisterForIOSPushNotification( + Entity const& entity, + const RegisterForIOSPushNotificationRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/RegisterForIOSPushNotification" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlatformSpecificClientRegisterForIOSPushNotification, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlatformSpecificAPI::ServerAwardSteamAchievement( + Entity const& entity, + const AwardSteamAchievementRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/AwardSteamAchievement" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlatformSpecificServerAwardSteamAchievement, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + AwardSteamAchievementResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace PlatformSpecific +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PlatformSpecific.h b/Source/PlayFabServices/Source/Generated/PlatformSpecific.h new file mode 100644 index 0000000..0e9de1d --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlatformSpecific.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include "PlatformSpecificTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace PlatformSpecific +{ + +class PlatformSpecificAPI +{ +public: + PlatformSpecificAPI() = delete; + PlatformSpecificAPI(const PlatformSpecificAPI& source) = delete; + PlatformSpecificAPI& operator=(const PlatformSpecificAPI& source) = delete; + ~PlatformSpecificAPI() = default; + + // ------------ Generated API calls + static AsyncOp ClientAndroidDevicePushNotificationRegistration(Entity const& entity, const AndroidDevicePushNotificationRegistrationRequest& request, RunContext rc); + static AsyncOp ClientRefreshPSNAuthToken(Entity const& entity, const RefreshPSNAuthTokenRequest& request, RunContext rc); + static AsyncOp ClientRegisterForIOSPushNotification(Entity const& entity, const RegisterForIOSPushNotificationRequest& request, RunContext rc); + static AsyncOp ServerAwardSteamAchievement(Entity const& entity, const AwardSteamAchievementRequest& request, RunContext rc); +}; + +} // namespace PlatformSpecific +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.cpp b/Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.cpp new file mode 100644 index 0000000..5f80a15 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.cpp @@ -0,0 +1,176 @@ +#include "stdafx.h" +#include "PlatformSpecificTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace PlatformSpecific +{ + +JsonValue AndroidDevicePushNotificationRegistrationRequest::ToJson() const +{ + return AndroidDevicePushNotificationRegistrationRequest::ToJson(this->Model()); +} + +JsonValue AndroidDevicePushNotificationRegistrationRequest::ToJson(const PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ConfirmationMessage", input.confirmationMessage); + JsonUtils::ObjectAddMember(output, "DeviceToken", input.deviceToken); + JsonUtils::ObjectAddMember(output, "SendPushNotificationConfirmation", input.sendPushNotificationConfirmation); + return output; +} + +JsonValue RefreshPSNAuthTokenRequest::ToJson() const +{ + return RefreshPSNAuthTokenRequest::ToJson(this->Model()); +} + +JsonValue RefreshPSNAuthTokenRequest::ToJson(const PFPlatformSpecificRefreshPSNAuthTokenRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AuthCode", input.authCode); + JsonUtils::ObjectAddMember(output, "IssuerId", input.issuerId); + JsonUtils::ObjectAddMember(output, "RedirectUri", input.redirectUri); + return output; +} + +JsonValue RegisterForIOSPushNotificationRequest::ToJson() const +{ + return RegisterForIOSPushNotificationRequest::ToJson(this->Model()); +} + +JsonValue RegisterForIOSPushNotificationRequest::ToJson(const PFPlatformSpecificRegisterForIOSPushNotificationRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ConfirmationMessage", input.confirmationMessage); + JsonUtils::ObjectAddMember(output, "DeviceToken", input.deviceToken); + JsonUtils::ObjectAddMember(output, "SendPushNotificationConfirmation", input.sendPushNotificationConfirmation); + return output; +} + +JsonValue AwardSteamAchievementItem::ToJson() const +{ + return AwardSteamAchievementItem::ToJson(this->Model()); +} + +JsonValue AwardSteamAchievementItem::ToJson(const PFPlatformSpecificAwardSteamAchievementItem& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "AchievementName", input.achievementName); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "Result", input.result); + return output; +} + +HRESULT AwardSteamAchievementItem::FromJson(const JsonValue& input) +{ + String achievementName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AchievementName", achievementName)); + this->SetAchievementName(std::move(achievementName)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Result", this->m_model.result)); + + return S_OK; +} + +size_t AwardSteamAchievementItem::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AwardSteamAchievementItem::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AwardSteamAchievementItem::RequiredBufferSize(const PFPlatformSpecificAwardSteamAchievementItem& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.achievementName) + { + requiredSize += (std::strlen(model.achievementName) + 1); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT AwardSteamAchievementItem::Copy(const PFPlatformSpecificAwardSteamAchievementItem& input, PFPlatformSpecificAwardSteamAchievementItem& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.achievementName); + RETURN_IF_FAILED(propCopyResult.hr); + output.achievementName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue AwardSteamAchievementRequest::ToJson() const +{ + return AwardSteamAchievementRequest::ToJson(this->Model()); +} + +JsonValue AwardSteamAchievementRequest::ToJson(const PFPlatformSpecificAwardSteamAchievementRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Achievements", input.achievements, input.achievementsCount); + return output; +} + +HRESULT AwardSteamAchievementResult::FromJson(const JsonValue& input) +{ + ModelVector achievementResults{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AchievementResults", achievementResults)); + this->SetAchievementResults(std::move(achievementResults)); + + return S_OK; +} + +size_t AwardSteamAchievementResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AwardSteamAchievementResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AwardSteamAchievementResult::RequiredBufferSize(const PFPlatformSpecificAwardSteamAchievementResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFPlatformSpecificAwardSteamAchievementItem*) + sizeof(PFPlatformSpecificAwardSteamAchievementItem*) * model.achievementResultsCount); + for (size_t i = 0; i < model.achievementResultsCount; ++i) + { + requiredSize += AwardSteamAchievementItem::RequiredBufferSize(*model.achievementResults[i]); + } + return requiredSize; +} + +HRESULT AwardSteamAchievementResult::Copy(const PFPlatformSpecificAwardSteamAchievementResult& input, PFPlatformSpecificAwardSteamAchievementResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.achievementResults, input.achievementResultsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.achievementResults = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace PlatformSpecific +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.h b/Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.h new file mode 100644 index 0000000..888841e --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlatformSpecificTypes.h @@ -0,0 +1,112 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace PlatformSpecific +{ + +// PlatformSpecific Classes +class AndroidDevicePushNotificationRegistrationRequest : public Wrappers::PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequest& input); +}; + +class RefreshPSNAuthTokenRequest : public Wrappers::PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlatformSpecificRefreshPSNAuthTokenRequest& input); +}; + +class RegisterForIOSPushNotificationRequest : public Wrappers::PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlatformSpecificRegisterForIOSPushNotificationRequest& input); +}; + +class AwardSteamAchievementItem : public Wrappers::PFPlatformSpecificAwardSteamAchievementItemWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlatformSpecificAwardSteamAchievementItemWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlatformSpecificAwardSteamAchievementItem& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPlatformSpecificAwardSteamAchievementItem& model); + static HRESULT Copy(const PFPlatformSpecificAwardSteamAchievementItem& input, PFPlatformSpecificAwardSteamAchievementItem& output, ModelBuffer& buffer); +}; + +class AwardSteamAchievementRequest : public Wrappers::PFPlatformSpecificAwardSteamAchievementRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlatformSpecificAwardSteamAchievementRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlatformSpecificAwardSteamAchievementRequest& input); +}; + +class AwardSteamAchievementResult : public Wrappers::PFPlatformSpecificAwardSteamAchievementResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlatformSpecificAwardSteamAchievementResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPlatformSpecificAwardSteamAchievementResult& model); + static HRESULT Copy(const PFPlatformSpecificAwardSteamAchievementResult& input, PFPlatformSpecificAwardSteamAchievementResult& output, ModelBuffer& buffer); +}; + +} // namespace PlatformSpecific +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PlayerDataManagement.cpp b/Source/PlayFabServices/Source/Generated/PlayerDataManagement.cpp new file mode 100644 index 0000000..edbbcc6 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlayerDataManagement.cpp @@ -0,0 +1,642 @@ +#include "stdafx.h" +#include "PlayerDataManagement.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace PlayerDataManagement +{ + + +AsyncOp PlayerDataManagementAPI::ClientGetUserData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetUserData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlayerDataManagementClientGetUserData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ClientGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ClientGetUserPublisherData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetUserPublisherData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlayerDataManagementClientGetUserPublisherData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ClientGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ClientGetUserPublisherReadOnlyData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetUserPublisherReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlayerDataManagementClientGetUserPublisherReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ClientGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ClientGetUserReadOnlyData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetUserReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlayerDataManagementClientGetUserReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ClientGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ClientUpdateUserData( + Entity const& entity, + const ClientUpdateUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UpdateUserData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlayerDataManagementClientUpdateUserData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ClientUpdateUserPublisherData( + Entity const& entity, + const ClientUpdateUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/UpdateUserPublisherData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::PlayerDataManagementClientUpdateUserPublisherData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerGetUserData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerGetUserData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerGetUserInternalData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerGetUserInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerGetUserPublisherData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserPublisherData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerGetUserPublisherData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerGetUserPublisherInternalData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserPublisherInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerGetUserPublisherInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerGetUserPublisherReadOnlyData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserPublisherReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerGetUserPublisherReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerGetUserReadOnlyData( + Entity const& entity, + const GetUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetUserReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerGetUserReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + ServerGetUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerUpdateUserData( + Entity const& entity, + const ServerUpdateUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateUserData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerUpdateUserData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerUpdateUserInternalData( + Entity const& entity, + const UpdateUserInternalDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateUserInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerUpdateUserInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerUpdateUserPublisherData( + Entity const& entity, + const ServerUpdateUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateUserPublisherData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerUpdateUserPublisherData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerUpdateUserPublisherInternalData( + Entity const& entity, + const UpdateUserInternalDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateUserPublisherInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerUpdateUserPublisherInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerUpdateUserPublisherReadOnlyData( + Entity const& entity, + const ServerUpdateUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateUserPublisherReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerUpdateUserPublisherReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PlayerDataManagementAPI::ServerUpdateUserReadOnlyData( + Entity const& entity, + const ServerUpdateUserDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/UpdateUserReadOnlyData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PlayerDataManagementServerUpdateUserReadOnlyData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + UpdateUserDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace PlayerDataManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PlayerDataManagement.h b/Source/PlayFabServices/Source/Generated/PlayerDataManagement.h new file mode 100644 index 0000000..327da90 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlayerDataManagement.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include "PlayerDataManagementTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace PlayerDataManagement +{ + +class PlayerDataManagementAPI +{ +public: + PlayerDataManagementAPI() = delete; + PlayerDataManagementAPI(const PlayerDataManagementAPI& source) = delete; + PlayerDataManagementAPI& operator=(const PlayerDataManagementAPI& source) = delete; + ~PlayerDataManagementAPI() = default; + + // ------------ Generated API calls + static AsyncOp ClientGetUserData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ClientGetUserPublisherData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ClientGetUserPublisherReadOnlyData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ClientGetUserReadOnlyData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ClientUpdateUserData(Entity const& entity, const ClientUpdateUserDataRequest& request, RunContext rc); + static AsyncOp ClientUpdateUserPublisherData(Entity const& entity, const ClientUpdateUserDataRequest& request, RunContext rc); + static AsyncOp ServerGetUserData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ServerGetUserInternalData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ServerGetUserPublisherData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ServerGetUserPublisherInternalData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ServerGetUserPublisherReadOnlyData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ServerGetUserReadOnlyData(Entity const& entity, const GetUserDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateUserData(Entity const& entity, const ServerUpdateUserDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateUserInternalData(Entity const& entity, const UpdateUserInternalDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateUserPublisherData(Entity const& entity, const ServerUpdateUserDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateUserPublisherInternalData(Entity const& entity, const UpdateUserInternalDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateUserPublisherReadOnlyData(Entity const& entity, const ServerUpdateUserDataRequest& request, RunContext rc); + static AsyncOp ServerUpdateUserReadOnlyData(Entity const& entity, const ServerUpdateUserDataRequest& request, RunContext rc); +}; + +} // namespace PlayerDataManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.cpp b/Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.cpp new file mode 100644 index 0000000..13f83f7 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.cpp @@ -0,0 +1,203 @@ +#include "stdafx.h" +#include "PlayerDataManagementTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace PlayerDataManagement +{ + +JsonValue GetUserDataRequest::ToJson() const +{ + return GetUserDataRequest::ToJson(this->Model()); +} + +JsonValue GetUserDataRequest::ToJson(const PFPlayerDataManagementGetUserDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "IfChangedFromDataVersion", input.ifChangedFromDataVersion); + JsonUtils::ObjectAddMemberArray(output, "Keys", input.keys, input.keysCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT ClientGetUserDataResult::FromJson(const JsonValue& input) +{ + ModelDictionaryEntryVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataVersion", this->m_model.dataVersion)); + + return S_OK; +} + +size_t ClientGetUserDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ClientGetUserDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ClientGetUserDataResult::RequiredBufferSize(const PFPlayerDataManagementClientGetUserDataResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += (std::strlen(model.data[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.data[i].value); + } + return requiredSize; +} + +HRESULT ClientGetUserDataResult::Copy(const PFPlayerDataManagementClientGetUserDataResult& input, PFPlayerDataManagementClientGetUserDataResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToDictionary(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ClientUpdateUserDataRequest::ToJson() const +{ + return ClientUpdateUserDataRequest::ToJson(this->Model()); +} + +JsonValue ClientUpdateUserDataRequest::ToJson(const PFPlayerDataManagementClientUpdateUserDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberDictionary(output, "Data", input.data, input.dataCount); + JsonUtils::ObjectAddMemberArray(output, "KeysToRemove", input.keysToRemove, input.keysToRemoveCount); + JsonUtils::ObjectAddMember(output, "Permission", input.permission); + return output; +} + +HRESULT UpdateUserDataResult::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataVersion", this->m_model.dataVersion)); + + return S_OK; +} + +size_t UpdateUserDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result UpdateUserDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t UpdateUserDataResult::RequiredBufferSize(const PFPlayerDataManagementUpdateUserDataResult& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT UpdateUserDataResult::Copy(const PFPlayerDataManagementUpdateUserDataResult& input, PFPlayerDataManagementUpdateUserDataResult& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +HRESULT ServerGetUserDataResult::FromJson(const JsonValue& input) +{ + ModelDictionaryEntryVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataVersion", this->m_model.dataVersion)); + + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + return S_OK; +} + +size_t ServerGetUserDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ServerGetUserDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ServerGetUserDataResult::RequiredBufferSize(const PFPlayerDataManagementServerGetUserDataResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFUserDataRecordDictionaryEntry) + sizeof(PFUserDataRecordDictionaryEntry) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += (std::strlen(model.data[i].key) + 1); + requiredSize += UserDataRecord::RequiredBufferSize(*model.data[i].value); + } + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + return requiredSize; +} + +HRESULT ServerGetUserDataResult::Copy(const PFPlayerDataManagementServerGetUserDataResult& input, PFPlayerDataManagementServerGetUserDataResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToDictionary(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue ServerUpdateUserDataRequest::ToJson() const +{ + return ServerUpdateUserDataRequest::ToJson(this->Model()); +} + +JsonValue ServerUpdateUserDataRequest::ToJson(const PFPlayerDataManagementServerUpdateUserDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberDictionary(output, "Data", input.data, input.dataCount); + JsonUtils::ObjectAddMemberArray(output, "KeysToRemove", input.keysToRemove, input.keysToRemoveCount); + JsonUtils::ObjectAddMember(output, "Permission", input.permission); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue UpdateUserInternalDataRequest::ToJson() const +{ + return UpdateUserInternalDataRequest::ToJson(this->Model()); +} + +JsonValue UpdateUserInternalDataRequest::ToJson(const PFPlayerDataManagementUpdateUserInternalDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberDictionary(output, "Data", input.data, input.dataCount); + JsonUtils::ObjectAddMemberArray(output, "KeysToRemove", input.keysToRemove, input.keysToRemoveCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +} // namespace PlayerDataManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.h b/Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.h new file mode 100644 index 0000000..ac82b69 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PlayerDataManagementTypes.h @@ -0,0 +1,128 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace PlayerDataManagement +{ + +// PlayerDataManagement Classes +class GetUserDataRequest : public Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlayerDataManagementGetUserDataRequest& input); +}; + +class ClientGetUserDataResult : public Wrappers::PFPlayerDataManagementClientGetUserDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerDataManagementClientGetUserDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPlayerDataManagementClientGetUserDataResult& model); + static HRESULT Copy(const PFPlayerDataManagementClientGetUserDataResult& input, PFPlayerDataManagementClientGetUserDataResult& output, ModelBuffer& buffer); +}; + +class ClientUpdateUserDataRequest : public Wrappers::PFPlayerDataManagementClientUpdateUserDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerDataManagementClientUpdateUserDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlayerDataManagementClientUpdateUserDataRequest& input); +}; + +class UpdateUserDataResult : public Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPlayerDataManagementUpdateUserDataResult& model); + static HRESULT Copy(const PFPlayerDataManagementUpdateUserDataResult& input, PFPlayerDataManagementUpdateUserDataResult& output, ModelBuffer& buffer); +}; + +class ServerGetUserDataResult : public Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFPlayerDataManagementServerGetUserDataResult& model); + static HRESULT Copy(const PFPlayerDataManagementServerGetUserDataResult& input, PFPlayerDataManagementServerGetUserDataResult& output, ModelBuffer& buffer); +}; + +class ServerUpdateUserDataRequest : public Wrappers::PFPlayerDataManagementServerUpdateUserDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerDataManagementServerUpdateUserDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlayerDataManagementServerUpdateUserDataRequest& input); +}; + +class UpdateUserInternalDataRequest : public Wrappers::PFPlayerDataManagementUpdateUserInternalDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPlayerDataManagementUpdateUserInternalDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPlayerDataManagementUpdateUserInternalDataRequest& input); +}; + +} // namespace PlayerDataManagement +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Profiles.cpp b/Source/PlayFabServices/Source/Generated/Profiles.cpp new file mode 100644 index 0000000..7d7b7e0 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Profiles.cpp @@ -0,0 +1,187 @@ +#include "stdafx.h" +#include "Profiles.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Profiles +{ + + +AsyncOp ProfilesAPI::GetProfile( + Entity const& entity, + const GetEntityProfileRequest& request, + RunContext rc +) +{ + const char* path{ "/Profile/GetProfile" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::ProfilesGetProfile, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetEntityProfileResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp ProfilesAPI::GetProfiles( + Entity const& entity, + const GetEntityProfilesRequest& request, + RunContext rc +) +{ + const char* path{ "/Profile/GetProfiles" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::ProfilesGetProfiles, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetEntityProfilesResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp ProfilesAPI::GetTitlePlayersFromMasterPlayerAccountIds( + Entity const& entity, + const GetTitlePlayersFromMasterPlayerAccountIdsRequest& request, + RunContext rc +) +{ + const char* path{ "/Profile/GetTitlePlayersFromMasterPlayerAccountIds" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::ProfilesGetTitlePlayersFromMasterPlayerAccountIds, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitlePlayersFromMasterPlayerAccountIdsResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp ProfilesAPI::SetProfileLanguage( + Entity const& entity, + const SetProfileLanguageRequest& request, + RunContext rc +) +{ + const char* path{ "/Profile/SetProfileLanguage" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::ProfilesSetProfileLanguage, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + SetProfileLanguageResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp ProfilesAPI::SetProfilePolicy( + Entity const& entity, + const SetEntityProfilePolicyRequest& request, + RunContext rc +) +{ + const char* path{ "/Profile/SetProfilePolicy" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::ProfilesSetProfilePolicy, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + SetEntityProfilePolicyResponse resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Profiles +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Profiles.h b/Source/PlayFabServices/Source/Generated/Profiles.h new file mode 100644 index 0000000..765ee3e --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Profiles.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include +#include "ProfilesTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Profiles +{ + +class ProfilesAPI +{ +public: + ProfilesAPI() = delete; + ProfilesAPI(const ProfilesAPI& source) = delete; + ProfilesAPI& operator=(const ProfilesAPI& source) = delete; + ~ProfilesAPI() = default; + + // ------------ Generated API calls + static AsyncOp GetProfile(Entity const& entity, const GetEntityProfileRequest& request, RunContext rc); + static AsyncOp GetProfiles(Entity const& entity, const GetEntityProfilesRequest& request, RunContext rc); + static AsyncOp GetTitlePlayersFromMasterPlayerAccountIds(Entity const& entity, const GetTitlePlayersFromMasterPlayerAccountIdsRequest& request, RunContext rc); + static AsyncOp SetProfileLanguage(Entity const& entity, const SetProfileLanguageRequest& request, RunContext rc); + static AsyncOp SetProfilePolicy(Entity const& entity, const SetEntityProfilePolicyRequest& request, RunContext rc); +}; + +} // namespace Profiles +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/ProfilesTypes.cpp b/Source/PlayFabServices/Source/Generated/ProfilesTypes.cpp new file mode 100644 index 0000000..c06afb3 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/ProfilesTypes.cpp @@ -0,0 +1,806 @@ +#include "stdafx.h" +#include "ProfilesTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Profiles +{ + +JsonValue GetEntityProfileRequest::ToJson() const +{ + return GetEntityProfileRequest::ToJson(this->Model()); +} + +JsonValue GetEntityProfileRequest::ToJson(const PFProfilesGetEntityProfileRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DataAsObject", input.dataAsObject); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + return output; +} + +HRESULT EntityProfileFileMetadata::FromJson(const JsonValue& input) +{ + String checksum{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Checksum", checksum)); + this->SetChecksum(std::move(checksum)); + + String fileName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "FileName", fileName)); + this->SetFileName(std::move(fileName)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastModified", this->m_model.lastModified)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Size", this->m_model.size)); + + return S_OK; +} + +size_t EntityProfileFileMetadata::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityProfileFileMetadata::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityProfileFileMetadata::RequiredBufferSize(const PFProfilesEntityProfileFileMetadata& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.checksum) + { + requiredSize += (std::strlen(model.checksum) + 1); + } + if (model.fileName) + { + requiredSize += (std::strlen(model.fileName) + 1); + } + return requiredSize; +} + +HRESULT EntityProfileFileMetadata::Copy(const PFProfilesEntityProfileFileMetadata& input, PFProfilesEntityProfileFileMetadata& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.checksum); + RETURN_IF_FAILED(propCopyResult.hr); + output.checksum = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.fileName); + RETURN_IF_FAILED(propCopyResult.hr); + output.fileName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT EntityDataObject::FromJson(const JsonValue& input) +{ + JsonObject dataObject{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DataObject", dataObject)); + this->SetDataObject(std::move(dataObject)); + + String escapedDataObject{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EscapedDataObject", escapedDataObject)); + this->SetEscapedDataObject(std::move(escapedDataObject)); + + String objectName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ObjectName", objectName)); + this->SetObjectName(std::move(objectName)); + + return S_OK; +} + +size_t EntityDataObject::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityDataObject::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityDataObject::RequiredBufferSize(const PFProfilesEntityDataObject& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.dataObject.stringValue) + { + requiredSize += (std::strlen(model.dataObject.stringValue) + 1); + } + if (model.escapedDataObject) + { + requiredSize += (std::strlen(model.escapedDataObject) + 1); + } + if (model.objectName) + { + requiredSize += (std::strlen(model.objectName) + 1); + } + return requiredSize; +} + +HRESULT EntityDataObject::Copy(const PFProfilesEntityDataObject& input, PFProfilesEntityDataObject& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.dataObject.stringValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.dataObject.stringValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.escapedDataObject); + RETURN_IF_FAILED(propCopyResult.hr); + output.escapedDataObject = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.objectName); + RETURN_IF_FAILED(propCopyResult.hr); + output.objectName = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue EntityPermissionStatement::ToJson() const +{ + return EntityPermissionStatement::ToJson(this->Model()); +} + +JsonValue EntityPermissionStatement::ToJson(const PFProfilesEntityPermissionStatement& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Action", input.action); + JsonUtils::ObjectAddMember(output, "Comment", input.comment); + JsonUtils::ObjectAddMember(output, "Condition", input.condition); + JsonUtils::ObjectAddMember(output, "Effect", input.effect); + JsonUtils::ObjectAddMember(output, "Principal", input.principal); + JsonUtils::ObjectAddMember(output, "Resource", input.resource); + return output; +} + +HRESULT EntityPermissionStatement::FromJson(const JsonValue& input) +{ + String action{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Action", action)); + this->SetAction(std::move(action)); + + String comment{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Comment", comment)); + this->SetComment(std::move(comment)); + + JsonObject condition{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Condition", condition)); + this->SetCondition(std::move(condition)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Effect", this->m_model.effect)); + + JsonObject principal{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Principal", principal)); + this->SetPrincipal(std::move(principal)); + + String resource{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Resource", resource)); + this->SetResource(std::move(resource)); + + return S_OK; +} + +size_t EntityPermissionStatement::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityPermissionStatement::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityPermissionStatement::RequiredBufferSize(const PFProfilesEntityPermissionStatement& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.action) + { + requiredSize += (std::strlen(model.action) + 1); + } + if (model.comment) + { + requiredSize += (std::strlen(model.comment) + 1); + } + if (model.condition.stringValue) + { + requiredSize += (std::strlen(model.condition.stringValue) + 1); + } + if (model.principal.stringValue) + { + requiredSize += (std::strlen(model.principal.stringValue) + 1); + } + if (model.resource) + { + requiredSize += (std::strlen(model.resource) + 1); + } + return requiredSize; +} + +HRESULT EntityPermissionStatement::Copy(const PFProfilesEntityPermissionStatement& input, PFProfilesEntityPermissionStatement& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.action); + RETURN_IF_FAILED(propCopyResult.hr); + output.action = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.comment); + RETURN_IF_FAILED(propCopyResult.hr); + output.comment = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.condition.stringValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.condition.stringValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.principal.stringValue); + RETURN_IF_FAILED(propCopyResult.hr); + output.principal.stringValue = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.resource); + RETURN_IF_FAILED(propCopyResult.hr); + output.resource = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT EntityStatisticValue::FromJson(const JsonValue& input) +{ + String metadata{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Metadata", metadata)); + this->SetMetadata(std::move(metadata)); + + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + std::optional value{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Value", value)); + this->SetValue(std::move(value)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Version", this->m_model.version)); + + return S_OK; +} + +size_t EntityStatisticValue::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityStatisticValue::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityStatisticValue::RequiredBufferSize(const PFProfilesEntityStatisticValue& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.metadata) + { + requiredSize += (std::strlen(model.metadata) + 1); + } + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + if (model.value) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + return requiredSize; +} + +HRESULT EntityStatisticValue::Copy(const PFProfilesEntityStatisticValue& input, PFProfilesEntityStatisticValue& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.metadata); + RETURN_IF_FAILED(propCopyResult.hr); + output.metadata = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.value); + RETURN_IF_FAILED(propCopyResult.hr); + output.value = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT EntityProfileBody::FromJson(const JsonValue& input) +{ + String avatarUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AvatarUrl", avatarUrl)); + this->SetAvatarUrl(std::move(avatarUrl)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", this->m_model.created)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + std::optional entity{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Entity", entity)); + if (entity) + { + this->SetEntity(std::move(*entity)); + } + + String entityChain{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EntityChain", entityChain)); + this->SetEntityChain(std::move(entityChain)); + + CStringVector experimentVariants{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ExperimentVariants", experimentVariants)); + this->SetExperimentVariants(std::move(experimentVariants)); + + ModelDictionaryEntryVector files{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Files", files)); + this->SetFiles(std::move(files)); + + String language{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Language", language)); + this->SetLanguage(std::move(language)); + + std::optional lineage{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Lineage", lineage)); + if (lineage) + { + this->SetLineage(std::move(*lineage)); + } + + ModelDictionaryEntryVector objects{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Objects", objects)); + this->SetObjects(std::move(objects)); + + ModelVector permissions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Permissions", permissions)); + this->SetPermissions(std::move(permissions)); + + ModelDictionaryEntryVector statistics{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Statistics", statistics)); + this->SetStatistics(std::move(statistics)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VersionNumber", this->m_model.versionNumber)); + + return S_OK; +} + +size_t EntityProfileBody::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result EntityProfileBody::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t EntityProfileBody::RequiredBufferSize(const PFProfilesEntityProfileBody& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.avatarUrl) + { + requiredSize += (std::strlen(model.avatarUrl) + 1); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + if (model.entity) + { + requiredSize += EntityKey::RequiredBufferSize(*model.entity); + } + if (model.entityChain) + { + requiredSize += (std::strlen(model.entityChain) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.experimentVariantsCount); + for (size_t i = 0; i < model.experimentVariantsCount; ++i) + { + requiredSize += (std::strlen(model.experimentVariants[i]) + 1); + } + requiredSize += (alignof(PFProfilesEntityProfileFileMetadataDictionaryEntry) + sizeof(PFProfilesEntityProfileFileMetadataDictionaryEntry) * model.filesCount); + for (size_t i = 0; i < model.filesCount; ++i) + { + requiredSize += (std::strlen(model.files[i].key) + 1); + requiredSize += EntityProfileFileMetadata::RequiredBufferSize(*model.files[i].value); + } + if (model.language) + { + requiredSize += (std::strlen(model.language) + 1); + } + if (model.lineage) + { + requiredSize += EntityLineage::RequiredBufferSize(*model.lineage); + } + requiredSize += (alignof(PFProfilesEntityDataObjectDictionaryEntry) + sizeof(PFProfilesEntityDataObjectDictionaryEntry) * model.objectsCount); + for (size_t i = 0; i < model.objectsCount; ++i) + { + requiredSize += (std::strlen(model.objects[i].key) + 1); + requiredSize += EntityDataObject::RequiredBufferSize(*model.objects[i].value); + } + requiredSize += (alignof(PFProfilesEntityPermissionStatement*) + sizeof(PFProfilesEntityPermissionStatement*) * model.permissionsCount); + for (size_t i = 0; i < model.permissionsCount; ++i) + { + requiredSize += EntityPermissionStatement::RequiredBufferSize(*model.permissions[i]); + } + requiredSize += (alignof(PFProfilesEntityStatisticValueDictionaryEntry) + sizeof(PFProfilesEntityStatisticValueDictionaryEntry) * model.statisticsCount); + for (size_t i = 0; i < model.statisticsCount; ++i) + { + requiredSize += (std::strlen(model.statistics[i].key) + 1); + requiredSize += EntityStatisticValue::RequiredBufferSize(*model.statistics[i].value); + } + return requiredSize; +} + +HRESULT EntityProfileBody::Copy(const PFProfilesEntityProfileBody& input, PFProfilesEntityProfileBody& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.avatarUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.avatarUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.entity); + RETURN_IF_FAILED(propCopyResult.hr); + output.entity = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.entityChain); + RETURN_IF_FAILED(propCopyResult.hr); + output.entityChain = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.experimentVariants, input.experimentVariantsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.experimentVariants = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.files, input.filesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.files = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.language); + RETURN_IF_FAILED(propCopyResult.hr); + output.language = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lineage); + RETURN_IF_FAILED(propCopyResult.hr); + output.lineage = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.objects, input.objectsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.objects = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.permissions, input.permissionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.permissions = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.statistics, input.statisticsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.statistics = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetEntityProfileResponse::FromJson(const JsonValue& input) +{ + std::optional profile{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Profile", profile)); + if (profile) + { + this->SetProfile(std::move(*profile)); + } + + return S_OK; +} + +size_t GetEntityProfileResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetEntityProfileResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetEntityProfileResponse::RequiredBufferSize(const PFProfilesGetEntityProfileResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.profile) + { + requiredSize += EntityProfileBody::RequiredBufferSize(*model.profile); + } + return requiredSize; +} + +HRESULT GetEntityProfileResponse::Copy(const PFProfilesGetEntityProfileResponse& input, PFProfilesGetEntityProfileResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.profile); + RETURN_IF_FAILED(propCopyResult.hr); + output.profile = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetEntityProfilesRequest::ToJson() const +{ + return GetEntityProfilesRequest::ToJson(this->Model()); +} + +JsonValue GetEntityProfilesRequest::ToJson(const PFProfilesGetEntityProfilesRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "DataAsObject", input.dataAsObject); + JsonUtils::ObjectAddMemberArray(output, "Entities", input.entities, input.entitiesCount); + return output; +} + +HRESULT GetEntityProfilesResponse::FromJson(const JsonValue& input) +{ + ModelVector profiles{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Profiles", profiles)); + this->SetProfiles(std::move(profiles)); + + return S_OK; +} + +size_t GetEntityProfilesResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetEntityProfilesResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetEntityProfilesResponse::RequiredBufferSize(const PFProfilesGetEntityProfilesResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFProfilesEntityProfileBody*) + sizeof(PFProfilesEntityProfileBody*) * model.profilesCount); + for (size_t i = 0; i < model.profilesCount; ++i) + { + requiredSize += EntityProfileBody::RequiredBufferSize(*model.profiles[i]); + } + return requiredSize; +} + +HRESULT GetEntityProfilesResponse::Copy(const PFProfilesGetEntityProfilesResponse& input, PFProfilesGetEntityProfilesResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.profiles, input.profilesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.profiles = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetTitlePlayersFromMasterPlayerAccountIdsRequest::ToJson() const +{ + return GetTitlePlayersFromMasterPlayerAccountIdsRequest::ToJson(this->Model()); +} + +JsonValue GetTitlePlayersFromMasterPlayerAccountIdsRequest::ToJson(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMemberArray(output, "MasterPlayerAccountIds", input.masterPlayerAccountIds, input.masterPlayerAccountIdsCount); + JsonUtils::ObjectAddMember(output, "TitleId", input.titleId); + return output; +} + +HRESULT GetTitlePlayersFromMasterPlayerAccountIdsResponse::FromJson(const JsonValue& input) +{ + String titleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleId", titleId)); + this->SetTitleId(std::move(titleId)); + + ModelDictionaryEntryVector titlePlayerAccounts{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitlePlayerAccounts", titlePlayerAccounts)); + this->SetTitlePlayerAccounts(std::move(titlePlayerAccounts)); + + return S_OK; +} + +size_t GetTitlePlayersFromMasterPlayerAccountIdsResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTitlePlayersFromMasterPlayerAccountIdsResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTitlePlayersFromMasterPlayerAccountIdsResponse::RequiredBufferSize(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.titleId) + { + requiredSize += (std::strlen(model.titleId) + 1); + } + requiredSize += (alignof(PFEntityKeyDictionaryEntry) + sizeof(PFEntityKeyDictionaryEntry) * model.titlePlayerAccountsCount); + for (size_t i = 0; i < model.titlePlayerAccountsCount; ++i) + { + requiredSize += (std::strlen(model.titlePlayerAccounts[i].key) + 1); + requiredSize += EntityKey::RequiredBufferSize(*model.titlePlayerAccounts[i].value); + } + return requiredSize; +} + +HRESULT GetTitlePlayersFromMasterPlayerAccountIdsResponse::Copy(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse& input, PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.titleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.titlePlayerAccounts, input.titlePlayerAccountsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.titlePlayerAccounts = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SetProfileLanguageRequest::ToJson() const +{ + return SetProfileLanguageRequest::ToJson(this->Model()); +} + +JsonValue SetProfileLanguageRequest::ToJson(const PFProfilesSetProfileLanguageRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMember(output, "ExpectedVersion", input.expectedVersion); + JsonUtils::ObjectAddMember(output, "Language", input.language); + return output; +} + +HRESULT SetProfileLanguageResponse::FromJson(const JsonValue& input) +{ + std::optional operationResult{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "OperationResult", operationResult)); + this->SetOperationResult(std::move(operationResult)); + + std::optional versionNumber{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VersionNumber", versionNumber)); + this->SetVersionNumber(std::move(versionNumber)); + + return S_OK; +} + +size_t SetProfileLanguageResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SetProfileLanguageResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SetProfileLanguageResponse::RequiredBufferSize(const PFProfilesSetProfileLanguageResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.operationResult) + { + requiredSize += (alignof(PFOperationTypes) + sizeof(PFOperationTypes)); + } + if (model.versionNumber) + { + requiredSize += (alignof(int32_t) + sizeof(int32_t)); + } + return requiredSize; +} + +HRESULT SetProfileLanguageResponse::Copy(const PFProfilesSetProfileLanguageResponse& input, PFProfilesSetProfileLanguageResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.operationResult); + RETURN_IF_FAILED(propCopyResult.hr); + output.operationResult = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.versionNumber); + RETURN_IF_FAILED(propCopyResult.hr); + output.versionNumber = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SetEntityProfilePolicyRequest::ToJson() const +{ + return SetEntityProfilePolicyRequest::ToJson(this->Model()); +} + +JsonValue SetEntityProfilePolicyRequest::ToJson(const PFProfilesSetEntityProfilePolicyRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Entity", input.entity); + JsonUtils::ObjectAddMemberArray(output, "Statements", input.statements, input.statementsCount); + return output; +} + +HRESULT SetEntityProfilePolicyResponse::FromJson(const JsonValue& input) +{ + ModelVector permissions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Permissions", permissions)); + this->SetPermissions(std::move(permissions)); + + return S_OK; +} + +size_t SetEntityProfilePolicyResponse::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result SetEntityProfilePolicyResponse::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t SetEntityProfilePolicyResponse::RequiredBufferSize(const PFProfilesSetEntityProfilePolicyResponse& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFProfilesEntityPermissionStatement*) + sizeof(PFProfilesEntityPermissionStatement*) * model.permissionsCount); + for (size_t i = 0; i < model.permissionsCount; ++i) + { + requiredSize += EntityPermissionStatement::RequiredBufferSize(*model.permissions[i]); + } + return requiredSize; +} + +HRESULT SetEntityProfilePolicyResponse::Copy(const PFProfilesSetEntityProfilePolicyResponse& input, PFProfilesSetEntityProfilePolicyResponse& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.permissions, input.permissionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.permissions = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +} // namespace Profiles +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/ProfilesTypes.h b/Source/PlayFabServices/Source/Generated/ProfilesTypes.h new file mode 100644 index 0000000..309c077 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/ProfilesTypes.h @@ -0,0 +1,281 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Profiles +{ + +// Profiles Classes +class GetEntityProfileRequest : public Wrappers::PFProfilesGetEntityProfileRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesGetEntityProfileRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFProfilesGetEntityProfileRequest& input); +}; + +class EntityProfileFileMetadata : public Wrappers::PFProfilesEntityProfileFileMetadataWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesEntityProfileFileMetadataWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesEntityProfileFileMetadata& model); + static HRESULT Copy(const PFProfilesEntityProfileFileMetadata& input, PFProfilesEntityProfileFileMetadata& output, ModelBuffer& buffer); +}; + +class EntityDataObject : public Wrappers::PFProfilesEntityDataObjectWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesEntityDataObjectWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesEntityDataObject& model); + static HRESULT Copy(const PFProfilesEntityDataObject& input, PFProfilesEntityDataObject& output, ModelBuffer& buffer); +}; + +class EntityPermissionStatement : public Wrappers::PFProfilesEntityPermissionStatementWrapper, public InputModel, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesEntityPermissionStatementWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFProfilesEntityPermissionStatement& input); + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesEntityPermissionStatement& model); + static HRESULT Copy(const PFProfilesEntityPermissionStatement& input, PFProfilesEntityPermissionStatement& output, ModelBuffer& buffer); +}; + +class EntityStatisticValue : public Wrappers::PFProfilesEntityStatisticValueWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesEntityStatisticValueWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesEntityStatisticValue& model); + static HRESULT Copy(const PFProfilesEntityStatisticValue& input, PFProfilesEntityStatisticValue& output, ModelBuffer& buffer); +}; + +class EntityProfileBody : public Wrappers::PFProfilesEntityProfileBodyWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesEntityProfileBodyWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesEntityProfileBody& model); + static HRESULT Copy(const PFProfilesEntityProfileBody& input, PFProfilesEntityProfileBody& output, ModelBuffer& buffer); +}; + +class GetEntityProfileResponse : public Wrappers::PFProfilesGetEntityProfileResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesGetEntityProfileResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesGetEntityProfileResponse& model); + static HRESULT Copy(const PFProfilesGetEntityProfileResponse& input, PFProfilesGetEntityProfileResponse& output, ModelBuffer& buffer); +}; + +class GetEntityProfilesRequest : public Wrappers::PFProfilesGetEntityProfilesRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesGetEntityProfilesRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFProfilesGetEntityProfilesRequest& input); +}; + +class GetEntityProfilesResponse : public Wrappers::PFProfilesGetEntityProfilesResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesGetEntityProfilesResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesGetEntityProfilesResponse& model); + static HRESULT Copy(const PFProfilesGetEntityProfilesResponse& input, PFProfilesGetEntityProfilesResponse& output, ModelBuffer& buffer); +}; + +class GetTitlePlayersFromMasterPlayerAccountIdsRequest : public Wrappers::PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequest& input); +}; + +class GetTitlePlayersFromMasterPlayerAccountIdsResponse : public Wrappers::PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse& model); + static HRESULT Copy(const PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse& input, PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse& output, ModelBuffer& buffer); +}; + +class SetProfileLanguageRequest : public Wrappers::PFProfilesSetProfileLanguageRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesSetProfileLanguageRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFProfilesSetProfileLanguageRequest& input); +}; + +class SetProfileLanguageResponse : public Wrappers::PFProfilesSetProfileLanguageResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesSetProfileLanguageResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesSetProfileLanguageResponse& model); + static HRESULT Copy(const PFProfilesSetProfileLanguageResponse& input, PFProfilesSetProfileLanguageResponse& output, ModelBuffer& buffer); +}; + +class SetEntityProfilePolicyRequest : public Wrappers::PFProfilesSetEntityProfilePolicyRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesSetEntityProfilePolicyRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFProfilesSetEntityProfilePolicyRequest& input); +}; + +class SetEntityProfilePolicyResponse : public Wrappers::PFProfilesSetEntityProfilePolicyResponseWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFProfilesSetEntityProfilePolicyResponseWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFProfilesSetEntityProfilePolicyResponse& model); + static HRESULT Copy(const PFProfilesSetEntityProfilePolicyResponse& input, PFProfilesSetEntityProfilePolicyResponse& output, ModelBuffer& buffer); +}; + +} // namespace Profiles +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PushNotifications.cpp b/Source/PlayFabServices/Source/Generated/PushNotifications.cpp new file mode 100644 index 0000000..1867c4b --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PushNotifications.cpp @@ -0,0 +1,78 @@ +#include "stdafx.h" +#include "PushNotifications.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace PushNotifications +{ + + +AsyncOp PushNotificationsAPI::ServerSendPushNotification( + Entity const& entity, + const SendPushNotificationRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SendPushNotification" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PushNotificationsServerSendPushNotification, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp PushNotificationsAPI::ServerSendPushNotificationFromTemplate( + Entity const& entity, + const SendPushNotificationFromTemplateRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SendPushNotificationFromTemplate" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::PushNotificationsServerSendPushNotificationFromTemplate, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace PushNotifications +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PushNotifications.h b/Source/PlayFabServices/Source/Generated/PushNotifications.h new file mode 100644 index 0000000..83ab661 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PushNotifications.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include "PushNotificationsTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace PushNotifications +{ + +class PushNotificationsAPI +{ +public: + PushNotificationsAPI() = delete; + PushNotificationsAPI(const PushNotificationsAPI& source) = delete; + PushNotificationsAPI& operator=(const PushNotificationsAPI& source) = delete; + ~PushNotificationsAPI() = default; + + // ------------ Generated API calls + static AsyncOp ServerSendPushNotification(Entity const& entity, const SendPushNotificationRequest& request, RunContext rc); + static AsyncOp ServerSendPushNotificationFromTemplate(Entity const& entity, const SendPushNotificationFromTemplateRequest& request, RunContext rc); +}; + +} // namespace PushNotifications +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PushNotificationsTypes.cpp b/Source/PlayFabServices/Source/Generated/PushNotificationsTypes.cpp new file mode 100644 index 0000000..44b0523 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PushNotificationsTypes.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "PushNotificationsTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace PushNotifications +{ + +JsonValue AdvancedPushPlatformMsg::ToJson() const +{ + return AdvancedPushPlatformMsg::ToJson(this->Model()); +} + +JsonValue AdvancedPushPlatformMsg::ToJson(const PFPushNotificationsAdvancedPushPlatformMsg& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "GCMDataOnly", input.gCMDataOnly); + JsonUtils::ObjectAddMember(output, "Json", input.json); + JsonUtils::ObjectAddMember(output, "Platform", input.platform); + return output; +} + +JsonValue PushNotificationPackage::ToJson() const +{ + return PushNotificationPackage::ToJson(this->Model()); +} + +JsonValue PushNotificationPackage::ToJson(const PFPushNotificationsPushNotificationPackage& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Badge", input.badge); + JsonUtils::ObjectAddMember(output, "CustomData", input.customData); + JsonUtils::ObjectAddMember(output, "Icon", input.icon); + JsonUtils::ObjectAddMember(output, "Message", input.message); + JsonUtils::ObjectAddMember(output, "Sound", input.sound); + JsonUtils::ObjectAddMember(output, "Title", input.title); + return output; +} + +JsonValue SendPushNotificationRequest::ToJson() const +{ + return SendPushNotificationRequest::ToJson(this->Model()); +} + +JsonValue SendPushNotificationRequest::ToJson(const PFPushNotificationsSendPushNotificationRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "AdvancedPlatformDelivery", input.advancedPlatformDelivery, input.advancedPlatformDeliveryCount); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Message", input.message); + JsonUtils::ObjectAddMember(output, "Package", input.package); + JsonUtils::ObjectAddMember(output, "Recipient", input.recipient); + JsonUtils::ObjectAddMember(output, "Subject", input.subject); + JsonUtils::ObjectAddMemberArray(output, "TargetPlatforms", input.targetPlatforms, input.targetPlatformsCount); + return output; +} + +JsonValue SendPushNotificationFromTemplateRequest::ToJson() const +{ + return SendPushNotificationFromTemplateRequest::ToJson(this->Model()); +} + +JsonValue SendPushNotificationFromTemplateRequest::ToJson(const PFPushNotificationsSendPushNotificationFromTemplateRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PushNotificationTemplateId", input.pushNotificationTemplateId); + JsonUtils::ObjectAddMember(output, "Recipient", input.recipient); + return output; +} + +} // namespace PushNotifications +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/PushNotificationsTypes.h b/Source/PlayFabServices/Source/Generated/PushNotificationsTypes.h new file mode 100644 index 0000000..fa49d37 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/PushNotificationsTypes.h @@ -0,0 +1,71 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace PushNotifications +{ + +// PushNotifications Classes +class AdvancedPushPlatformMsg : public Wrappers::PFPushNotificationsAdvancedPushPlatformMsgWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPushNotificationsAdvancedPushPlatformMsgWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPushNotificationsAdvancedPushPlatformMsg& input); +}; + +class PushNotificationPackage : public Wrappers::PFPushNotificationsPushNotificationPackageWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPushNotificationsPushNotificationPackageWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPushNotificationsPushNotificationPackage& input); +}; + +class SendPushNotificationRequest : public Wrappers::PFPushNotificationsSendPushNotificationRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPushNotificationsSendPushNotificationRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPushNotificationsSendPushNotificationRequest& input); +}; + +class SendPushNotificationFromTemplateRequest : public Wrappers::PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFPushNotificationsSendPushNotificationFromTemplateRequest& input); +}; + +} // namespace PushNotifications +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Segments.cpp b/Source/PlayFabServices/Source/Generated/Segments.cpp new file mode 100644 index 0000000..7ed9c36 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Segments.cpp @@ -0,0 +1,286 @@ +#include "stdafx.h" +#include "Segments.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace Segments +{ + + +AsyncOp SegmentsAPI::ClientGetPlayerSegments( + Entity const& entity, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayerSegments" }; + JsonValue requestBody{ rapidjson::kNullType }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::SegmentsClientGetPlayerSegments, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerSegmentsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp SegmentsAPI::ClientGetPlayerTags( + Entity const& entity, + const GetPlayerTagsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPlayerTags" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::SegmentsClientGetPlayerTags, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerTagsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp SegmentsAPI::ServerAddPlayerTag( + Entity const& entity, + const AddPlayerTagRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/AddPlayerTag" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::SegmentsServerAddPlayerTag, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp SegmentsAPI::ServerGetAllSegments( + Entity const& entity, + RunContext rc +) +{ + const char* path{ "/Server/GetAllSegments" }; + JsonValue requestBody{ rapidjson::kNullType }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::SegmentsServerGetAllSegments, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetAllSegmentsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp SegmentsAPI::ServerGetPlayerSegments( + Entity const& entity, + const GetPlayersSegmentsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayerSegments" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::SegmentsServerGetPlayerSegments, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerSegmentsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp SegmentsAPI::ServerGetPlayersInSegment( + Entity const& entity, + const GetPlayersInSegmentRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayersInSegment" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::SegmentsServerGetPlayersInSegment, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayersInSegmentResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp SegmentsAPI::ServerGetPlayerTags( + Entity const& entity, + const GetPlayerTagsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPlayerTags" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::SegmentsServerGetPlayerTags, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPlayerTagsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp SegmentsAPI::ServerRemovePlayerTag( + Entity const& entity, + const RemovePlayerTagRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/RemovePlayerTag" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::SegmentsServerRemovePlayerTag, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace Segments +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Segments.h b/Source/PlayFabServices/Source/Generated/Segments.h new file mode 100644 index 0000000..17e858d --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Segments.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include "SegmentsTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace Segments +{ + +class SegmentsAPI +{ +public: + SegmentsAPI() = delete; + SegmentsAPI(const SegmentsAPI& source) = delete; + SegmentsAPI& operator=(const SegmentsAPI& source) = delete; + ~SegmentsAPI() = default; + + // ------------ Generated API calls + static AsyncOp ClientGetPlayerSegments(Entity const& entity, RunContext rc); + static AsyncOp ClientGetPlayerTags(Entity const& entity, const GetPlayerTagsRequest& request, RunContext rc); + static AsyncOp ServerAddPlayerTag(Entity const& entity, const AddPlayerTagRequest& request, RunContext rc); + static AsyncOp ServerGetAllSegments(Entity const& entity, RunContext rc); + static AsyncOp ServerGetPlayerSegments(Entity const& entity, const GetPlayersSegmentsRequest& request, RunContext rc); + static AsyncOp ServerGetPlayersInSegment(Entity const& entity, const GetPlayersInSegmentRequest& request, RunContext rc); + static AsyncOp ServerGetPlayerTags(Entity const& entity, const GetPlayerTagsRequest& request, RunContext rc); + static AsyncOp ServerRemovePlayerTag(Entity const& entity, const RemovePlayerTagRequest& request, RunContext rc); +}; + +} // namespace Segments +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/SegmentsTypes.cpp b/Source/PlayFabServices/Source/Generated/SegmentsTypes.cpp new file mode 100644 index 0000000..2dfac13 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/SegmentsTypes.cpp @@ -0,0 +1,1047 @@ +#include "stdafx.h" +#include "SegmentsTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace Segments +{ + +HRESULT GetSegmentResult::FromJson(const JsonValue& input) +{ + String aBTestParent{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ABTestParent", aBTestParent)); + this->SetABTestParent(std::move(aBTestParent)); + + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + return S_OK; +} + +size_t GetSegmentResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetSegmentResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetSegmentResult::RequiredBufferSize(const PFSegmentsGetSegmentResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.aBTestParent) + { + requiredSize += (std::strlen(model.aBTestParent) + 1); + } + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + return requiredSize; +} + +HRESULT GetSegmentResult::Copy(const PFSegmentsGetSegmentResult& input, PFSegmentsGetSegmentResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.aBTestParent); + RETURN_IF_FAILED(propCopyResult.hr); + output.aBTestParent = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayerSegmentsResult::FromJson(const JsonValue& input) +{ + ModelVector segments{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Segments", segments)); + this->SetSegments(std::move(segments)); + + return S_OK; +} + +size_t GetPlayerSegmentsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayerSegmentsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayerSegmentsResult::RequiredBufferSize(const PFSegmentsGetPlayerSegmentsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFSegmentsGetSegmentResult*) + sizeof(PFSegmentsGetSegmentResult*) * model.segmentsCount); + for (size_t i = 0; i < model.segmentsCount; ++i) + { + requiredSize += GetSegmentResult::RequiredBufferSize(*model.segments[i]); + } + return requiredSize; +} + +HRESULT GetPlayerSegmentsResult::Copy(const PFSegmentsGetPlayerSegmentsResult& input, PFSegmentsGetPlayerSegmentsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.segments, input.segmentsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.segments = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayerTagsRequest::ToJson() const +{ + return GetPlayerTagsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayerTagsRequest::ToJson(const PFSegmentsGetPlayerTagsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "Namespace", input.playfabNamespace); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +HRESULT GetPlayerTagsResult::FromJson(const JsonValue& input) +{ + String playFabId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayFabId", playFabId)); + this->SetPlayFabId(std::move(playFabId)); + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + return S_OK; +} + +size_t GetPlayerTagsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayerTagsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayerTagsResult::RequiredBufferSize(const PFSegmentsGetPlayerTagsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.playFabId) + { + requiredSize += (std::strlen(model.playFabId) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + return requiredSize; +} + +HRESULT GetPlayerTagsResult::Copy(const PFSegmentsGetPlayerTagsResult& input, PFSegmentsGetPlayerTagsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.playFabId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playFabId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue AddPlayerTagRequest::ToJson() const +{ + return AddPlayerTagRequest::ToJson(this->Model()); +} + +JsonValue AddPlayerTagRequest::ToJson(const PFSegmentsAddPlayerTagRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "TagName", input.tagName); + return output; +} + +HRESULT GetAllSegmentsResult::FromJson(const JsonValue& input) +{ + ModelVector segments{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Segments", segments)); + this->SetSegments(std::move(segments)); + + return S_OK; +} + +size_t GetAllSegmentsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetAllSegmentsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetAllSegmentsResult::RequiredBufferSize(const PFSegmentsGetAllSegmentsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFSegmentsGetSegmentResult*) + sizeof(PFSegmentsGetSegmentResult*) * model.segmentsCount); + for (size_t i = 0; i < model.segmentsCount; ++i) + { + requiredSize += GetSegmentResult::RequiredBufferSize(*model.segments[i]); + } + return requiredSize; +} + +HRESULT GetAllSegmentsResult::Copy(const PFSegmentsGetAllSegmentsResult& input, PFSegmentsGetAllSegmentsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.segments, input.segmentsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.segments = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetPlayersSegmentsRequest::ToJson() const +{ + return GetPlayersSegmentsRequest::ToJson(this->Model()); +} + +JsonValue GetPlayersSegmentsRequest::ToJson(const PFSegmentsGetPlayersSegmentsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + return output; +} + +JsonValue GetPlayersInSegmentRequest::ToJson() const +{ + return GetPlayersInSegmentRequest::ToJson(this->Model()); +} + +JsonValue GetPlayersInSegmentRequest::ToJson(const PFSegmentsGetPlayersInSegmentRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "ContinuationToken", input.continuationToken); + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "GetProfilesAsync", input.getProfilesAsync); + JsonUtils::ObjectAddMember(output, "MaxBatchSize", input.maxBatchSize); + JsonUtils::ObjectAddMember(output, "SecondsToLive", input.secondsToLive); + JsonUtils::ObjectAddMember(output, "SegmentId", input.segmentId); + return output; +} + +HRESULT AdCampaignAttribution::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "AttributedAt", this->m_model.attributedAt)); + + String campaignId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CampaignId", campaignId)); + this->SetCampaignId(std::move(campaignId)); + + String platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + return S_OK; +} + +size_t AdCampaignAttribution::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result AdCampaignAttribution::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t AdCampaignAttribution::RequiredBufferSize(const PFSegmentsAdCampaignAttribution& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.campaignId) + { + requiredSize += (std::strlen(model.campaignId) + 1); + } + if (model.platform) + { + requiredSize += (std::strlen(model.platform) + 1); + } + return requiredSize; +} + +HRESULT AdCampaignAttribution::Copy(const PFSegmentsAdCampaignAttribution& input, PFSegmentsAdCampaignAttribution& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.campaignId); + RETURN_IF_FAILED(propCopyResult.hr); + output.campaignId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT ContactEmailInfo::FromJson(const JsonValue& input) +{ + String emailAddress{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "EmailAddress", emailAddress)); + this->SetEmailAddress(std::move(emailAddress)); + + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + std::optional verificationStatus{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VerificationStatus", verificationStatus)); + this->SetVerificationStatus(std::move(verificationStatus)); + + return S_OK; +} + +size_t ContactEmailInfo::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result ContactEmailInfo::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t ContactEmailInfo::RequiredBufferSize(const PFSegmentsContactEmailInfo& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.emailAddress) + { + requiredSize += (std::strlen(model.emailAddress) + 1); + } + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + if (model.verificationStatus) + { + requiredSize += (alignof(PFEmailVerificationStatus) + sizeof(PFEmailVerificationStatus)); + } + return requiredSize; +} + +HRESULT ContactEmailInfo::Copy(const PFSegmentsContactEmailInfo& input, PFSegmentsContactEmailInfo& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.emailAddress); + RETURN_IF_FAILED(propCopyResult.hr); + output.emailAddress = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.verificationStatus); + RETURN_IF_FAILED(propCopyResult.hr); + output.verificationStatus = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PlayerLinkedAccount::FromJson(const JsonValue& input) +{ + String email{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Email", email)); + this->SetEmail(std::move(email)); + + std::optional platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + String platformUserId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlatformUserId", platformUserId)); + this->SetPlatformUserId(std::move(platformUserId)); + + String username{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Username", username)); + this->SetUsername(std::move(username)); + + return S_OK; +} + +size_t PlayerLinkedAccount::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PlayerLinkedAccount::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PlayerLinkedAccount::RequiredBufferSize(const PFSegmentsPlayerLinkedAccount& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.email) + { + requiredSize += (std::strlen(model.email) + 1); + } + if (model.platform) + { + requiredSize += (alignof(PFLoginIdentityProvider) + sizeof(PFLoginIdentityProvider)); + } + if (model.platformUserId) + { + requiredSize += (std::strlen(model.platformUserId) + 1); + } + if (model.username) + { + requiredSize += (std::strlen(model.username) + 1); + } + return requiredSize; +} + +HRESULT PlayerLinkedAccount::Copy(const PFSegmentsPlayerLinkedAccount& input, PFSegmentsPlayerLinkedAccount& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.email); + RETURN_IF_FAILED(propCopyResult.hr); + output.email = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platformUserId); + RETURN_IF_FAILED(propCopyResult.hr); + output.platformUserId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.username); + RETURN_IF_FAILED(propCopyResult.hr); + output.username = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PlayerLocation::FromJson(const JsonValue& input) +{ + String city{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "City", city)); + this->SetCity(std::move(city)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinentCode", this->m_model.continentCode)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "CountryCode", this->m_model.countryCode)); + + std::optional latitude{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Latitude", latitude)); + this->SetLatitude(std::move(latitude)); + + std::optional longitude{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Longitude", longitude)); + this->SetLongitude(std::move(longitude)); + + return S_OK; +} + +size_t PlayerLocation::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PlayerLocation::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PlayerLocation::RequiredBufferSize(const PFSegmentsPlayerLocation& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.city) + { + requiredSize += (std::strlen(model.city) + 1); + } + if (model.latitude) + { + requiredSize += (alignof(double) + sizeof(double)); + } + if (model.longitude) + { + requiredSize += (alignof(double) + sizeof(double)); + } + return requiredSize; +} + +HRESULT PlayerLocation::Copy(const PFSegmentsPlayerLocation& input, PFSegmentsPlayerLocation& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.city); + RETURN_IF_FAILED(propCopyResult.hr); + output.city = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.latitude); + RETURN_IF_FAILED(propCopyResult.hr); + output.latitude = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.longitude); + RETURN_IF_FAILED(propCopyResult.hr); + output.longitude = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PlayerStatistic::FromJson(const JsonValue& input) +{ + String id{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Id", id)); + this->SetId(std::move(id)); + + String name{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Name", name)); + this->SetName(std::move(name)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StatisticValue", this->m_model.statisticValue)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "StatisticVersion", this->m_model.statisticVersion)); + + return S_OK; +} + +size_t PlayerStatistic::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PlayerStatistic::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PlayerStatistic::RequiredBufferSize(const PFSegmentsPlayerStatistic& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.id) + { + requiredSize += (std::strlen(model.id) + 1); + } + if (model.name) + { + requiredSize += (std::strlen(model.name) + 1); + } + return requiredSize; +} + +HRESULT PlayerStatistic::Copy(const PFSegmentsPlayerStatistic& input, PFSegmentsPlayerStatistic& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.id); + RETURN_IF_FAILED(propCopyResult.hr); + output.id = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.name); + RETURN_IF_FAILED(propCopyResult.hr); + output.name = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PushNotificationRegistration::FromJson(const JsonValue& input) +{ + String notificationEndpointARN{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NotificationEndpointARN", notificationEndpointARN)); + this->SetNotificationEndpointARN(std::move(notificationEndpointARN)); + + std::optional platform{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Platform", platform)); + this->SetPlatform(std::move(platform)); + + return S_OK; +} + +size_t PushNotificationRegistration::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PushNotificationRegistration::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PushNotificationRegistration::RequiredBufferSize(const PFSegmentsPushNotificationRegistration& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.notificationEndpointARN) + { + requiredSize += (std::strlen(model.notificationEndpointARN) + 1); + } + if (model.platform) + { + requiredSize += (alignof(PFPushNotificationPlatform) + sizeof(PFPushNotificationPlatform)); + } + return requiredSize; +} + +HRESULT PushNotificationRegistration::Copy(const PFSegmentsPushNotificationRegistration& input, PFSegmentsPushNotificationRegistration& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.notificationEndpointARN); + RETURN_IF_FAILED(propCopyResult.hr); + output.notificationEndpointARN = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.platform); + RETURN_IF_FAILED(propCopyResult.hr); + output.platform = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT PlayerProfile::FromJson(const JsonValue& input) +{ + ModelVector adCampaignAttributions{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AdCampaignAttributions", adCampaignAttributions)); + this->SetAdCampaignAttributions(std::move(adCampaignAttributions)); + + String avatarUrl{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "AvatarUrl", avatarUrl)); + this->SetAvatarUrl(std::move(avatarUrl)); + + std::optional bannedUntil{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "BannedUntil", bannedUntil)); + this->SetBannedUntil(std::move(bannedUntil)); + + std::optional churnPrediction{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ChurnPrediction", churnPrediction)); + this->SetChurnPrediction(std::move(churnPrediction)); + + ModelVector contactEmailAddresses{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContactEmailAddresses", contactEmailAddresses)); + this->SetContactEmailAddresses(std::move(contactEmailAddresses)); + + std::optional created{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Created", created)); + this->SetCreated(std::move(created)); + + String displayName{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "DisplayName", displayName)); + this->SetDisplayName(std::move(displayName)); + + std::optional lastLogin{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "LastLogin", lastLogin)); + this->SetLastLogin(std::move(lastLogin)); + + ModelVector linkedAccounts{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "LinkedAccounts", linkedAccounts)); + this->SetLinkedAccounts(std::move(linkedAccounts)); + + ModelDictionaryEntryVector locations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Locations", locations)); + this->SetLocations(std::move(locations)); + + std::optional origination{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Origination", origination)); + this->SetOrigination(std::move(origination)); + + CStringVector playerExperimentVariants{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerExperimentVariants", playerExperimentVariants)); + this->SetPlayerExperimentVariants(std::move(playerExperimentVariants)); + + String playerId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerId", playerId)); + this->SetPlayerId(std::move(playerId)); + + ModelVector playerStatistics{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerStatistics", playerStatistics)); + this->SetPlayerStatistics(std::move(playerStatistics)); + + String publisherId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PublisherId", publisherId)); + this->SetPublisherId(std::move(publisherId)); + + ModelVector pushNotificationRegistrations{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PushNotificationRegistrations", pushNotificationRegistrations)); + this->SetPushNotificationRegistrations(std::move(pushNotificationRegistrations)); + + DictionaryEntryVector statistics{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Statistics", statistics)); + this->SetStatistics(std::move(statistics)); + + CStringVector tags{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Tags", tags)); + this->SetTags(std::move(tags)); + + String titleId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TitleId", titleId)); + this->SetTitleId(std::move(titleId)); + + std::optional totalValueToDateInUSD{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "TotalValueToDateInUSD", totalValueToDateInUSD)); + this->SetTotalValueToDateInUSD(std::move(totalValueToDateInUSD)); + + DictionaryEntryVector valuesToDate{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ValuesToDate", valuesToDate)); + this->SetValuesToDate(std::move(valuesToDate)); + + DictionaryEntryVector virtualCurrencyBalances{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "VirtualCurrencyBalances", virtualCurrencyBalances)); + this->SetVirtualCurrencyBalances(std::move(virtualCurrencyBalances)); + + return S_OK; +} + +size_t PlayerProfile::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result PlayerProfile::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t PlayerProfile::RequiredBufferSize(const PFSegmentsPlayerProfile& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFSegmentsAdCampaignAttribution*) + sizeof(PFSegmentsAdCampaignAttribution*) * model.adCampaignAttributionsCount); + for (size_t i = 0; i < model.adCampaignAttributionsCount; ++i) + { + requiredSize += AdCampaignAttribution::RequiredBufferSize(*model.adCampaignAttributions[i]); + } + if (model.avatarUrl) + { + requiredSize += (std::strlen(model.avatarUrl) + 1); + } + if (model.bannedUntil) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.churnPrediction) + { + requiredSize += (alignof(PFSegmentsChurnRiskLevel) + sizeof(PFSegmentsChurnRiskLevel)); + } + requiredSize += (alignof(PFSegmentsContactEmailInfo*) + sizeof(PFSegmentsContactEmailInfo*) * model.contactEmailAddressesCount); + for (size_t i = 0; i < model.contactEmailAddressesCount; ++i) + { + requiredSize += ContactEmailInfo::RequiredBufferSize(*model.contactEmailAddresses[i]); + } + if (model.created) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + if (model.displayName) + { + requiredSize += (std::strlen(model.displayName) + 1); + } + if (model.lastLogin) + { + requiredSize += (alignof(time_t) + sizeof(time_t)); + } + requiredSize += (alignof(PFSegmentsPlayerLinkedAccount*) + sizeof(PFSegmentsPlayerLinkedAccount*) * model.linkedAccountsCount); + for (size_t i = 0; i < model.linkedAccountsCount; ++i) + { + requiredSize += PlayerLinkedAccount::RequiredBufferSize(*model.linkedAccounts[i]); + } + requiredSize += (alignof(PFSegmentsPlayerLocationDictionaryEntry) + sizeof(PFSegmentsPlayerLocationDictionaryEntry) * model.locationsCount); + for (size_t i = 0; i < model.locationsCount; ++i) + { + requiredSize += (std::strlen(model.locations[i].key) + 1); + requiredSize += PlayerLocation::RequiredBufferSize(*model.locations[i].value); + } + if (model.origination) + { + requiredSize += (alignof(PFLoginIdentityProvider) + sizeof(PFLoginIdentityProvider)); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.playerExperimentVariantsCount); + for (size_t i = 0; i < model.playerExperimentVariantsCount; ++i) + { + requiredSize += (std::strlen(model.playerExperimentVariants[i]) + 1); + } + if (model.playerId) + { + requiredSize += (std::strlen(model.playerId) + 1); + } + requiredSize += (alignof(PFSegmentsPlayerStatistic*) + sizeof(PFSegmentsPlayerStatistic*) * model.playerStatisticsCount); + for (size_t i = 0; i < model.playerStatisticsCount; ++i) + { + requiredSize += PlayerStatistic::RequiredBufferSize(*model.playerStatistics[i]); + } + if (model.publisherId) + { + requiredSize += (std::strlen(model.publisherId) + 1); + } + requiredSize += (alignof(PFSegmentsPushNotificationRegistration*) + sizeof(PFSegmentsPushNotificationRegistration*) * model.pushNotificationRegistrationsCount); + for (size_t i = 0; i < model.pushNotificationRegistrationsCount; ++i) + { + requiredSize += PushNotificationRegistration::RequiredBufferSize(*model.pushNotificationRegistrations[i]); + } + requiredSize += (alignof(PFInt32DictionaryEntry) + sizeof(PFInt32DictionaryEntry) * model.statisticsCount); + for (size_t i = 0; i < model.statisticsCount; ++i) + { + requiredSize += (std::strlen(model.statistics[i].key) + 1); + } + requiredSize += (alignof(char*) + sizeof(char*) * model.tagsCount); + for (size_t i = 0; i < model.tagsCount; ++i) + { + requiredSize += (std::strlen(model.tags[i]) + 1); + } + if (model.titleId) + { + requiredSize += (std::strlen(model.titleId) + 1); + } + if (model.totalValueToDateInUSD) + { + requiredSize += (alignof(uint32_t) + sizeof(uint32_t)); + } + requiredSize += (alignof(PFUint32DictionaryEntry) + sizeof(PFUint32DictionaryEntry) * model.valuesToDateCount); + for (size_t i = 0; i < model.valuesToDateCount; ++i) + { + requiredSize += (std::strlen(model.valuesToDate[i].key) + 1); + } + requiredSize += (alignof(PFInt32DictionaryEntry) + sizeof(PFInt32DictionaryEntry) * model.virtualCurrencyBalancesCount); + for (size_t i = 0; i < model.virtualCurrencyBalancesCount; ++i) + { + requiredSize += (std::strlen(model.virtualCurrencyBalances[i].key) + 1); + } + return requiredSize; +} + +HRESULT PlayerProfile::Copy(const PFSegmentsPlayerProfile& input, PFSegmentsPlayerProfile& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.adCampaignAttributions, input.adCampaignAttributionsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.adCampaignAttributions = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.avatarUrl); + RETURN_IF_FAILED(propCopyResult.hr); + output.avatarUrl = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.bannedUntil); + RETURN_IF_FAILED(propCopyResult.hr); + output.bannedUntil = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.churnPrediction); + RETURN_IF_FAILED(propCopyResult.hr); + output.churnPrediction = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.contactEmailAddresses, input.contactEmailAddressesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.contactEmailAddresses = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.created); + RETURN_IF_FAILED(propCopyResult.hr); + output.created = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.displayName); + RETURN_IF_FAILED(propCopyResult.hr); + output.displayName = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.lastLogin); + RETURN_IF_FAILED(propCopyResult.hr); + output.lastLogin = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.linkedAccounts, input.linkedAccountsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.linkedAccounts = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.locations, input.locationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.locations = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.origination); + RETURN_IF_FAILED(propCopyResult.hr); + output.origination = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.playerExperimentVariants, input.playerExperimentVariantsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerExperimentVariants = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.playerId); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.playerStatistics, input.playerStatisticsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerStatistics = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.publisherId); + RETURN_IF_FAILED(propCopyResult.hr); + output.publisherId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.pushNotificationRegistrations, input.pushNotificationRegistrationsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.pushNotificationRegistrations = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.statistics, input.statisticsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.statistics = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.tags, input.tagsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.tags = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.titleId); + RETURN_IF_FAILED(propCopyResult.hr); + output.titleId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.totalValueToDateInUSD); + RETURN_IF_FAILED(propCopyResult.hr); + output.totalValueToDateInUSD = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.valuesToDate, input.valuesToDateCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.valuesToDate = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToDictionary(input.virtualCurrencyBalances, input.virtualCurrencyBalancesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.virtualCurrencyBalances = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetPlayersInSegmentResult::FromJson(const JsonValue& input) +{ + String continuationToken{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ContinuationToken", continuationToken)); + this->SetContinuationToken(std::move(continuationToken)); + + ModelVector playerProfiles{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "PlayerProfiles", playerProfiles)); + this->SetPlayerProfiles(std::move(playerProfiles)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "ProfilesInSegment", this->m_model.profilesInSegment)); + + return S_OK; +} + +size_t GetPlayersInSegmentResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPlayersInSegmentResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPlayersInSegmentResult::RequiredBufferSize(const PFSegmentsGetPlayersInSegmentResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.continuationToken) + { + requiredSize += (std::strlen(model.continuationToken) + 1); + } + requiredSize += (alignof(PFSegmentsPlayerProfile*) + sizeof(PFSegmentsPlayerProfile*) * model.playerProfilesCount); + for (size_t i = 0; i < model.playerProfilesCount; ++i) + { + requiredSize += PlayerProfile::RequiredBufferSize(*model.playerProfiles[i]); + } + return requiredSize; +} + +HRESULT GetPlayersInSegmentResult::Copy(const PFSegmentsGetPlayersInSegmentResult& input, PFSegmentsGetPlayersInSegmentResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.continuationToken); + RETURN_IF_FAILED(propCopyResult.hr); + output.continuationToken = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyToArray(input.playerProfiles, input.playerProfilesCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.playerProfiles = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue RemovePlayerTagRequest::ToJson() const +{ + return RemovePlayerTagRequest::ToJson(this->Model()); +} + +JsonValue RemovePlayerTagRequest::ToJson(const PFSegmentsRemovePlayerTagRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberDictionary(output, "CustomTags", input.customTags, input.customTagsCount); + JsonUtils::ObjectAddMember(output, "PlayFabId", input.playFabId); + JsonUtils::ObjectAddMember(output, "TagName", input.tagName); + return output; +} + +} // namespace Segments +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/SegmentsTypes.h b/Source/PlayFabServices/Source/Generated/SegmentsTypes.h new file mode 100644 index 0000000..46858d0 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/SegmentsTypes.h @@ -0,0 +1,314 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace Segments +{ + +// Segments Classes +class GetSegmentResult : public Wrappers::PFSegmentsGetSegmentResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetSegmentResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsGetSegmentResult& model); + static HRESULT Copy(const PFSegmentsGetSegmentResult& input, PFSegmentsGetSegmentResult& output, ModelBuffer& buffer); +}; + +class GetPlayerSegmentsResult : public Wrappers::PFSegmentsGetPlayerSegmentsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetPlayerSegmentsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsGetPlayerSegmentsResult& model); + static HRESULT Copy(const PFSegmentsGetPlayerSegmentsResult& input, PFSegmentsGetPlayerSegmentsResult& output, ModelBuffer& buffer); +}; + +class GetPlayerTagsRequest : public Wrappers::PFSegmentsGetPlayerTagsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetPlayerTagsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFSegmentsGetPlayerTagsRequest& input); +}; + +class GetPlayerTagsResult : public Wrappers::PFSegmentsGetPlayerTagsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetPlayerTagsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsGetPlayerTagsResult& model); + static HRESULT Copy(const PFSegmentsGetPlayerTagsResult& input, PFSegmentsGetPlayerTagsResult& output, ModelBuffer& buffer); +}; + +class AddPlayerTagRequest : public Wrappers::PFSegmentsAddPlayerTagRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsAddPlayerTagRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFSegmentsAddPlayerTagRequest& input); +}; + +class GetAllSegmentsResult : public Wrappers::PFSegmentsGetAllSegmentsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetAllSegmentsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsGetAllSegmentsResult& model); + static HRESULT Copy(const PFSegmentsGetAllSegmentsResult& input, PFSegmentsGetAllSegmentsResult& output, ModelBuffer& buffer); +}; + +class GetPlayersSegmentsRequest : public Wrappers::PFSegmentsGetPlayersSegmentsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetPlayersSegmentsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFSegmentsGetPlayersSegmentsRequest& input); +}; + +class GetPlayersInSegmentRequest : public Wrappers::PFSegmentsGetPlayersInSegmentRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetPlayersInSegmentRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFSegmentsGetPlayersInSegmentRequest& input); +}; + +class AdCampaignAttribution : public Wrappers::PFSegmentsAdCampaignAttributionWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsAdCampaignAttributionWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsAdCampaignAttribution& model); + static HRESULT Copy(const PFSegmentsAdCampaignAttribution& input, PFSegmentsAdCampaignAttribution& output, ModelBuffer& buffer); +}; + +class ContactEmailInfo : public Wrappers::PFSegmentsContactEmailInfoWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsContactEmailInfoWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsContactEmailInfo& model); + static HRESULT Copy(const PFSegmentsContactEmailInfo& input, PFSegmentsContactEmailInfo& output, ModelBuffer& buffer); +}; + +class PlayerLinkedAccount : public Wrappers::PFSegmentsPlayerLinkedAccountWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsPlayerLinkedAccountWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsPlayerLinkedAccount& model); + static HRESULT Copy(const PFSegmentsPlayerLinkedAccount& input, PFSegmentsPlayerLinkedAccount& output, ModelBuffer& buffer); +}; + +class PlayerLocation : public Wrappers::PFSegmentsPlayerLocationWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsPlayerLocationWrapper; + using ModelWrapperType::ModelType; + using DictionaryEntryType = ModelWrapperType::DictionaryEntryType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsPlayerLocation& model); + static HRESULT Copy(const PFSegmentsPlayerLocation& input, PFSegmentsPlayerLocation& output, ModelBuffer& buffer); +}; + +class PlayerStatistic : public Wrappers::PFSegmentsPlayerStatisticWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsPlayerStatisticWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsPlayerStatistic& model); + static HRESULT Copy(const PFSegmentsPlayerStatistic& input, PFSegmentsPlayerStatistic& output, ModelBuffer& buffer); +}; + +class PushNotificationRegistration : public Wrappers::PFSegmentsPushNotificationRegistrationWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsPushNotificationRegistrationWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsPushNotificationRegistration& model); + static HRESULT Copy(const PFSegmentsPushNotificationRegistration& input, PFSegmentsPushNotificationRegistration& output, ModelBuffer& buffer); +}; + +class PlayerProfile : public Wrappers::PFSegmentsPlayerProfileWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsPlayerProfileWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsPlayerProfile& model); + static HRESULT Copy(const PFSegmentsPlayerProfile& input, PFSegmentsPlayerProfile& output, ModelBuffer& buffer); +}; + +class GetPlayersInSegmentResult : public Wrappers::PFSegmentsGetPlayersInSegmentResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsGetPlayersInSegmentResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFSegmentsGetPlayersInSegmentResult& model); + static HRESULT Copy(const PFSegmentsGetPlayersInSegmentResult& input, PFSegmentsGetPlayersInSegmentResult& output, ModelBuffer& buffer); +}; + +class RemovePlayerTagRequest : public Wrappers::PFSegmentsRemovePlayerTagRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFSegmentsRemovePlayerTagRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFSegmentsRemovePlayerTagRequest& input); +}; + +} // namespace Segments +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/TitleDataManagement.cpp b/Source/PlayFabServices/Source/Generated/TitleDataManagement.cpp new file mode 100644 index 0000000..fa3dc45 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/TitleDataManagement.cpp @@ -0,0 +1,424 @@ +#include "stdafx.h" +#include "TitleDataManagement.h" +#include "GlobalState.h" + +namespace PlayFab +{ +namespace TitleDataManagement +{ + + +AsyncOp TitleDataManagementAPI::ClientGetPublisherData( + Entity const& entity, + const GetPublisherDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetPublisherData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::TitleDataManagementClientGetPublisherData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPublisherDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ClientGetTime( + Entity const& entity, + RunContext rc +) +{ + const char* path{ "/Client/GetTime" }; + JsonValue requestBody{ rapidjson::kNullType }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::TitleDataManagementClientGetTime, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTimeResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ClientGetTitleData( + Entity const& entity, + const GetTitleDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetTitleData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::TitleDataManagementClientGetTitleData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitleDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ClientGetTitleNews( + Entity const& entity, + const GetTitleNewsRequest& request, + RunContext rc +) +{ + const char* path{ "/Client/GetTitleNews" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeEntityRequest( + ServicesCacheId::TitleDataManagementClientGetTitleNews, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitleNewsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerGetPublisherData( + Entity const& entity, + const GetPublisherDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetPublisherData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerGetPublisherData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetPublisherDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerGetTime( + Entity const& entity, + RunContext rc +) +{ + const char* path{ "/Server/GetTime" }; + JsonValue requestBody{ rapidjson::kNullType }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerGetTime, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTimeResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerGetTitleData( + Entity const& entity, + const GetTitleDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetTitleData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerGetTitleData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitleDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerGetTitleInternalData( + Entity const& entity, + const GetTitleDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetTitleInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerGetTitleInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitleDataResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerGetTitleNews( + Entity const& entity, + const GetTitleNewsRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/GetTitleNews" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerGetTitleNews, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + GetTitleNewsResult resultModel; + RETURN_IF_FAILED(resultModel.FromJson(serviceResponse.Data)); + return resultModel; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerSetPublisherData( + Entity const& entity, + const SetPublisherDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SetPublisherData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerSetPublisherData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerSetTitleData( + Entity const& entity, + const SetTitleDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SetTitleData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerSetTitleData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp TitleDataManagementAPI::ServerSetTitleInternalData( + Entity const& entity, + const SetTitleDataRequest& request, + RunContext rc +) +{ + const char* path{ "/Server/SetTitleInternalData" }; + JsonValue requestBody{ request.ToJson() }; + + auto requestOp = ServicesHttpClient::MakeSecretKeyRequest( + ServicesCacheId::TitleDataManagementServerSetTitleInternalData, + entity, + path, + requestBody, + std::move(rc) + ); + + return requestOp.Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +} // namespace TitleDataManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/TitleDataManagement.h b/Source/PlayFabServices/Source/Generated/TitleDataManagement.h new file mode 100644 index 0000000..792187a --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/TitleDataManagement.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include "TitleDataManagementTypes.h" +#include "GlobalState.h" +#include "Generated/Types.h" + +namespace PlayFab +{ +namespace TitleDataManagement +{ + +class TitleDataManagementAPI +{ +public: + TitleDataManagementAPI() = delete; + TitleDataManagementAPI(const TitleDataManagementAPI& source) = delete; + TitleDataManagementAPI& operator=(const TitleDataManagementAPI& source) = delete; + ~TitleDataManagementAPI() = default; + + // ------------ Generated API calls + static AsyncOp ClientGetPublisherData(Entity const& entity, const GetPublisherDataRequest& request, RunContext rc); + static AsyncOp ClientGetTime(Entity const& entity, RunContext rc); + static AsyncOp ClientGetTitleData(Entity const& entity, const GetTitleDataRequest& request, RunContext rc); + static AsyncOp ClientGetTitleNews(Entity const& entity, const GetTitleNewsRequest& request, RunContext rc); + static AsyncOp ServerGetPublisherData(Entity const& entity, const GetPublisherDataRequest& request, RunContext rc); + static AsyncOp ServerGetTime(Entity const& entity, RunContext rc); + static AsyncOp ServerGetTitleData(Entity const& entity, const GetTitleDataRequest& request, RunContext rc); + static AsyncOp ServerGetTitleInternalData(Entity const& entity, const GetTitleDataRequest& request, RunContext rc); + static AsyncOp ServerGetTitleNews(Entity const& entity, const GetTitleNewsRequest& request, RunContext rc); + static AsyncOp ServerSetPublisherData(Entity const& entity, const SetPublisherDataRequest& request, RunContext rc); + static AsyncOp ServerSetTitleData(Entity const& entity, const SetTitleDataRequest& request, RunContext rc); + static AsyncOp ServerSetTitleInternalData(Entity const& entity, const SetTitleDataRequest& request, RunContext rc); +}; + +} // namespace TitleDataManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.cpp b/Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.cpp new file mode 100644 index 0000000..16e76dd --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.cpp @@ -0,0 +1,298 @@ +#include "stdafx.h" +#include "TitleDataManagementTypes.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ +namespace TitleDataManagement +{ + +JsonValue GetPublisherDataRequest::ToJson() const +{ + return GetPublisherDataRequest::ToJson(this->Model()); +} + +JsonValue GetPublisherDataRequest::ToJson(const PFTitleDataManagementGetPublisherDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Keys", input.keys, input.keysCount); + return output; +} + +HRESULT GetPublisherDataResult::FromJson(const JsonValue& input) +{ + StringDictionaryEntryVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetPublisherDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetPublisherDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetPublisherDataResult::RequiredBufferSize(const PFTitleDataManagementGetPublisherDataResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += (std::strlen(model.data[i].key) + 1); + requiredSize += (std::strlen(model.data[i].value) + 1); + } + return requiredSize; +} + +HRESULT GetPublisherDataResult::Copy(const PFTitleDataManagementGetPublisherDataResult& input, PFTitleDataManagementGetPublisherDataResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToDictionary(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetTimeResult::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Time", this->m_model.time)); + + return S_OK; +} + +size_t GetTimeResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTimeResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTimeResult::RequiredBufferSize(const PFTitleDataManagementGetTimeResult& model) +{ + UNREFERENCED_PARAMETER(model); // Fixed size + return sizeof(ModelType); +} + +HRESULT GetTimeResult::Copy(const PFTitleDataManagementGetTimeResult& input, PFTitleDataManagementGetTimeResult& output, ModelBuffer& buffer) +{ + output = input; + UNREFERENCED_PARAMETER(buffer); // Fixed size + return S_OK; +} + +JsonValue GetTitleDataRequest::ToJson() const +{ + return GetTitleDataRequest::ToJson(this->Model()); +} + +JsonValue GetTitleDataRequest::ToJson(const PFTitleDataManagementGetTitleDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMemberArray(output, "Keys", input.keys, input.keysCount); + JsonUtils::ObjectAddMember(output, "OverrideLabel", input.overrideLabel); + return output; +} + +HRESULT GetTitleDataResult::FromJson(const JsonValue& input) +{ + StringDictionaryEntryVector data{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Data", data)); + this->SetData(std::move(data)); + + return S_OK; +} + +size_t GetTitleDataResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTitleDataResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTitleDataResult::RequiredBufferSize(const PFTitleDataManagementGetTitleDataResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFStringDictionaryEntry) + sizeof(PFStringDictionaryEntry) * model.dataCount); + for (size_t i = 0; i < model.dataCount; ++i) + { + requiredSize += (std::strlen(model.data[i].key) + 1); + requiredSize += (std::strlen(model.data[i].value) + 1); + } + return requiredSize; +} + +HRESULT GetTitleDataResult::Copy(const PFTitleDataManagementGetTitleDataResult& input, PFTitleDataManagementGetTitleDataResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToDictionary(input.data, input.dataCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.data = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue GetTitleNewsRequest::ToJson() const +{ + return GetTitleNewsRequest::ToJson(this->Model()); +} + +JsonValue GetTitleNewsRequest::ToJson(const PFTitleDataManagementGetTitleNewsRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Count", input.count); + return output; +} + +HRESULT TitleNewsItem::FromJson(const JsonValue& input) +{ + String body{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Body", body)); + this->SetBody(std::move(body)); + + String newsId{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "NewsId", newsId)); + this->SetNewsId(std::move(newsId)); + + RETURN_IF_FAILED(JsonUtils::ObjectGetMemberTime(input, "Timestamp", this->m_model.timestamp)); + + String title{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "Title", title)); + this->SetTitle(std::move(title)); + + return S_OK; +} + +size_t TitleNewsItem::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result TitleNewsItem::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t TitleNewsItem::RequiredBufferSize(const PFTitleDataManagementTitleNewsItem& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + if (model.body) + { + requiredSize += (std::strlen(model.body) + 1); + } + if (model.newsId) + { + requiredSize += (std::strlen(model.newsId) + 1); + } + if (model.title) + { + requiredSize += (std::strlen(model.title) + 1); + } + return requiredSize; +} + +HRESULT TitleNewsItem::Copy(const PFTitleDataManagementTitleNewsItem& input, PFTitleDataManagementTitleNewsItem& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyTo(input.body); + RETURN_IF_FAILED(propCopyResult.hr); + output.body = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.newsId); + RETURN_IF_FAILED(propCopyResult.hr); + output.newsId = propCopyResult.ExtractPayload(); + } + { + auto propCopyResult = buffer.CopyTo(input.title); + RETURN_IF_FAILED(propCopyResult.hr); + output.title = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +HRESULT GetTitleNewsResult::FromJson(const JsonValue& input) +{ + ModelVector news{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "News", news)); + this->SetNews(std::move(news)); + + return S_OK; +} + +size_t GetTitleNewsResult::RequiredBufferSize() const +{ + return RequiredBufferSize(this->Model()); +} + +Result GetTitleNewsResult::Copy(ModelBuffer& buffer) const +{ + return buffer.CopyTo(&this->Model()); +} + +size_t GetTitleNewsResult::RequiredBufferSize(const PFTitleDataManagementGetTitleNewsResult& model) +{ + size_t requiredSize{ alignof(ModelType) + sizeof(ModelType) }; + requiredSize += (alignof(PFTitleDataManagementTitleNewsItem*) + sizeof(PFTitleDataManagementTitleNewsItem*) * model.newsCount); + for (size_t i = 0; i < model.newsCount; ++i) + { + requiredSize += TitleNewsItem::RequiredBufferSize(*model.news[i]); + } + return requiredSize; +} + +HRESULT GetTitleNewsResult::Copy(const PFTitleDataManagementGetTitleNewsResult& input, PFTitleDataManagementGetTitleNewsResult& output, ModelBuffer& buffer) +{ + output = input; + { + auto propCopyResult = buffer.CopyToArray(input.news, input.newsCount); + RETURN_IF_FAILED(propCopyResult.hr); + output.news = propCopyResult.ExtractPayload(); + } + return S_OK; +} + +JsonValue SetPublisherDataRequest::ToJson() const +{ + return SetPublisherDataRequest::ToJson(this->Model()); +} + +JsonValue SetPublisherDataRequest::ToJson(const PFTitleDataManagementSetPublisherDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Key", input.key); + JsonUtils::ObjectAddMember(output, "Value", input.value); + return output; +} + +JsonValue SetTitleDataRequest::ToJson() const +{ + return SetTitleDataRequest::ToJson(this->Model()); +} + +JsonValue SetTitleDataRequest::ToJson(const PFTitleDataManagementSetTitleDataRequest& input) +{ + JsonValue output{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(output, "Key", input.key); + JsonUtils::ObjectAddMember(output, "Value", input.value); + return output; +} + +} // namespace TitleDataManagement +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.h b/Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.h new file mode 100644 index 0000000..bc1f8b9 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/TitleDataManagementTypes.h @@ -0,0 +1,180 @@ +#pragma once + +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace TitleDataManagement +{ + +// TitleDataManagement Classes +class GetPublisherDataRequest : public Wrappers::PFTitleDataManagementGetPublisherDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementGetPublisherDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFTitleDataManagementGetPublisherDataRequest& input); +}; + +class GetPublisherDataResult : public Wrappers::PFTitleDataManagementGetPublisherDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementGetPublisherDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTitleDataManagementGetPublisherDataResult& model); + static HRESULT Copy(const PFTitleDataManagementGetPublisherDataResult& input, PFTitleDataManagementGetPublisherDataResult& output, ModelBuffer& buffer); +}; + +class GetTimeResult : public Wrappers::PFTitleDataManagementGetTimeResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementGetTimeResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTitleDataManagementGetTimeResult& model); + static HRESULT Copy(const PFTitleDataManagementGetTimeResult& input, PFTitleDataManagementGetTimeResult& output, ModelBuffer& buffer); +}; + +class GetTitleDataRequest : public Wrappers::PFTitleDataManagementGetTitleDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementGetTitleDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFTitleDataManagementGetTitleDataRequest& input); +}; + +class GetTitleDataResult : public Wrappers::PFTitleDataManagementGetTitleDataResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementGetTitleDataResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTitleDataManagementGetTitleDataResult& model); + static HRESULT Copy(const PFTitleDataManagementGetTitleDataResult& input, PFTitleDataManagementGetTitleDataResult& output, ModelBuffer& buffer); +}; + +class GetTitleNewsRequest : public Wrappers::PFTitleDataManagementGetTitleNewsRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementGetTitleNewsRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFTitleDataManagementGetTitleNewsRequest& input); +}; + +class TitleNewsItem : public Wrappers::PFTitleDataManagementTitleNewsItemWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementTitleNewsItemWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTitleDataManagementTitleNewsItem& model); + static HRESULT Copy(const PFTitleDataManagementTitleNewsItem& input, PFTitleDataManagementTitleNewsItem& output, ModelBuffer& buffer); +}; + +class GetTitleNewsResult : public Wrappers::PFTitleDataManagementGetTitleNewsResultWrapper, public ServiceOutputModel, public ClientOutputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementGetTitleNewsResultWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // ServiceOutputModel + HRESULT FromJson(const JsonValue& input) override; + // ClientOutputModel + size_t RequiredBufferSize() const override; + Result Copy(ModelBuffer& buffer) const override; + + static size_t RequiredBufferSize(const PFTitleDataManagementGetTitleNewsResult& model); + static HRESULT Copy(const PFTitleDataManagementGetTitleNewsResult& input, PFTitleDataManagementGetTitleNewsResult& output, ModelBuffer& buffer); +}; + +class SetPublisherDataRequest : public Wrappers::PFTitleDataManagementSetPublisherDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementSetPublisherDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFTitleDataManagementSetPublisherDataRequest& input); +}; + +class SetTitleDataRequest : public Wrappers::PFTitleDataManagementSetTitleDataRequestWrapper, public InputModel +{ +public: + using ModelWrapperType = typename Wrappers::PFTitleDataManagementSetTitleDataRequestWrapper; + using ModelWrapperType::ModelType; + + // Constructors + using ModelWrapperType::ModelWrapperType; + + // InputModel + JsonValue ToJson() const override; + static JsonValue ToJson(const PFTitleDataManagementSetTitleDataRequest& input); +}; + +} // namespace TitleDataManagement +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Types.cpp b/Source/PlayFabServices/Source/Generated/Types.cpp new file mode 100644 index 0000000..26f4f85 --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Types.cpp @@ -0,0 +1,9 @@ +#include "stdafx.h" +#include "Types.h" +#include "JsonUtils.h" +#include "Types.h" + +namespace PlayFab +{ + +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/Generated/Types.h b/Source/PlayFabServices/Source/Generated/Types.h new file mode 100644 index 0000000..781f78e --- /dev/null +++ b/Source/PlayFabServices/Source/Generated/Types.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include "Generated/CoreTypes.h" +#include "BaseModel.h" + +namespace PlayFab +{ +using Entity = Wrappers::Entity; +using ServiceConfig = Wrappers::ServiceConfig; + +// Shared Classes +// EnumRange definitions used for Enum (de)serialization +} // namespace PlayFab diff --git a/Source/PlayFabServices/Source/stdafx.cpp b/Source/PlayFabServices/Source/stdafx.cpp new file mode 100644 index 0000000..fd4f341 --- /dev/null +++ b/Source/PlayFabServices/Source/stdafx.cpp @@ -0,0 +1 @@ +#include "stdafx.h" diff --git a/Source/PlayFabServices/Source/stdafx.h b/Source/PlayFabServices/Source/stdafx.h new file mode 100644 index 0000000..9cec1f2 --- /dev/null +++ b/Source/PlayFabServices/Source/stdafx.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// libHttpClient headers +#include +#include +#include + +// PlayFabSharedInternal +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// PlayFabCore headers +#include +#include +#include + +// PlayFabServices headers +#include "Generated/Types.h" diff --git a/Source/PlayFabSharedInternal/Include/ApiXAsyncProvider.h b/Source/PlayFabSharedInternal/Include/ApiXAsyncProvider.h new file mode 100644 index 0000000..4ebfc85 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/ApiXAsyncProvider.h @@ -0,0 +1,107 @@ +#pragma once + +#include "XAsyncProviderBase.h" +#include "AsyncOp.h" +#include "Trace.h" +#include "Types.h" + +namespace PlayFab +{ + +// XAsyncProvider for PlayFab API calls +template +class ApiXAsyncProvider : public XAsyncProviderBase +{ +public: + template + ApiXAsyncProvider(RunContext&& rc, XAsyncBlock* async, const char(&identityName)[n], CallT call) : + XAsyncProviderBase{ std::move(rc), async, identityName }, + m_call{ call } + { + } + +protected: + using ResultT = typename Detail::UnwrapAsyncT>; + + // Always kick of the API call during XAsyncOp::Begin + HRESULT Begin(RunContext runContext) override + { + m_call(std::move(runContext)).Finally([this](Result result) + { + if (Succeeded(result)) + { + TRACE_VERBOSE("ApiProvider[ID=%s] Call suceeded (hr=0x%08x)", identityName, result.hr); + this->Complete(this->StoreResult(std::move(result))); + } + else + { + TRACE_ERROR("ApiProvider[ID=%s] Call failed with message \"%s\" (hr=0x%08x)", identityName, result.errorMessage.data(), result.hr); + this->Fail(result.hr); + } + }); + + return S_OK; + } + + HRESULT GetResult(void* buffer, size_t bufferSize) override + { + return GetResultHelper(buffer, bufferSize); + } + + // How we deliver the XAsync result will depend on ResultT of m_call: + // 1. If there is no result payload, there is no result to store & GetResult Op should never be called. + // 2. If the result payload is serializable, store the result, report the needed result buffer size, and serialize it into + // the clients buffer during GetResult. + // 3. If the result payload isn't serializable, store the result, report the needed buffer size as sizeof(PFResultHandle), + // and during GetResult, create a PFResult object return a pointer to that. + + template + size_t StoreResult(Result&&, typename std::enable_if_t>* = 0) + { + // No result to store in this case + return 0; + } + + template + size_t StoreResult(Result&& result, typename std::enable_if_t, T>>* = 0) + { + this->m_result.emplace(std::move(result)); + return this->m_result->Payload().RequiredBufferSize(); + } + + template + HRESULT GetResultHelper(void*, size_t, typename std::enable_if_t>* = 0) + { + // Should never be called + assert(false); + return E_UNEXPECTED; + } + + template + HRESULT GetResultHelper(void* buffer, size_t bufferSize, typename std::enable_if_t, T>>* = 0) + { + assert(m_result.has_value()); + ModelBuffer b{ buffer, bufferSize }; + auto copyResult = m_result->Payload().Copy(b); + if (SUCCEEDED(copyResult.hr)) + { + // Result should always be written to the beginning of the result buffer + assert((void*)(copyResult.Payload()) == buffer); + } + return copyResult.hr; + } + + CallT m_call; + // Storing Result rather than ResultT because Result is valid so we don't need a specialization for that + std::optional> m_result; + + using XAsyncProviderBase::identityName; +}; + +template +UniquePtr> MakeProvider(RunContext&& rc, XAsyncBlock* async, const char(&identityName)[n], CallT call) +{ + return MakeUnique>(std::move(rc), async, identityName, std::move(call)); +} + +} diff --git a/Source/PlayFabSharedInternal/Include/AsyncOp.h b/Source/PlayFabSharedInternal/Include/AsyncOp.h new file mode 100644 index 0000000..7dd0967 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/AsyncOp.h @@ -0,0 +1,407 @@ +#pragma once + +#include +#include "Result.h" +#include "Error.h" + +namespace PlayFab +{ + +// Forward declarations +template +class AsyncOp; + +template +class AsyncOpContext; + +namespace Detail +{ + +template +struct IsAsyncOpHelper : std::false_type {}; +template +struct IsAsyncOpHelper> : std::true_type {}; +template +constexpr bool IsAsyncOp = IsAsyncOpHelper::value; + +template +struct UnwrapAsyncHelper { typedef T type; }; +template +struct UnwrapAsyncHelper> { typedef T type; }; +template +using UnwrapAsyncT = typename UnwrapAsyncHelper::type; + +template +struct IsResultHelper : std::false_type {}; +template +struct IsResultHelper> : std::true_type {}; +template +constexpr bool IsResult = IsResultHelper::value; + +template +struct UnwrapResultHelper { typedef T type; }; +template +struct UnwrapResultHelper> { typedef T type; }; +template +using UnwrapResultT = typename UnwrapResultHelper::type; + +template +struct ContinuationTraits +{ + typedef typename std::invoke_result_t ContinuationReturnT; + typedef Detail::UnwrapAsyncT> AsyncOpT; +}; + +} + +// AsyncOp represents an asynchronous piece of work. +// +// An AsyncOp will result in a Result. Consumers should add a continuation function with either AsyncOp::Then +// or AsyncOp::Finally to handle the async result. +// +// The AsyncOp class doesn't implicitly control the thread/TaskQueue of the async operation - that is left to the implementer of +// first-class async operations. Continuation functions will be invoked synchronously on the thread where the antecedent task completed. +// If a continuation requires additional asyncronous work it is the responsibility of that continuation to schedule +// that work to appropriately. +// +// Currently there is no support for synchronously waiting for an AsyncOp to complete. +template +class AsyncOp +{ +public: + using ResultT = Result; + + AsyncOp(SharedPtr> context) noexcept; + + // Creates an AsyncOp in a completed state from a result. + AsyncOp(HRESULT hresult) noexcept; + AsyncOp(HRESULT hresult, String errorMessage) noexcept; + AsyncOp(Result&& result) noexcept; + + AsyncOp(const AsyncOp&) = default; + AsyncOp& operator=(const AsyncOp&) = default; + + // Add a continuation function to be run when the current AsyncOp completes. + // If the current op is already in a completed state, the continuation will be invoked synchronously. + template + auto Then(Func&& continuationFunc) noexcept -> AsyncOp::AsyncOpT>; + + // Add a final continuation function to be run when the current AsyncOp completes. + // The final continuation should handle all errors from the AsyncOp chain. + template + void Finally(Func&& continuationFunc) noexcept; + + // Block and wait for the AsyncOp to complete, returning the result + ResultT Wait() noexcept; + +private: + SharedPtr> m_context; +}; + + +// Interface for AsyncOp Continuations. The input ArgT to the continuation should be the ResultT of the previous +// async operation. +template +struct IContinuation +{ + virtual ~IContinuation() = default; + virtual void Run(ArgT&& arg) noexcept = 0; +}; + +// AsyncOpContext serves as a coordinator between the AsyncOp consumer & the AsyncOp implementation. Consumers can add a +// continuation function to be invoked when the operation completes, and AsyncOp implementers provide the result +// of the asynchronous operation when it completes. The AsyncOpContext stores the result/continuation until they are +// needed, and then passing the result along to the continuation when both have been provided. Ownership of the AsyncOpContext +// is shared between AsyncOp objects returned to consumers and AsyncOp implementers. +template +class AsyncOpContext +{ +public: + using ResultT = Result; + + AsyncOpContext(); + AsyncOpContext(Result&&); + AsyncOpContext(const AsyncOpContext&) = delete; + AsyncOpContext& operator=(const AsyncOpContext&) = delete; + virtual ~AsyncOpContext(); + + // Called by consumers of AsyncOps (via AsyncOp.Then/Finally) + void SetContinuation(SharedPtr> continuation) noexcept; + + // Called by AsyncOp implementations + void Complete(ResultT&& result) noexcept; + void Complete(std::exception_ptr exception) noexcept; + + // Called by final continuation to finalize AsyncOp chain + void Finalize() noexcept; + +private: + // State of the async operation. Pending indicates that the operation is pending (it can mean that its either + // not yet started or currently running). Completed indicates that the operation has completed and the result has been + // stashed in m_result. Finalized indicates that the result has been passed to the next continuation or that + // the async operation chain was explicitly finalized with AsyncOp::Finally + enum class State { Pending, Completed, Finalized } m_operationState; + + std::optional m_result; + SharedPtr> m_continuation; + mutable std::mutex m_mutex; +}; + +// Implementation of a Continuation to an AsyncOp. Func is a Functor that returns either Result or AsyncOp +// If Func returns an AsyncOp, an intermediate callback is inserted to collapse the async op chain. +template +class Continuation : public IContinuation, public std::enable_shared_from_this> +{ +public: + using AsyncOpT = typename Detail::ContinuationTraits::AsyncOpT; + using FuncReturnT = typename Detail::ContinuationTraits::ContinuationReturnT; + + Continuation(Func&& continuationFunction) noexcept; + Continuation(const Continuation&) = delete; + Continuation& operator=(const Continuation&) = delete; + ~Continuation() = default; + + AsyncOp AsAsyncOp() const noexcept; + void Run(ArgT&& result) noexcept; + +private: + template + typename std::enable_if_t> RunHelper(ArgT&& result) noexcept; + + template + typename std::enable_if_t> RunHelper(ArgT&& result) noexcept; + + template + typename std::enable_if_t && !Detail::IsAsyncOp> RunHelper(ArgT&& result) noexcept; + + Func m_function; + SharedPtr> const m_asyncContext; +}; + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +// AsyncOp Implementation +template +AsyncOp::AsyncOp(SharedPtr> context) noexcept + : m_context{ std::move(context) } +{ +} + +template +AsyncOp::AsyncOp(HRESULT hresult) noexcept + : m_context{ MakeShared>(Result{ hresult }) } +{ +} + +template +AsyncOp::AsyncOp(HRESULT hresult, String errorMessage) noexcept + : m_context{ MakeShared>(Result{ hresult, std::move(errorMessage) }) } +{ +} + +template +AsyncOp::AsyncOp(Result&& result) noexcept + : m_context{ MakeShared>(std::move(result)) } +{ +} + +template template +auto AsyncOp::Then(Func&& continuationFunc) noexcept -> AsyncOp::AsyncOpT> +{ + static_assert(Detail::IsResult> || Detail::IsAsyncOp>, "Continuation functions must return either Result or AsyncOp"); + + auto continuation = MakeShared>(std::move(continuationFunc)); + m_context->SetContinuation(continuation); + return continuation->AsAsyncOp(); +} + +template template +void AsyncOp::Finally(Func&& continuationFunc) noexcept +{ + static_assert(std::is_void>::value, "Final continuation may not return a value"); + + auto continuation = MakeShared>(std::move(continuationFunc)); + m_context->SetContinuation(continuation); +} + +template +typename AsyncOp::ResultT AsyncOp::Wait() noexcept +{ + std::mutex mutex; + std::condition_variable waitCondition; + bool operationComplete{ false }; + std::optional asyncResult; + + this->Finally([&](ResultT&& result) + { + std::lock_guard lock{ mutex }; + asyncResult.emplace(std::move(result)); + operationComplete = true; + waitCondition.notify_one(); + }); + + std::unique_lock lock{ mutex }; + if (!operationComplete) + { + waitCondition.wait(lock, [&operationComplete] { return operationComplete; }); + } + + assert(asyncResult.has_value()); + return std::move(*asyncResult); +} + +// AsyncOpContext Implementation +template +AsyncOpContext::AsyncOpContext() + : m_operationState{ State::Pending } +{ +} + +template +AsyncOpContext::AsyncOpContext(Result&& result) + : m_operationState{ State::Completed }, + m_result{ std::move(result) } +{ +} + +template +AsyncOpContext::~AsyncOpContext() +{ + // Sanity check. All async ops should complete and pass the result along + assert(m_operationState == State::Finalized); +} + +template +void AsyncOpContext::SetContinuation(SharedPtr> continuation) noexcept +{ + std::lock_guard lock{ m_mutex }; + + // Don't allow multiple continuations to a single async operation. Logically this is like a function returning to two places and + // it's extremely hard to reason about & debug. It also creates issues with transferring ownership of the Result object + // to the continutation, etc. + assert(!m_continuation); + + switch (m_operationState) + { + case State::Pending: + { + m_continuation = continuation; + break; + } + case State::Completed: + { + continuation->Run(std::move(*m_result)); + m_operationState = State::Finalized; + break; + } + case State::Finalized: + default: + { + assert(false); + } + } +} + +template +void AsyncOpContext::Complete(ResultT&& result) noexcept +{ + std::lock_guard lock{ m_mutex }; + assert(m_operationState == State::Pending); + + if (m_continuation) + { + m_continuation->Run(std::move(result)); + m_operationState = State::Finalized; + } + else + { + m_result.emplace(std::move(result)); + m_operationState = State::Completed; + } +} + +template +void AsyncOpContext::Complete(std::exception_ptr) noexcept +{ + Complete(Result{ CurrentExceptionToHR(), "Unhandled exception during async operation. Propogating to AsyncOp continuation." }); +} + +template +void AsyncOpContext::Finalize() noexcept +{ + std::lock_guard lock{ m_mutex }; + assert(m_operationState == State::Pending); + assert(!m_continuation); + + m_operationState = State::Finalized; +} + +// Continuation implementation +template +Continuation::Continuation(Func&& continuationFunction) noexcept + : m_function{ std::move(continuationFunction) }, + m_asyncContext{ MakeShared>() } +{ +} + +template +AsyncOp::AsyncOpT> Continuation::AsAsyncOp() const noexcept +{ + return AsyncOp{ m_asyncContext }; +} + +template +void Continuation::Run(ArgT&& result) noexcept +{ + RunHelper(std::move(result)); +} + +template template +typename std::enable_if_t> Continuation::RunHelper(ArgT&& result) noexcept +{ + // If func doesn't return a value, finalize the async operation chain. + m_function(std::move(result)); + m_asyncContext->Finalize(); +} + +template template +typename std::enable_if_t> Continuation::RunHelper(ArgT&& result) noexcept +{ + try + { + // If func returns an AsyncOp, insert an intermediate continuation to grab its result + m_function(std::move(result)).Finally([sharedThis = this->shared_from_this()](auto r) + { + sharedThis->m_asyncContext->Complete(std::move(r)); + }); + } + catch (std::exception& ex) + { + m_asyncContext->Complete({ CurrentExceptionToHR(), ex.what() }); + } + catch (...) + { + m_asyncContext->Complete(std::current_exception()); + } +} + +template template +typename std::enable_if_t && !Detail::IsAsyncOp> Continuation::RunHelper(ArgT&& result) noexcept +{ + try + { + m_asyncContext->Complete(m_function(std::move(result))); + } + catch (std::exception& ex) + { + m_asyncContext->Complete({ CurrentExceptionToHR(), ex.what() }); + } + catch (...) + { + m_asyncContext->Complete(std::current_exception()); + } +} + +} diff --git a/Source/PlayFabSharedInternal/Include/BaseModel.h b/Source/PlayFabSharedInternal/Include/BaseModel.h new file mode 100644 index 0000000..1957f71 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/BaseModel.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include "ModelBuffer.h" + +namespace PlayFab +{ + +using Wrappers::SafeString; + +// Hooked public wrapper types +using JsonObject = Wrappers::JsonObject; + +template +using ModelVector = Wrappers::ModelVector; + +using CStringVector = Wrappers::CStringVector; + +template +using DictionaryEntryVector = Wrappers::DictionaryEntryVector; + +template +using ModelDictionaryEntryVector = Wrappers::ModelDictionaryEntryVector; + +using StringDictionaryEntryVector = Wrappers::StringDictionaryEntryVector; + +// Base class from all Model Wrappers that are input arguments to PlayFab APIs +class InputModel +{ +public: + virtual ~InputModel() = default; + virtual JsonValue ToJson() const = 0; +}; + +// Base class from all Models that are returned from PlayFab service APIs +class ServiceOutputModel +{ +public: + virtual ~ServiceOutputModel() = default; + virtual HRESULT FromJson(const JsonValue& input) = 0; +}; + +// Base class for all Model Wrappers that are returned from public client APIs +template +class ClientOutputModel +{ +public: + using ModelType = ModelT; + + virtual ~ClientOutputModel() = default; + virtual size_t RequiredBufferSize() const = 0; + virtual Result Copy(ModelBuffer& buffer) const = 0; +}; + +} // namespace PlayFab diff --git a/Source/PlayFabSharedInternal/Include/CancellationToken.h b/Source/PlayFabSharedInternal/Include/CancellationToken.h new file mode 100644 index 0000000..34a84bd --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/CancellationToken.h @@ -0,0 +1,46 @@ +// Token that coordinates cancellation between consumers and implementers of asyncronous operations + +#pragma once + +#include "Memory.h" + +namespace PlayFab +{ + +struct ICancellationListener +{ + virtual ~ICancellationListener() = default; + virtual void OnCancellation() = 0; +}; + +class CancellationToken +{ +public: + static CancellationToken Root() noexcept; + CancellationToken Derive() const noexcept; + + CancellationToken(CancellationToken const& other) noexcept = default; + CancellationToken(CancellationToken&& other) noexcept = default; + CancellationToken& operator=(CancellationToken const& other) noexcept = delete; + CancellationToken& operator=(CancellationToken&& other) noexcept = delete; + ~CancellationToken() noexcept = default; + + bool IsCancelled() const noexcept; + + // returns true if there were listeners that have been cancelled + bool Cancel() noexcept; + + // Register a cancellation listener. Returns true if cancellation has already happened, + // and the listener will not be invoked in that case + bool RegisterForNotificationAndCheck(ICancellationListener& listener) noexcept; + bool UnregisterForNotificationAndCheck(ICancellationListener& listener) noexcept; + +private: + class SharedState; + + CancellationToken(SharedPtr state) noexcept; + + SharedPtr m_state; +}; + +} diff --git a/Source/PlayFabSharedInternal/Include/EnumTraits.h b/Source/PlayFabSharedInternal/Include/EnumTraits.h new file mode 100644 index 0000000..fbc9c57 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/EnumTraits.h @@ -0,0 +1,199 @@ +#pragma once + +#if _HAS_CXX17 +// use std::string_view implementation if available +#include +#endif + +namespace PlayFab +{ + +template +struct EnumRange +{ + // Provide an arbitrary range for enum values by default. If enum has values greater that this default, + // specialize this class to provide a custom value. + static constexpr E maxValue = static_cast(100); +}; + +namespace Detail +{ + +#if _HAS_CXX17 +using StringView = std::string_view; +#else +// Very minimal StringView definition +class StringView +{ +public: + using const_pointer = const char*; + using size_type = size_t; + + constexpr StringView() + : m_data{ nullptr }, + m_size{ 0 } + { + } + constexpr StringView(const_pointer data, size_type size) + : m_data{ data }, + m_size{ size } + { + } + constexpr StringView(const StringView&) = default; + constexpr StringView& operator=(const StringView&) = default; + + constexpr const_pointer data() const + { + return m_data; + } + + constexpr size_type length() const + { + return m_size; + } + +private: + const_pointer m_data; + size_type m_size; +}; +#endif + +template +class StaticString +{ +public: + constexpr StaticString(const char* name) noexcept + : StaticString{ name, std::make_index_sequence{} } + { + } + + constexpr operator StringView() const noexcept + { + return StringView{ chars, n }; + } + +private: + template + constexpr StaticString(const char* name, std::index_sequence) noexcept + : chars{ name[I]..., 0 } + { + } + + const char chars[n + 1]{}; +}; + +template<> +class StaticString<0> +{ +public: + constexpr StaticString(const char*) noexcept {}; + constexpr operator StringView() const noexcept + { + return StringView{}; + } +}; + +constexpr StringView ParseName(const char* funcName) noexcept +{ +#if defined(_MSC_VER) + constexpr auto delim{ '>' }; +#elif defined(__clang__) + constexpr auto delim{ ']' }; +#endif + size_t end{ 0 }; + for (; funcName[end] && funcName[end] != delim; ++end) {} + + size_t begin{ end }; + for (; begin > 0; --begin) + { + if (!((funcName[begin - 1] >= '0' && funcName[begin - 1] <= '9') || + (funcName[begin - 1] >= 'a' && funcName[begin - 1] <= 'z') || + (funcName[begin - 1] >= 'A' && funcName[begin - 1] <= 'Z') || + (funcName[begin - 1] == '_'))) + { + break; + } + } + + // Symbol names cannot begin with a number + if (funcName[begin] >= '0' && funcName[begin] <= '9') + { + // Invalid enum value + return StringView{}; + } + + return StringView{ funcName + begin, end - begin }; +} + +template +static constexpr auto N() noexcept +{ + static_assert(std::is_enum::value, "E must be an enum type."); +#if defined(_MSC_VER) + constexpr auto name = ParseName(__FUNCSIG__); +#elif defined(__clang__) + constexpr auto name = ParseName(__PRETTY_FUNCTION__); +#else + static_assert(false, "Unrecognized platform"); +#endif + return StaticString{ name.data() }; +} + +template +constexpr auto EnumValueName = N(); + +template +struct EnumTraits +{ +private: + static_assert(std::is_enum_v, "EnumTraits can only be instantiated for enum types."); + + static constexpr size_t maxValue = static_cast(EnumRange::maxValue); + + template + static constexpr auto ValueNames(std::index_sequence) noexcept + { + return std::array{ { EnumValueName(I)>... } }; + } + static constexpr std::array valueNames = ValueNames(std::make_index_sequence()); + +public: + static const char* Name(E value) noexcept + { + auto i{ static_cast(value) }; + if (i > maxValue) + { + assert(false); + return nullptr; + } + return valueNames[i].data(); + } + + static E Value(const char* name) noexcept + { + for (auto i = 0u; i < valueNames.size(); ++i) + { + if (strcmp(name, valueNames[i].data()) == 0) + { + return static_cast(i); + } + } + assert(false); + return E{}; + } +}; + +} // namespace Detail + +template +constexpr auto EnumName(E value) noexcept -> std::enable_if_t::value, const char*> +{ + return Detail::EnumTraits::Name(value); +} + +template +constexpr auto EnumValue(const char* name) noexcept -> std::enable_if_t::value, E> +{ + return Detail::EnumTraits::Value(name); +} +} diff --git a/Source/PlayFabSharedInternal/Include/GDK/PlatformUser_GDK.h b/Source/PlayFabSharedInternal/Include/GDK/PlatformUser_GDK.h new file mode 100644 index 0000000..8405e80 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/GDK/PlatformUser_GDK.h @@ -0,0 +1,54 @@ +#pragma once + +#include "AsyncOp.h" +#include + +namespace PlayFab +{ +namespace Platform +{ + +struct TokenAndSignature +{ + String token; + String signature; +}; + +// RAII wrapper around XUserHandle +class User +{ +public: + // XUsers must be copied with User::Duplicate + User(const User& other) = delete; + User(User&& other) noexcept = default; + User& operator=(User&& other) noexcept = default; + ~User() noexcept = default; + + static Result Wrap(XUserHandle userHandle) noexcept; + static Result Duplicate(XUserHandle userHandle) noexcept; + static AsyncOp Add( + XUserAddOptions options, + RunContext rc + ) noexcept; + + XUserHandle Handle() const noexcept; + uint64_t Id() const noexcept; + + AsyncOp GetTokenAndSignature( + RunContext runContext + ) const noexcept; + +private: + User(XUserHandle userHandle) noexcept; + + HRESULT Initialize() noexcept; + + PlayFab::Wrappers::XUser m_user; + mutable uint64_t m_id{ 0 }; +}; + +} // namespace Platform + +using XUser = Platform::User; + +} // namespace PlayFab diff --git a/Source/PlayFabSharedInternal/Include/Generated/Error.h b/Source/PlayFabSharedInternal/Include/Generated/Error.h new file mode 100644 index 0000000..8e0731c --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/Generated/Error.h @@ -0,0 +1,751 @@ +#pragma once + +#include +#include "BaseModel.h" + +namespace PlayFab +{ + +// Errors returned from PlayFab service calls +enum class ServiceErrorCode +{ + Success = 0, + UnkownError = 500, + InvalidParams = 1000, + AccountNotFound = 1001, + AccountBanned = 1002, + InvalidUsernameOrPassword = 1003, + InvalidTitleId = 1004, + InvalidEmailAddress = 1005, + EmailAddressNotAvailable = 1006, + InvalidUsername = 1007, + InvalidPassword = 1008, + UsernameNotAvailable = 1009, + InvalidSteamTicket = 1010, + AccountAlreadyLinked = 1011, + LinkedAccountAlreadyClaimed = 1012, + InvalidFacebookToken = 1013, + AccountNotLinked = 1014, + FailedByPaymentProvider = 1015, + CouponCodeNotFound = 1016, + InvalidContainerItem = 1017, + ContainerNotOwned = 1018, + KeyNotOwned = 1019, + InvalidItemIdInTable = 1020, + InvalidReceipt = 1021, + ReceiptAlreadyUsed = 1022, + ReceiptCancelled = 1023, + GameNotFound = 1024, + GameModeNotFound = 1025, + InvalidGoogleToken = 1026, + UserIsNotPartOfDeveloper = 1027, + InvalidTitleForDeveloper = 1028, + TitleNameConflicts = 1029, + UserisNotValid = 1030, + ValueAlreadyExists = 1031, + BuildNotFound = 1032, + PlayerNotInGame = 1033, + InvalidTicket = 1034, + InvalidDeveloper = 1035, + InvalidOrderInfo = 1036, + RegistrationIncomplete = 1037, + InvalidPlatform = 1038, + UnknownError = 1039, + SteamApplicationNotOwned = 1040, + WrongSteamAccount = 1041, + TitleNotActivated = 1042, + RegistrationSessionNotFound = 1043, + NoSuchMod = 1044, + FileNotFound = 1045, + DuplicateEmail = 1046, + ItemNotFound = 1047, + ItemNotOwned = 1048, + ItemNotRecycleable = 1049, + ItemNotAffordable = 1050, + InvalidVirtualCurrency = 1051, + WrongVirtualCurrency = 1052, + WrongPrice = 1053, + NonPositiveValue = 1054, + InvalidRegion = 1055, + RegionAtCapacity = 1056, + ServerFailedToStart = 1057, + NameNotAvailable = 1058, + InsufficientFunds = 1059, + InvalidDeviceID = 1060, + InvalidPushNotificationToken = 1061, + NoRemainingUses = 1062, + InvalidPaymentProvider = 1063, + PurchaseInitializationFailure = 1064, + DuplicateUsername = 1065, + InvalidBuyerInfo = 1066, + NoGameModeParamsSet = 1067, + BodyTooLarge = 1068, + ReservedWordInBody = 1069, + InvalidTypeInBody = 1070, + InvalidRequest = 1071, + ReservedEventName = 1072, + InvalidUserStatistics = 1073, + NotAuthenticated = 1074, + StreamAlreadyExists = 1075, + ErrorCreatingStream = 1076, + StreamNotFound = 1077, + InvalidAccount = 1078, + PurchaseDoesNotExist = 1080, + InvalidPurchaseTransactionStatus = 1081, + APINotEnabledForGameClientAccess = 1082, + NoPushNotificationARNForTitle = 1083, + BuildAlreadyExists = 1084, + BuildPackageDoesNotExist = 1085, + CustomAnalyticsEventsNotEnabledForTitle = 1087, + InvalidSharedGroupId = 1088, + NotAuthorized = 1089, + MissingTitleGoogleProperties = 1090, + InvalidItemProperties = 1091, + InvalidPSNAuthCode = 1092, + InvalidItemId = 1093, + PushNotEnabledForAccount = 1094, + PushServiceError = 1095, + ReceiptDoesNotContainInAppItems = 1096, + ReceiptContainsMultipleInAppItems = 1097, + InvalidBundleID = 1098, + JavascriptException = 1099, + InvalidSessionTicket = 1100, + UnableToConnectToDatabase = 1101, + InternalServerError = 1110, + InvalidReportDate = 1111, + ReportNotAvailable = 1112, + DatabaseThroughputExceeded = 1113, + InvalidGameTicket = 1115, + ExpiredGameTicket = 1116, + GameTicketDoesNotMatchLobby = 1117, + LinkedDeviceAlreadyClaimed = 1118, + DeviceAlreadyLinked = 1119, + DeviceNotLinked = 1120, + PartialFailure = 1121, + PublisherNotSet = 1122, + ServiceUnavailable = 1123, + VersionNotFound = 1124, + RevisionNotFound = 1125, + InvalidPublisherId = 1126, + DownstreamServiceUnavailable = 1127, + APINotIncludedInTitleUsageTier = 1128, + DAULimitExceeded = 1129, + APIRequestLimitExceeded = 1130, + InvalidAPIEndpoint = 1131, + BuildNotAvailable = 1132, + ConcurrentEditError = 1133, + ContentNotFound = 1134, + CharacterNotFound = 1135, + CloudScriptNotFound = 1136, + ContentQuotaExceeded = 1137, + InvalidCharacterStatistics = 1138, + PhotonNotEnabledForTitle = 1139, + PhotonApplicationNotFound = 1140, + PhotonApplicationNotAssociatedWithTitle = 1141, + InvalidEmailOrPassword = 1142, + FacebookAPIError = 1143, + InvalidContentType = 1144, + KeyLengthExceeded = 1145, + DataLengthExceeded = 1146, + TooManyKeys = 1147, + FreeTierCannotHaveVirtualCurrency = 1148, + MissingAmazonSharedKey = 1149, + AmazonValidationError = 1150, + InvalidPSNIssuerId = 1151, + PSNInaccessible = 1152, + ExpiredAuthToken = 1153, + FailedToGetEntitlements = 1154, + FailedToConsumeEntitlement = 1155, + TradeAcceptingUserNotAllowed = 1156, + TradeInventoryItemIsAssignedToCharacter = 1157, + TradeInventoryItemIsBundle = 1158, + TradeStatusNotValidForCancelling = 1159, + TradeStatusNotValidForAccepting = 1160, + TradeDoesNotExist = 1161, + TradeCancelled = 1162, + TradeAlreadyFilled = 1163, + TradeWaitForStatusTimeout = 1164, + TradeInventoryItemExpired = 1165, + TradeMissingOfferedAndAcceptedItems = 1166, + TradeAcceptedItemIsBundle = 1167, + TradeAcceptedItemIsStackable = 1168, + TradeInventoryItemInvalidStatus = 1169, + TradeAcceptedCatalogItemInvalid = 1170, + TradeAllowedUsersInvalid = 1171, + TradeInventoryItemDoesNotExist = 1172, + TradeInventoryItemIsConsumed = 1173, + TradeInventoryItemIsStackable = 1174, + TradeAcceptedItemsMismatch = 1175, + InvalidKongregateToken = 1176, + FeatureNotConfiguredForTitle = 1177, + NoMatchingCatalogItemForReceipt = 1178, + InvalidCurrencyCode = 1179, + NoRealMoneyPriceForCatalogItem = 1180, + TradeInventoryItemIsNotTradable = 1181, + TradeAcceptedCatalogItemIsNotTradable = 1182, + UsersAlreadyFriends = 1183, + LinkedIdentifierAlreadyClaimed = 1184, + CustomIdNotLinked = 1185, + TotalDataSizeExceeded = 1186, + DeleteKeyConflict = 1187, + InvalidXboxLiveToken = 1188, + ExpiredXboxLiveToken = 1189, + ResettableStatisticVersionRequired = 1190, + NotAuthorizedByTitle = 1191, + NoPartnerEnabled = 1192, + InvalidPartnerResponse = 1193, + APINotEnabledForGameServerAccess = 1194, + StatisticNotFound = 1195, + StatisticNameConflict = 1196, + StatisticVersionClosedForWrites = 1197, + StatisticVersionInvalid = 1198, + APIClientRequestRateLimitExceeded = 1199, + InvalidJSONContent = 1200, + InvalidDropTable = 1201, + StatisticVersionAlreadyIncrementedForScheduledInterval = 1202, + StatisticCountLimitExceeded = 1203, + StatisticVersionIncrementRateExceeded = 1204, + ContainerKeyInvalid = 1205, + CloudScriptExecutionTimeLimitExceeded = 1206, + NoWritePermissionsForEvent = 1207, + CloudScriptFunctionArgumentSizeExceeded = 1208, + CloudScriptAPIRequestCountExceeded = 1209, + CloudScriptAPIRequestError = 1210, + CloudScriptHTTPRequestError = 1211, + InsufficientGuildRole = 1212, + GuildNotFound = 1213, + OverLimit = 1214, + EventNotFound = 1215, + InvalidEventField = 1216, + InvalidEventName = 1217, + CatalogNotConfigured = 1218, + OperationNotSupportedForPlatform = 1219, + SegmentNotFound = 1220, + StoreNotFound = 1221, + InvalidStatisticName = 1222, + TitleNotQualifiedForLimit = 1223, + InvalidServiceLimitLevel = 1224, + ServiceLimitLevelInTransition = 1225, + CouponAlreadyRedeemed = 1226, + GameServerBuildSizeLimitExceeded = 1227, + GameServerBuildCountLimitExceeded = 1228, + VirtualCurrencyCountLimitExceeded = 1229, + VirtualCurrencyCodeExists = 1230, + TitleNewsItemCountLimitExceeded = 1231, + InvalidTwitchToken = 1232, + TwitchResponseError = 1233, + ProfaneDisplayName = 1234, + UserAlreadyAdded = 1235, + InvalidVirtualCurrencyCode = 1236, + VirtualCurrencyCannotBeDeleted = 1237, + IdentifierAlreadyClaimed = 1238, + IdentifierNotLinked = 1239, + InvalidContinuationToken = 1240, + ExpiredContinuationToken = 1241, + InvalidSegment = 1242, + InvalidSessionId = 1243, + SessionLogNotFound = 1244, + InvalidSearchTerm = 1245, + TwoFactorAuthenticationTokenRequired = 1246, + GameServerHostCountLimitExceeded = 1247, + PlayerTagCountLimitExceeded = 1248, + RequestAlreadyRunning = 1249, + ActionGroupNotFound = 1250, + MaximumSegmentBulkActionJobsRunning = 1251, + NoActionsOnPlayersInSegmentJob = 1252, + DuplicateStatisticName = 1253, + ScheduledTaskNameConflict = 1254, + ScheduledTaskCreateConflict = 1255, + InvalidScheduledTaskName = 1256, + InvalidTaskSchedule = 1257, + SteamNotEnabledForTitle = 1258, + LimitNotAnUpgradeOption = 1259, + NoSecretKeyEnabledForCloudScript = 1260, + TaskNotFound = 1261, + TaskInstanceNotFound = 1262, + InvalidIdentityProviderId = 1263, + MisconfiguredIdentityProvider = 1264, + InvalidScheduledTaskType = 1265, + BillingInformationRequired = 1266, + LimitedEditionItemUnavailable = 1267, + InvalidAdPlacementAndReward = 1268, + AllAdPlacementViewsAlreadyConsumed = 1269, + GoogleOAuthNotConfiguredForTitle = 1270, + GoogleOAuthError = 1271, + UserNotFriend = 1272, + InvalidSignature = 1273, + InvalidPublicKey = 1274, + GoogleOAuthNoIdTokenIncludedInResponse = 1275, + StatisticUpdateInProgress = 1276, + LeaderboardVersionNotAvailable = 1277, + StatisticAlreadyHasPrizeTable = 1279, + PrizeTableHasOverlappingRanks = 1280, + PrizeTableHasMissingRanks = 1281, + PrizeTableRankStartsAtZero = 1282, + InvalidStatistic = 1283, + ExpressionParseFailure = 1284, + ExpressionInvokeFailure = 1285, + ExpressionTooLong = 1286, + DataUpdateRateExceeded = 1287, + RestrictedEmailDomain = 1288, + EncryptionKeyDisabled = 1289, + EncryptionKeyMissing = 1290, + EncryptionKeyBroken = 1291, + NoSharedSecretKeyConfigured = 1292, + SecretKeyNotFound = 1293, + PlayerSecretAlreadyConfigured = 1294, + APIRequestsDisabledForTitle = 1295, + InvalidSharedSecretKey = 1296, + PrizeTableHasNoRanks = 1297, + ProfileDoesNotExist = 1298, + ContentS3OriginBucketNotConfigured = 1299, + InvalidEnvironmentForReceipt = 1300, + EncryptedRequestNotAllowed = 1301, + SignedRequestNotAllowed = 1302, + RequestViewConstraintParamsNotAllowed = 1303, + BadPartnerConfiguration = 1304, + XboxBPCertificateFailure = 1305, + XboxXASSExchangeFailure = 1306, + InvalidEntityId = 1307, + StatisticValueAggregationOverflow = 1308, + EmailMessageFromAddressIsMissing = 1309, + EmailMessageToAddressIsMissing = 1310, + SmtpServerAuthenticationError = 1311, + SmtpServerLimitExceeded = 1312, + SmtpServerInsufficientStorage = 1313, + SmtpServerCommunicationError = 1314, + SmtpServerGeneralFailure = 1315, + EmailClientTimeout = 1316, + EmailClientCanceledTask = 1317, + EmailTemplateMissing = 1318, + InvalidHostForTitleId = 1319, + EmailConfirmationTokenDoesNotExist = 1320, + EmailConfirmationTokenExpired = 1321, + AccountDeleted = 1322, + PlayerSecretNotConfigured = 1323, + InvalidSignatureTime = 1324, + NoContactEmailAddressFound = 1325, + InvalidAuthToken = 1326, + AuthTokenDoesNotExist = 1327, + AuthTokenExpired = 1328, + AuthTokenAlreadyUsedToResetPassword = 1329, + MembershipNameTooLong = 1330, + MembershipNotFound = 1331, + GoogleServiceAccountInvalid = 1332, + GoogleServiceAccountParseFailure = 1333, + EntityTokenMissing = 1334, + EntityTokenInvalid = 1335, + EntityTokenExpired = 1336, + EntityTokenRevoked = 1337, + InvalidProductForSubscription = 1338, + XboxInaccessible = 1339, + SubscriptionAlreadyTaken = 1340, + SmtpAddonNotEnabled = 1341, + APIConcurrentRequestLimitExceeded = 1342, + XboxRejectedXSTSExchangeRequest = 1343, + VariableNotDefined = 1344, + TemplateVersionNotDefined = 1345, + FileTooLarge = 1346, + TitleDeleted = 1347, + TitleContainsUserAccounts = 1348, + TitleDeletionPlayerCleanupFailure = 1349, + EntityFileOperationPending = 1350, + NoEntityFileOperationPending = 1351, + EntityProfileVersionMismatch = 1352, + TemplateVersionTooOld = 1353, + MembershipDefinitionInUse = 1354, + PaymentPageNotConfigured = 1355, + FailedLoginAttemptRateLimitExceeded = 1356, + EntityBlockedByGroup = 1357, + RoleDoesNotExist = 1358, + EntityIsAlreadyMember = 1359, + DuplicateRoleId = 1360, + GroupInvitationNotFound = 1361, + GroupApplicationNotFound = 1362, + OutstandingInvitationAcceptedInstead = 1363, + OutstandingApplicationAcceptedInstead = 1364, + RoleIsGroupDefaultMember = 1365, + RoleIsGroupAdmin = 1366, + RoleNameNotAvailable = 1367, + GroupNameNotAvailable = 1368, + EmailReportAlreadySent = 1369, + EmailReportRecipientBlacklisted = 1370, + EventNamespaceNotAllowed = 1371, + EventEntityNotAllowed = 1372, + InvalidEntityType = 1373, + NullTokenResultFromAad = 1374, + InvalidTokenResultFromAad = 1375, + NoValidCertificateForAad = 1376, + InvalidCertificateForAad = 1377, + DuplicateDropTableId = 1378, + MultiplayerServerError = 1379, + MultiplayerServerTooManyRequests = 1380, + MultiplayerServerNoContent = 1381, + MultiplayerServerBadRequest = 1382, + MultiplayerServerUnauthorized = 1383, + MultiplayerServerForbidden = 1384, + MultiplayerServerNotFound = 1385, + MultiplayerServerConflict = 1386, + MultiplayerServerInternalServerError = 1387, + MultiplayerServerUnavailable = 1388, + ExplicitContentDetected = 1389, + PIIContentDetected = 1390, + InvalidScheduledTaskParameter = 1391, + PerEntityEventRateLimitExceeded = 1392, + TitleDefaultLanguageNotSet = 1393, + EmailTemplateMissingDefaultVersion = 1394, + FacebookInstantGamesIdNotLinked = 1395, + InvalidFacebookInstantGamesSignature = 1396, + FacebookInstantGamesAuthNotConfiguredForTitle = 1397, + EntityProfileConstraintValidationFailed = 1398, + TelemetryIngestionKeyPending = 1399, + TelemetryIngestionKeyNotFound = 1400, + StatisticChildNameInvalid = 1402, + DataIntegrityError = 1403, + VirtualCurrencyCannotBeSetToOlderVersion = 1404, + VirtualCurrencyMustBeWithinIntegerRange = 1405, + EmailTemplateInvalidSyntax = 1406, + EmailTemplateMissingCallback = 1407, + PushNotificationTemplateInvalidPayload = 1408, + InvalidLocalizedPushNotificationLanguage = 1409, + MissingLocalizedPushNotificationMessage = 1410, + PushNotificationTemplateMissingPlatformPayload = 1411, + PushNotificationTemplatePayloadContainsInvalidJson = 1412, + PushNotificationTemplateContainsInvalidIosPayload = 1413, + PushNotificationTemplateContainsInvalidAndroidPayload = 1414, + PushNotificationTemplateIosPayloadMissingNotificationBody = 1415, + PushNotificationTemplateAndroidPayloadMissingNotificationBody = 1416, + PushNotificationTemplateNotFound = 1417, + PushNotificationTemplateMissingDefaultVersion = 1418, + PushNotificationTemplateInvalidSyntax = 1419, + PushNotificationTemplateNoCustomPayloadForV1 = 1420, + NoLeaderboardForStatistic = 1421, + TitleNewsMissingDefaultLanguage = 1422, + TitleNewsNotFound = 1423, + TitleNewsDuplicateLanguage = 1424, + TitleNewsMissingTitleOrBody = 1425, + TitleNewsInvalidLanguage = 1426, + EmailRecipientBlacklisted = 1427, + InvalidGameCenterAuthRequest = 1428, + GameCenterAuthenticationFailed = 1429, + CannotEnablePartiesForTitle = 1430, + PartyError = 1431, + PartyRequests = 1432, + PartyNoContent = 1433, + PartyBadRequest = 1434, + PartyUnauthorized = 1435, + PartyForbidden = 1436, + PartyNotFound = 1437, + PartyConflict = 1438, + PartyInternalServerError = 1439, + PartyUnavailable = 1440, + PartyTooManyRequests = 1441, + PushNotificationTemplateMissingName = 1442, + CannotEnableMultiplayerServersForTitle = 1443, + WriteAttemptedDuringExport = 1444, + MultiplayerServerTitleQuotaCoresExceeded = 1445, + AutomationRuleNotFound = 1446, + EntityAPIKeyLimitExceeded = 1447, + EntityAPIKeyNotFound = 1448, + EntityAPIKeyOrSecretInvalid = 1449, + EconomyServiceUnavailable = 1450, + EconomyServiceInternalError = 1451, + QueryRateLimitExceeded = 1452, + EntityAPIKeyCreationDisabledForEntity = 1453, + ForbiddenByEntityPolicy = 1454, + UpdateInventoryRateLimitExceeded = 1455, + StudioCreationRateLimited = 1456, + StudioCreationInProgress = 1457, + DuplicateStudioName = 1458, + StudioNotFound = 1459, + StudioDeleted = 1460, + StudioDeactivated = 1461, + StudioActivated = 1462, + TitleCreationRateLimited = 1463, + TitleCreationInProgress = 1464, + DuplicateTitleName = 1465, + TitleActivationRateLimited = 1466, + TitleActivationInProgress = 1467, + TitleDeactivated = 1468, + TitleActivated = 1469, + CloudScriptAzureFunctionsExecutionTimeLimitExceeded = 1470, + CloudScriptAzureFunctionsArgumentSizeExceeded = 1471, + CloudScriptAzureFunctionsReturnSizeExceeded = 1472, + CloudScriptAzureFunctionsHTTPRequestError = 1473, + VirtualCurrencyBetaGetError = 1474, + VirtualCurrencyBetaCreateError = 1475, + VirtualCurrencyBetaInitialDepositSaveError = 1476, + VirtualCurrencyBetaSaveError = 1477, + VirtualCurrencyBetaDeleteError = 1478, + VirtualCurrencyBetaRestoreError = 1479, + VirtualCurrencyBetaSaveConflict = 1480, + VirtualCurrencyBetaUpdateError = 1481, + InsightsManagementDatabaseNotFound = 1482, + InsightsManagementOperationNotFound = 1483, + InsightsManagementErrorPendingOperationExists = 1484, + InsightsManagementSetPerformanceLevelInvalidParameter = 1485, + InsightsManagementSetStorageRetentionInvalidParameter = 1486, + InsightsManagementGetStorageUsageInvalidParameter = 1487, + InsightsManagementGetOperationStatusInvalidParameter = 1488, + DuplicatePurchaseTransactionId = 1489, + EvaluationModePlayerCountExceeded = 1490, + GetPlayersInSegmentRateLimitExceeded = 1491, + CloudScriptFunctionNameSizeExceeded = 1492, + PaidInsightsFeaturesNotEnabled = 1493, + CloudScriptAzureFunctionsQueueRequestError = 1494, + EvaluationModeTitleCountExceeded = 1495, + InsightsManagementTitleNotInFlight = 1496, + LimitNotFound = 1497, + LimitNotAvailableViaAPI = 1498, + InsightsManagementSetStorageRetentionBelowMinimum = 1499, + InsightsManagementSetStorageRetentionAboveMaximum = 1500, + AppleNotEnabledForTitle = 1501, + InsightsManagementNewActiveEventExportLimitInvalid = 1502, + InsightsManagementSetPerformanceRateLimited = 1503, + PartyRequestsThrottledFromRateLimiter = 1504, + XboxServiceTooManyRequests = 1505, + NintendoSwitchNotEnabledForTitle = 1506, + RequestMultiplayerServersThrottledFromRateLimiter = 1507, + TitleDataOverrideNotFound = 1508, + DuplicateKeys = 1509, + WasNotCreatedWithCloudRoot = 1510, + LegacyMultiplayerServersDeprecated = 1511, + VirtualCurrencyCurrentlyUnavailable = 1512, + SteamUserNotFound = 1513, + ElasticSearchOperationFailed = 1514, + NotImplemented = 1515, + PublisherNotFound = 1516, + PublisherDeleted = 1517, + ApiDisabledForMigration = 1518, + ResourceNameUpdateNotAllowed = 1519, + ApiNotEnabledForTitle = 1520, + DuplicateTitleNameForPublisher = 1521, + AzureTitleCreationInProgress = 1522, + TitleConstraintsPublisherDeletion = 1524, + InvalidPlayerAccountPoolId = 1525, + PlayerAccountPoolNotFound = 1526, + PlayerAccountPoolDeleted = 1527, + TitleCleanupInProgress = 1528, + AzureResourceConcurrentOperationInProgress = 1529, + TitlePublisherUpdateNotAllowed = 1530, + AzureResourceManagerNotSupportedInStamp = 1531, + ApiNotIncludedInAzurePlayFabFeatureSet = 1532, + GoogleServiceAccountFailedAuth = 1533, + GoogleAPIServiceUnavailable = 1534, + GoogleAPIServiceUnknownError = 1535, + NoValidIdentityForAad = 1536, + PlayerIdentityLinkNotFound = 1537, + PhotonApplicationIdAlreadyInUse = 1538, + CloudScriptUnableToDeleteProductionRevision = 1539, + CustomIdNotFound = 1540, + AutomationInvalidInput = 1541, + AutomationInvalidRuleName = 1542, + AutomationRuleAlreadyExists = 1543, + AutomationRuleLimitExceeded = 1544, + InvalidGooglePlayGamesServerAuthCode = 1545, + PlayStreamConnectionFailed = 1547, + InvalidEventContents = 1548, + InsightsV1Deprecated = 1549, + AnalysisSubscriptionNotFound = 1550, + AnalysisSubscriptionFailed = 1551, + AnalysisSubscriptionFoundAlready = 1552, + AnalysisSubscriptionManagementInvalidInput = 1553, + InvalidGameCenterId = 1554, + InvalidNintendoSwitchAccountId = 1555, + EntityAPIKeysNotSupported = 1556, + IpAddressBanned = 1557, + EntityLineageBanned = 1558, + NamespaceMismatch = 1559, + InvalidServiceConfiguration = 1560, + InvalidNamespaceMismatch = 1561, + MatchmakingEntityInvalid = 2001, + MatchmakingPlayerAttributesInvalid = 2002, + MatchmakingQueueNotFound = 2016, + MatchmakingMatchNotFound = 2017, + MatchmakingTicketNotFound = 2018, + MatchmakingAlreadyJoinedTicket = 2028, + MatchmakingTicketAlreadyCompleted = 2029, + MatchmakingQueueConfigInvalid = 2031, + MatchmakingMemberProfileInvalid = 2032, + NintendoSwitchDeviceIdNotLinked = 2034, + MatchmakingNotEnabled = 2035, + MatchmakingPlayerAttributesTooLarge = 2043, + MatchmakingNumberOfPlayersInTicketTooLarge = 2044, + MatchmakingAttributeInvalid = 2046, + MatchmakingPlayerHasNotJoinedTicket = 2053, + MatchmakingRateLimitExceeded = 2054, + MatchmakingTicketMembershipLimitExceeded = 2055, + MatchmakingUnauthorized = 2056, + MatchmakingQueueLimitExceeded = 2057, + MatchmakingRequestTypeMismatch = 2058, + MatchmakingBadRequest = 2059, + PubSubFeatureNotEnabledForTitle = 2500, + PubSubTooManyRequests = 2501, + PubSubConnectionNotFoundForEntity = 2502, + PubSubConnectionHandleInvalid = 2503, + PubSubSubscriptionLimitExceeded = 2504, + TitleConfigNotFound = 3001, + TitleConfigUpdateConflict = 3002, + TitleConfigSerializationError = 3003, + CatalogApiNotImplemented = 4000, + CatalogEntityInvalid = 4001, + CatalogTitleIdMissing = 4002, + CatalogPlayerIdMissing = 4003, + CatalogClientIdentityInvalid = 4004, + CatalogOneOrMoreFilesInvalid = 4005, + CatalogItemMetadataInvalid = 4006, + CatalogItemIdInvalid = 4007, + CatalogSearchParameterInvalid = 4008, + CatalogFeatureDisabled = 4009, + CatalogConfigInvalid = 4010, + CatalogItemTypeInvalid = 4012, + CatalogBadRequest = 4013, + CatalogTooManyRequests = 4014, + ExportInvalidStatusUpdate = 5000, + ExportInvalidPrefix = 5001, + ExportBlobContainerDoesNotExist = 5002, + ExportNotFound = 5004, + ExportCouldNotUpdate = 5005, + ExportInvalidStorageType = 5006, + ExportAmazonBucketDoesNotExist = 5007, + ExportInvalidBlobStorage = 5008, + ExportKustoException = 5009, + ExportKustoConnectionFailed = 5012, + ExportUnknownError = 5013, + ExportCantEditPendingExport = 5014, + ExportLimitExports = 5015, + ExportLimitEvents = 5016, + ExportInvalidPartitionStatusModification = 5017, + ExportCouldNotCreate = 5018, + ExportNoBackingDatabaseFound = 5019, + ExportCouldNotDelete = 5020, + ExportCannotDetermineEventQuery = 5021, + ExportInvalidQuerySchemaModification = 5022, + ExportQuerySchemaMissingRequiredColumns = 5023, + ExportCannotParseQuery = 5024, + ExportControlCommandsNotAllowed = 5025, + ExportQueryMissingTableReference = 5026, + ExportInsightsV1Deprecated = 5027, + ExplorerBasicInvalidQueryName = 5100, + ExplorerBasicInvalidQueryDescription = 5101, + ExplorerBasicInvalidQueryConditions = 5102, + ExplorerBasicInvalidQueryStartDate = 5103, + ExplorerBasicInvalidQueryEndDate = 5104, + ExplorerBasicInvalidQueryGroupBy = 5105, + ExplorerBasicInvalidQueryAggregateType = 5106, + ExplorerBasicInvalidQueryAggregateProperty = 5107, + ExplorerBasicLoadQueriesError = 5108, + ExplorerBasicLoadQueryError = 5109, + ExplorerBasicCreateQueryError = 5110, + ExplorerBasicDeleteQueryError = 5111, + ExplorerBasicUpdateQueryError = 5112, + ExplorerBasicSavedQueriesLimit = 5113, + ExplorerBasicSavedQueryNotFound = 5114, + TenantShardMapperShardNotFound = 5500, + TitleNotEnabledForParty = 6000, + PartyVersionNotFound = 6001, + MultiplayerServerBuildReferencedByMatchmakingQueue = 6002, + MultiplayerServerBuildReferencedByBuildAlias = 6003, + MultiplayerServerBuildAliasReferencedByMatchmakingQueue = 6004, + PartySerializationError = 6005, + ExperimentationExperimentStopped = 7000, + ExperimentationExperimentRunning = 7001, + ExperimentationExperimentNotFound = 7002, + ExperimentationExperimentNeverStarted = 7003, + ExperimentationExperimentDeleted = 7004, + ExperimentationClientTimeout = 7005, + ExperimentationInvalidVariantConfiguration = 7006, + ExperimentationInvalidVariableConfiguration = 7007, + ExperimentInvalidId = 7008, + ExperimentationNoScorecard = 7009, + ExperimentationTreatmentAssignmentFailed = 7010, + ExperimentationTreatmentAssignmentDisabled = 7011, + ExperimentationInvalidDuration = 7012, + ExperimentationMaxExperimentsReached = 7013, + ExperimentationExperimentSchedulingInProgress = 7014, + ExperimentationInvalidEndDate = 7015, + ExperimentationInvalidStartDate = 7016, + ExperimentationMaxDurationExceeded = 7017, + ExperimentationExclusionGroupNotFound = 7018, + ExperimentationExclusionGroupInsufficientCapacity = 7019, + ExperimentationExclusionGroupCannotDelete = 7020, + ExperimentationExclusionGroupInvalidTrafficAllocation = 7021, + ExperimentationExclusionGroupInvalidName = 7022, + MaxActionDepthExceeded = 8000, + TitleNotOnUpdatedPricingPlan = 9000, + SegmentManagementTitleNotInFlight = 10000, + SegmentManagementNoExpressionTree = 10001, + SegmentManagementTriggerActionCountOverLimit = 10002, + SegmentManagementSegmentCountOverLimit = 10003, + SegmentManagementInvalidSegmentId = 10004, + SegmentManagementInvalidInput = 10005, + SegmentManagementInvalidSegmentName = 10006, + DeleteSegmentRateLimitExceeded = 10007, + CreateSegmentRateLimitExceeded = 10008, + UpdateSegmentRateLimitExceeded = 10009, + GetSegmentsRateLimitExceeded = 10010, + AsyncExportNotInFlight = 10011, + AsyncExportNotFound = 10012, + AsyncExportRateLimitExceeded = 10013, + AnalyticsSegmentCountOverLimit = 10014, + SnapshotNotFound = 11000, + InventoryApiNotImplemented = 12000, + LobbyDoesNotExist = 13000, + LobbyRateLimitExceeded = 13001, + LobbyPlayerAlreadyJoined = 13002, + LobbyNotJoinable = 13003, + LobbyMemberCannotRejoin = 13004, + LobbyCurrentPlayersMoreThanMaxPlayers = 13005, + LobbyPlayerNotPresent = 13006, + LobbyBadRequest = 13007, + LobbyPlayerMaxLobbyLimitExceeded = 13008, + LobbyNewOwnerMustBeConnected = 13009, + LobbyCurrentOwnerStillConnected = 13010, + LobbyMemberIsNotOwner = 13011, + EventSamplingInvalidRatio = 14000, + EventSamplingInvalidEventNamespace = 14001, + EventSamplingInvalidEventName = 14002, + EventSamplingRatioNotFound = 14003, + TelemetryKeyNotFound = 14200, + TelemetryKeyInvalidName = 14201, + TelemetryKeyAlreadyExists = 14202, + TelemetryKeyInvalid = 14203, + TelemetryKeyCountOverLimit = 14204, + TelemetryKeyDeactivated = 14205, + TelemetryKeyLongInsightsRetentionNotAllowed = 14206, + EventSinkConnectionInvalid = 15000, + EventSinkConnectionUnauthorized = 15001, + EventSinkRegionInvalid = 15002, + EventSinkLimitExceeded = 15003, + EventSinkSasTokenInvalid = 15004, + EventSinkNotFound = 15005, + EventSinkNameInvalid = 15006, + EventSinkSasTokenPermissionInvalid = 15007, + EventSinkSecretInvalid = 15008, + EventSinkTenantNotFound = 15009, + EventSinkAadNotFound = 15010, + EventSinkDatabaseNotFound = 15011, + OperationCanceled = 16000, + InvalidDisplayNameRandomSuffixLength = 17000, + AllowNonUniquePlayerDisplayNamesDisableNotAllowed = 17001, + PartitionedEventInvalid = 18000, + PartitionedEventCountOverLimit = 18001, + PlayerCustomPropertiesPropertyNameTooLong = 19000, + PlayerCustomPropertiesPropertyNameIsInvalid = 19001, + PlayerCustomPropertiesStringPropertyValueTooLong = 19002, + PlayerCustomPropertiesValueIsInvalidType = 19003, + PlayerCustomPropertiesVersionMismatch = 19004, + PlayerCustomPropertiesPropertyCountTooHigh = 19005, + PlayerCustomPropertiesDuplicatePropertyName = 19006, + PlayerCustomPropertiesPropertyDoesNotExist = 19007, + AddonAlreadyExists = 19008, + AddonDoesntExist = 19009, +}; + +HRESULT ServiceErrorToHR(ServiceErrorCode errorCode); + +HRESULT HttpStatusToHR(uint32_t httpStatus); + +HRESULT CurrentExceptionToHR(); + +} diff --git a/Source/PlayFabSharedInternal/Include/HttpRequest.h b/Source/PlayFabSharedInternal/Include/HttpRequest.h new file mode 100644 index 0000000..9c796e3 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/HttpRequest.h @@ -0,0 +1,117 @@ +#pragma once + +#include +#include +#include "XAsyncOperation.h" +#include "RunContext.h" + +namespace PlayFab +{ + +// PlayFab authorization header names +constexpr char kSessionTicketHeaderName[]{ "X-Authorization" }; +constexpr char kSecretKeyHeaderName[]{ "X-SecretKey" }; +constexpr char kEntityTokenHeaderName[]{ "X-EntityToken" }; +constexpr char kTelemetryKeyHeaderName[]{ "X-TelemetryKey" }; + +// PlayFab SDK version string header +constexpr char kSDKVersionStringHeaderName[]{ "X-PlayFabSDK" }; +constexpr char kSDKUserAgentHeader[]{ "User-Agent" }; + +// Http POST method static string +constexpr char kPostMethod[]{ "POST" }; + +// Default Http retry settings +const bool kDefaultHttpRetryAllowed{ true }; +const uint32_t kDefaultHttpRetryDelay{ 2 }; +const uint32_t kDefaultHttpTimeoutWindow{ 20 }; + +// Wrapper around PlayFab service response. +// See https://docs.microsoft.com/en-us/rest/api/playfab/client/authentication/loginwithcustomid?view=playfab-rest#apierrorwrapper for +// more information. +struct ServiceResponse +{ + ServiceResponse() = default; + ServiceResponse(const ServiceResponse&); + ServiceResponse(ServiceResponse&&) = default; + ServiceResponse& operator=(const ServiceResponse&); + ServiceResponse& operator=(ServiceResponse&&) = default; + ~ServiceResponse() = default; + + HRESULT FromJson(const JsonValue& input); + + // Fields from response body + int HttpCode; + String HttpStatus; + ServiceErrorCode ErrorCode; + String ErrorName; + String ErrorMessage; + JsonValue ErrorDetails; + JsonValue Data; + + // From response header + String RequestId; +}; + +// Wrapper around PFHCHttpCallPerformAsync XAsync operation making a PlayFab service call +class HCHttpCall : public XAsyncOperation +{ +public: + HCHttpCall( + String method, + String url, + UnorderedMap headers, + String requestBody, + PlayFab::RunContext runContext + ) noexcept; + + HCHttpCall( + String method, + String url, + UnorderedMap headers, + String requestBody, + uint32_t retryCacheId, + PFHttpRetrySettings const& retrySettings, + PlayFab::RunContext runContext + ) noexcept; + + HCHttpCall(HCHttpCall const&) = delete; + HCHttpCall& operator=(HCHttpCall) = delete; + ~HCHttpCall() noexcept; + + void SetHeader(String headerName, String headerValue) noexcept; + +private: + // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + static HRESULT CALLBACK HCRequestBodyRead( + _In_ PFHCCallHandle callHandle, + _In_ size_t offset, + _In_ size_t bytesAvailable, + _In_opt_ void* context, + _Out_writes_bytes_to_(bytesAvailable, *bytesWritten) uint8_t* destination, + _Out_ size_t* bytesWritten + ); + + static HRESULT CALLBACK HCResponseBodyWrite( + _In_ PFHCCallHandle callHandle, + _In_reads_bytes_(bytesAvailable) const uint8_t* source, + _In_ size_t bytesAvailable, + _In_opt_ void* context + ); + + String const m_method; + String const m_url; + UnorderedMap m_headers; + String const m_requestBody; + Vector m_responseBody; + std::optional m_retryCacheId; + bool m_retryAllowed{ kDefaultHttpRetryAllowed }; + uint32_t m_retryDelay{ kDefaultHttpRetryDelay }; + uint32_t m_timeoutWindow{ kDefaultHttpTimeoutWindow }; + PFHCCallHandle m_callHandle{ nullptr }; +}; + +} diff --git a/Source/PlayFabSharedInternal/Include/JsonUtils.h b/Source/PlayFabSharedInternal/Include/JsonUtils.h new file mode 100644 index 0000000..9b1a3de --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/JsonUtils.h @@ -0,0 +1,487 @@ +#pragma once + +#include +#include +#include "RapidJson.h" +#include "EnumTraits.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace JsonUtils +{ + +// Default stack size of rapidjson StackAllocator. Using the same default capacity as rapidjson::CrtAllocator +static size_t kDefaultStackCapacity = 1024; + +// Allocator to be used by rapidjson for all needed allocations +extern JsonAllocator allocator; + +// Write JsonValue to String +String WriteToString(const JsonValue& jsonValue); + +//------------------------------------------------------------------------------ +// Helpers for serializing to JsonValue +//------------------------------------------------------------------------------ + +JsonValue ToJson(const char* string); + +JsonValue ToJson(const String& string); + +JsonValue ToJson(const PFJsonObject& jsonObject); + +JsonValue ToJsonTime(time_t value); + +// Specializations for InputModels +template , bool> = true> +JsonValue ToJson(const typename InternalModelWrapperT::ModelType& value); + +JsonValue ToJson(const InputModel& value); + +// Specialization for fundamental types +template , bool> = true> +JsonValue ToJson(FundamentalT value); + +// Specialization for enum types +template , bool> = true> +JsonValue ToJson(EnumT value); + +//------------------------------------------------------------------------------ +// Helpers for deserializing from JsonValue +//------------------------------------------------------------------------------ +HRESULT FromJson(const JsonValue& input, String& output); + +HRESULT FromJson(const JsonValue& input, bool& output); + +HRESULT FromJson(const JsonValue& input, int16_t& output); + +HRESULT FromJson(const JsonValue& input, uint16_t& output); + +HRESULT FromJson(const JsonValue& input, int32_t& output); + +HRESULT FromJson(const JsonValue& input, uint32_t& output); + +HRESULT FromJson(const JsonValue& input, int64_t& output); + +HRESULT FromJson(const JsonValue& input, uint64_t& output); + +HRESULT FromJson(const JsonValue& input, float& output); + +HRESULT FromJson(const JsonValue& input, double& output); + +// Special case needed for time_t since it is an Iso8601 formatted JsonString that gets converted to a time_t +HRESULT FromJsonTime(const JsonValue& input, time_t& output); + +HRESULT FromJson(const JsonValue& input, JsonObject& output); + +template, bool> = true> +HRESULT FromJson(const JsonValue& input, InternalModelWrapperT& output); + +template , bool> = true> +HRESULT FromJson(const JsonValue& jsonValue, EnumT& output); + +// Deep copies input to output +HRESULT FromJson(const JsonValue& input, JsonValue& output); + +//------------------------------------------------------------------------------ +// Helpers for adding members JsonObjects. 'value' param will be converted to a JsonValue added as a member to 'jsonObject'. +// A global JsonAllocator will be used for any rapidjson allocations that are needed. +//------------------------------------------------------------------------------ + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue&& name, JsonValue&& value); + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, JsonValue&& value); + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const JsonValue& value); + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const String& value); + +template || std::is_same_v, bool> = true> +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const T& value); + +template +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const std::optional& value); + +template && !std::is_same_v, bool> = true> +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const PtrT value); + +template , bool> = true> +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const typename InternalModelWrapperT::ModelType* value); + +template +HRESULT ObjectAddMemberArray(JsonValue& jsonObject, JsonValue::StringRefType name, const Vector& array); + +template +HRESULT ObjectAddMemberArray(JsonValue& jsonObject, JsonValue::StringRefType name, const T* array, uint32_t arrayCount); + +template +HRESULT ObjectAddMemberArray(JsonValue& jsonObject, JsonValue::StringRefType name, const typename InternalModelWrapperT::ModelType* const* array, uint32_t arrayCount); + +template +HRESULT ObjectAddMemberDictionary(JsonValue& jsonObject, JsonValue::StringRefType name, const Map& map); + +template ::value, bool> = true> +HRESULT ObjectAddMemberDictionary(JsonValue& jsonObject, JsonValue::StringRefType name, const EntryT* associativeArray, uint32_t arrayCount); + +template , bool> = true> +HRESULT ObjectAddMemberDictionary(JsonValue& jsonObject, JsonValue::StringRefType name, const typename InternalModelWrapperT::DictionaryEntryType* associativeArray, uint32_t arrayCount); + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, time_t value); + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const std::optional& value); + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const time_t* value); + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const time_t* array, uint32_t arrayCount); + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const PFDateTimeDictionaryEntry* associativeArray, uint32_t arrayCount); + +//------------------------------------------------------------------------------ +// Helpers for getting fields from JsonObjects as Cpp types. +// Unless the output field is optional, rapidjson will assert if the JsonObject is missing the requested +// field or if the requested fields are not the expected Json type. +// +// Some of the methods also have output parameters where a pointer to the retreived value & (in the case of collections) the count is returned. +//------------------------------------------------------------------------------ + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, T& output); + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, std::optional& output); + +// Because they are already nullable, JsonObjects, Strings, and collection types will not be wrapped in StdExtra::optional even if the properties are optional. +// The default templated ObjectGetMember assumes the property is required, these specializations will not. +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, JsonValue& output); + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, JsonObject& output); + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, String& output); + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, Vector& output); + +template , bool> = true> +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, ModelVector& output); + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, CStringVector& output); + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, DictionaryEntryVector& output); + +template, bool> = true> +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, ModelDictionaryEntryVector& output); + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, StringDictionaryEntryVector& output); + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, time_t& output); + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, std::optional& output); + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, Vector& output); + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, DictionaryEntryVector& output); + +namespace Detail +{ +// Helper method for ObjectGetMember methods. Basically JsonValue::FindMember with type validation +Result ObjectFindMember(const JsonValue& jsonObject, const char* name); +} + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +template , bool>> +JsonValue ToJson(const typename InternalModelWrapperT::ModelType& value) +{ + return InternalModelWrapperT::ToJson(value); +} + +template , bool>> +JsonValue ToJson(FundamentalT value) +{ + return JsonValue{ value }; +} + +template , bool>> +inline JsonValue ToJson(EnumT value) +{ + return JsonValue{ EnumName(value), allocator }; +} + +template, bool>> +HRESULT FromJson(const JsonValue& input, InternalModelWrapperT& output) +{ + return output.FromJson(input); +} + +template , bool>> +HRESULT FromJson(const JsonValue& jsonValue, EnumT& output) +{ + if (!jsonValue.IsString()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = EnumValue(jsonValue.GetString()); + return S_OK; +} + +template || std::is_same_v, bool>> +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const T& value) +{ + return ObjectAddMember(jsonObject, JsonValue{ name }, ToJson(value)); +} + +template +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue&& name, const T& value) +{ + return ObjectAddMember(jsonObject, std::move(name), ToJson(value)); +} + +template +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const std::optional& value) +{ + if (value.has_value()) + { + return ObjectAddMember(jsonObject, name, *value); + } + else + { + return ObjectAddMember(jsonObject, name, JsonValue{ rapidjson::kNullType }); + } +} + +template && !std::is_same_v, bool>> +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const PtrT value) +{ + if (value) + { + return ObjectAddMember(jsonObject, name, *value); + } + else + { + return ObjectAddMember(jsonObject, name, JsonValue{ rapidjson::kNullType }); + } +} + +template , bool>> +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const typename InternalModelWrapperT::ModelType* value) +{ + if (value) + { + return ObjectAddMember(jsonObject, name, ToJson(*value)); + } + else + { + return ObjectAddMember(jsonObject, name, JsonValue{ rapidjson::kNullType }); + } +} + +template +HRESULT ObjectAddMemberArray(JsonValue& jsonObject, JsonValue::StringRefType name, const Vector& array) +{ + JsonValue member{ rapidjson::kArrayType }; + for (auto& item : array) + { + member.PushBack(ToJson(item), allocator); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +template +HRESULT ObjectAddMemberArray(JsonValue& jsonObject, JsonValue::StringRefType name, const T* array, uint32_t arrayCount) +{ + JsonValue member{ rapidjson::kArrayType }; + for (auto i = 0u; i < arrayCount; ++i) + { + member.PushBack(ToJson(array[i]), allocator); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +template +HRESULT ObjectAddMemberArray(JsonValue& jsonObject, JsonValue::StringRefType name, const typename InternalModelWrapperT::ModelType* const* array, uint32_t arrayCount) +{ + JsonValue member{ rapidjson::kArrayType }; + for (auto i = 0u; i < arrayCount; ++i) + { + member.PushBack(ToJson(*array[i]), allocator); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +template +HRESULT ObjectAddMemberDictionary(JsonValue& jsonObject, JsonValue::StringRefType name, const Map& map) +{ + JsonValue member{ rapidjson::kObjectType }; + for (auto& pair : map) + { + RETURN_IF_FAILED(ObjectAddMember(member, ToJson(pair.first), ToJson(pair.second))); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +template ::value, bool>> +HRESULT ObjectAddMemberDictionary(JsonValue& jsonObject, JsonValue::StringRefType name, const EntryT* associativeArray, uint32_t arrayCount) +{ + JsonValue member{ rapidjson::kObjectType }; + for (auto i = 0u; i < arrayCount; ++i) + { + auto& entry{ associativeArray[i] }; + RETURN_IF_FAILED(ObjectAddMember(member, ToJson(entry.key), ToJson(entry.value))); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +template , bool>> +HRESULT ObjectAddMemberDictionary(JsonValue& jsonObject, JsonValue::StringRefType name, const typename InternalModelWrapperT::DictionaryEntryType* associativeArray, uint32_t arrayCount) +{ + JsonValue member{ rapidjson::kObjectType }; + for (auto i = 0u; i < arrayCount; ++i) + { + auto& entry{ associativeArray[i] }; + RETURN_IF_FAILED(ObjectAddMember(member, ToJson(entry.key), ToJson(*entry.value))); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, T& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + if (findResult.Payload() == jsonObject.MemberEnd()) + { + TRACE_ERROR("Json Parse Error: object missing non-optional member \"%s\"", name); + return E_FAIL; + } + return FromJson(findResult.Payload()->value, output); +} + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, std::optional& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.reset(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + output.emplace(); + RETURN_IF_FAILED(FromJson(findResult.Payload()->value, *output)); + } + return S_OK; +} + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, Vector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsArray()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto jsonArray{ findResult.Payload()->value.GetArray() }; + output.reserve(jsonArray.Size()); + for (auto& value : jsonArray) + { + output.emplace_back(); + RETURN_IF_FAILED(FromJson(value, output.back())); + } + } + return S_OK; +} + +template , bool>> +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, ModelVector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsArray()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto jsonArray{ findResult.Payload()->value.GetArray() }; + output.reserve(jsonArray.Size()); + for (auto& value : jsonArray) + { + if (!value.IsObject()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + InternalModelWrapperT model{}; + RETURN_IF_FAILED(model.FromJson(value)); + output.push_back(std::move(model)); + } + } + return S_OK; +} + +template +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, DictionaryEntryVector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsObject()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto memberObject{ findResult.Payload()->value.GetObj() }; + output.reserve(memberObject.MemberCount()); + for (auto& pair : memberObject) + { + decltype(EntryT::value) value{}; + RETURN_IF_FAILED(FromJson(pair.value, value)); + output.insert_or_assign(pair.name.GetString(), value); + } + } + return S_OK; +} + +template, bool>> +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, ModelDictionaryEntryVector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsObject()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto memberObject{ findResult.Payload()->value.GetObj() }; + output.reserve(memberObject.MemberCount()); + for (auto& pair : memberObject) + { + InternalModelWrapperT model{}; + RETURN_IF_FAILED(model.FromJson(pair.value)); + output.insert_or_assign(pair.name.GetString(), std::move(model)); + } + } + return S_OK; +} + +} // namespace JsonUtils +} // namespace PlayFab diff --git a/Source/PlayFabSharedInternal/Include/Memory.h b/Source/PlayFabSharedInternal/Include/Memory.h new file mode 100644 index 0000000..c4be95f --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/Memory.h @@ -0,0 +1,162 @@ +#pragma once + +#include +#include +#include + +namespace PlayFab +{ + +//------------------------------------------------------------------------------ +// Memory Hook configuration +//------------------------------------------------------------------------------ +PFMemoryHooks& GetMemoryHooks(); +HRESULT SetMemoryHooks(PFMemoryHooks& hooks); + +//------------------------------------------------------------------------------ +// Raw allocation and free methods +//------------------------------------------------------------------------------ +void* Alloc(size_t size); +void Free(void* pointer) noexcept; + +//------------------------------------------------------------------------------ +// Allocator +//------------------------------------------------------------------------------ +template +struct Allocator +{ + using value_type = T; + using is_always_equal = std::true_type; + + Allocator() = default; + template + Allocator(Allocator const&) {} + + T* allocate(size_t n); + void deallocate(_In_opt_ void* p, size_t) noexcept; +}; + +template +bool operator==(Allocator const&, Allocator const&); +template +bool operator!=(Allocator const&, Allocator const&); + +//------------------------------------------------------------------------------ +// Deleter +//------------------------------------------------------------------------------ +template +struct Deleter +{ + constexpr Deleter() noexcept = default; + + template, int> = 0> + Deleter(const Deleter&) noexcept; + + void operator()(T* ptr) const noexcept; +}; + +//------------------------------------------------------------------------------ +// rapidjson Allocator +//------------------------------------------------------------------------------ +struct JsonAllocator +{ +public: + static const bool kNeedFree = true; + + void* Malloc(size_t size); + void* Realloc(void* originalPtr, size_t originalSize, size_t newSize); + static void Free(void* ptr); +}; + +//------------------------------------------------------------------------------ +// Smart Pointers +//------------------------------------------------------------------------------ +template +using SharedPtr = std::shared_ptr; + +template +using WeakPtr = std::weak_ptr; + +template> +using UniquePtr = std::unique_ptr; + +//------------------------------------------------------------------------------ +// Factories +//------------------------------------------------------------------------------ +template +SharedPtr MakeShared(TArgs&&... args); + +template +UniquePtr MakeUnique(TArgs&&... args); + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ +template +T* Allocator::allocate(size_t n) +{ + if (n > (static_cast(-1) / sizeof(T))) + { + throw std::bad_alloc{}; + } + + auto rawPtr = Alloc(n * sizeof(T)); // Bug 15586224: how to ensure alignment? + return static_cast(rawPtr); +} + +template +void Allocator::deallocate(_In_opt_ void* p, size_t) noexcept +{ + Free(p); +} + +template +bool operator==(Allocator const&, Allocator const&) +{ + return true; +} + +template +bool operator!=(Allocator const&, Allocator const&) +{ + return false; +} + +template template, int>> +Deleter::Deleter(const Deleter&) noexcept +{ +} + +template +void Deleter::operator()(T* ptr) const noexcept +{ + ptr->~T(); // destroy + Allocator alloc{}; + alloc.deallocate((void*)ptr, 1); +} + +template +SharedPtr MakeShared(TArgs&&... args) +{ + return std::allocate_shared(Allocator{}, std::forward(args)...); +} + +template +UniquePtr MakeUnique(TArgs&&... args) +{ + // allocate + Allocator alloc{}; + auto mem = alloc.allocate(1); + + // construct (failure here only requires deallocation) + auto obj = new (mem) T(std::forward(args)...); + + // destruction is required from here on + // pass ownership to correctly typed smart pointer + UniquePtr ptr{ obj }; + + // success! + return ptr; +} + +} diff --git a/Source/PlayFabSharedInternal/Include/ModelBuffer.h b/Source/PlayFabSharedInternal/Include/ModelBuffer.h new file mode 100644 index 0000000..f454dcf --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/ModelBuffer.h @@ -0,0 +1,221 @@ +#pragma once + +#include + +namespace PlayFab +{ + +class ModelBuffer +{ +public: + ModelBuffer(void* buffer, size_t bufferSize); + ModelBuffer(const ModelBuffer&) = delete; + ModelBuffer(ModelBuffer&&) = default; + ~ModelBuffer() = default; + + size_t RemainingSpace() const; + + template + Result Alloc(size_t n); + + template || std::is_enum_v, bool> = true> + Result CopyTo(const T* input); + + template + Result CopyTo(typename T::ModelType const* input); + + Result CopyTo(const char* input); + + template || std::is_enum_v, bool> = true> + Result CopyToArray(const T* input, size_t inputCount); + + template + Result CopyToArray(typename T::ModelType const* const* input, size_t inputCount); + + Result CopyToArray(const char* const* input, size_t inputCount); + + template::value && (std::is_fundamental_v || std::is_enum_v), bool> = true> + Result CopyToDictionary(const T* input, size_t inputCount); + + template + Result CopyToDictionary(const typename InternalModelWrapperT::DictionaryEntryType* input, size_t inputCount); + + Result CopyToDictionary(PFStringDictionaryEntry const* input, size_t inputCount); + +private: +#if _DEBUG + char* const m_buffer; + size_t const m_bufferSize; +#endif + void* m_bufferPtr; + size_t m_remaining; +}; + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +template +Result ModelBuffer::Alloc(size_t n) +{ + size_t const size = sizeof(T) * n; +#if _M_IX86 + // Ignore alignment requirements on x86 builds because of a Visual Studio bug where stack variables don't always honor alignment. + // This issue has been reported here https://developercommunity.visualstudio.com/t/visual-c-alignof-is-not-conformant-on-x86/1258506 + // but has not yet been fixed. + if (m_remaining >= size) +#else + if (std::align(alignof(T), size, m_bufferPtr, m_remaining)) +#endif + { + T* result = reinterpret_cast(m_bufferPtr); + m_bufferPtr = static_cast(m_bufferPtr) + size; + m_remaining -= size; + return result; + } + return E_NOT_SUFFICIENT_BUFFER; +} + +template || std::is_enum_v, bool>> +Result ModelBuffer::CopyTo(const T* input) +{ + if (input) + { + // Alloc + auto allocResult = Alloc(1); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + *outputPtr = *input; + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +template +Result ModelBuffer::CopyTo(const typename T::ModelType* input) +{ + if (input) + { + // Alloc + auto allocResult = Alloc(1); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + RETURN_IF_FAILED(T::Copy(*input, *outputPtr, *this)); + + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +template || std::is_enum_v,bool>> +Result ModelBuffer::CopyToArray(const T* input, size_t inputCount) +{ + if (input && inputCount) + { + // Alloc + auto allocResult = Alloc(inputCount); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + std::memcpy(outputPtr, input, sizeof(T) * inputCount); + + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +template +Result ModelBuffer::CopyToArray(typename T::ModelType const* const* input, size_t inputCount) +{ + if (input && inputCount) + { + // Alloc + auto allocResult = Alloc(inputCount); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + for (size_t i = 0; i < inputCount; ++i) + { + auto copyResult = this->CopyTo(input[i]); + RETURN_IF_FAILED(copyResult.hr); + outputPtr[i] = copyResult.ExtractPayload(); + } + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +template::value && (std::is_fundamental_v || std::is_enum_v), bool>> +Result ModelBuffer::CopyToDictionary(const T* input, size_t inputCount) +{ + if (input && inputCount) + { + // Alloc + auto allocResult = Alloc(inputCount); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + for (size_t i = 0; i < inputCount; ++i) + { + auto copyKeyResult = this->CopyTo(input[i].key); + RETURN_IF_FAILED(copyKeyResult.hr); + outputPtr[i].key = copyKeyResult.ExtractPayload(); + outputPtr[i].value = input[i].value; + } + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +template +Result ModelBuffer::CopyToDictionary(const typename InternalModelWrapperT::DictionaryEntryType* input, size_t inputCount) +{ + if (input && inputCount) + { + // Alloc + auto allocResult = Alloc(inputCount); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + for (size_t i = 0; i < inputCount; ++i) + { + auto copyKeyResult = this->CopyTo(input[i].key); + RETURN_IF_FAILED(copyKeyResult.hr); + outputPtr[i].key = copyKeyResult.ExtractPayload(); + + auto copyValueResult = this->CopyTo(input[i].value); + RETURN_IF_FAILED(copyValueResult.hr); + outputPtr[i].value = copyValueResult.ExtractPayload(); + } + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +} diff --git a/Source/PlayFabSharedInternal/Include/PlatformUser.h b/Source/PlayFabSharedInternal/Include/PlatformUser.h new file mode 100644 index 0000000..a9521af --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/PlatformUser.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace PlayFab +{ +namespace Platform +{ +// Opaque forward declaration of a Platform User. This is currently used in the PlayFabServicesTestApp to cache a generic reference +// to a platform user to be used by Platform specific tests. A definition of this class doesn't necessarily need to exist for every +// Platform. +// +// It may make sense to define a common interface for this, but keep it completely opaque for now. +class User; + +using UserPtr = SharedPtr; + +} +} diff --git a/Source/PlayFabSharedInternal/Include/PlatformUtils.h b/Source/PlayFabSharedInternal/Include/PlatformUtils.h new file mode 100644 index 0000000..553aa1f --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/PlatformUtils.h @@ -0,0 +1,136 @@ +#pragma once + +#include +#include +#include +#include +#include "Types.h" + +namespace PlayFab +{ + +// The primary purpose of these format strings is to communicate to and from the PlayFab server with consistent accuracy across platforms supported by this SDK +constexpr char TIMESTAMP_READ_FORMAT[] = "%Y-%m-%dT%T"; +constexpr char TIMESTAMP_WRITE_FORMAT[] = "%Y-%m-%dT%H:%M:%S.000Z"; +constexpr int TIMESTAMP_BUFFER_SIZE = 64; // Arbitrary number sufficiently large enough to contain the timestamp strings sent by PlayFab server + +// Time type conversions +inline time_t TimePointToTimeT(const TimePoint& input) +{ + return SystemClock::to_time_t(input); +} + +inline TimePoint TimeTToTimePoint(time_t input) +{ + return SystemClock::from_time_t(input); +} + +inline tm TimeTToUtcTm(time_t input) +{ + tm timeInfo{ 0 }; + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + gmtime_s(&input, &timeInfo); +#elif _WIN32 + gmtime_s(&timeInfo, &input); +#else + gmtime_r(&input, &timeInfo); +#endif + return timeInfo; +} + +inline time_t UtcTmToTimeT(tm input) +{ +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + return mktime(&input); +#elif _WIN32 + return _mkgmtime(&input); +#else + return timegm(&input); +#endif +} + +inline tm TimePointToUtcTm(const TimePoint& input) +{ + return TimeTToUtcTm(SystemClock::to_time_t(input)); +} + +inline TimePoint UtcTmToTimePoint(const tm& input) +{ + return TimeTToTimePoint(UtcTmToTimeT(input)); +} + +// Get Time now - Platform dependent granularity (granularity: upto 1 second, accuracy within a few seconds) +inline TimePoint GetTimePointNow() +{ + // The conversion is mostly to ensure consistent behavior among all platforms + return std::chrono::time_point_cast(SystemClock::now()); +} + +inline time_t GetTimeTNow() +{ + return TimePointToTimeT(GetTimePointNow()); +} + +// Get a tick count that represents now in milliseconds (not useful for absolute time) +inline int64_t GetMilliTicks() +{ + auto msClock = std::chrono::time_point_cast(Clock::now()); + return msClock.time_since_epoch().count(); +} + +// Time Serialization +inline String UtcTmToIso8601String(const tm& input) +{ + char buff[TIMESTAMP_BUFFER_SIZE]; + strftime(buff, TIMESTAMP_BUFFER_SIZE, TIMESTAMP_WRITE_FORMAT, &input); + return buff; +} + +inline tm Iso8601StringToTm(const String& utcString) +{ + tm timeInfo{ 0 }; + Stringstream ss(utcString); + ss >> std::get_time(&timeInfo, TIMESTAMP_READ_FORMAT); + return timeInfo; +} + +inline String TimeTToIso8601String(time_t input) +{ + return UtcTmToIso8601String(TimeTToUtcTm(input)); +} + +inline time_t Iso8601StringToTimeT(const String& input) +{ + return UtcTmToTimeT(Iso8601StringToTm(input)); +} + +inline String TimePointToIso8601String(const TimePoint& input) +{ + return UtcTmToIso8601String(TimePointToUtcTm(input)); +} + +inline TimePoint Iso8601StringToTimePoint(const String& input) +{ + return UtcTmToTimePoint(Iso8601StringToTm(input)); +} + +inline void StrCpy(char* destination, size_t destinationSize, char const* source) +{ +#if _WIN32 + strcpy_s(destination, destinationSize, source); +#else + std::strncpy(destination, source, destinationSize); +#endif +} + +inline char* StrTok(char* str, char const* delimiters, char** context) +{ +#if _WIN32 + return strtok_s(str, delimiters, context); +#else + return strtok_r(str, delimiters, context); +#endif +} + +} diff --git a/Source/PlayFabSharedInternal/Include/RapidJson.h b/Source/PlayFabSharedInternal/Include/RapidJson.h new file mode 100644 index 0000000..c70c1c7 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/RapidJson.h @@ -0,0 +1,19 @@ +#pragma once + +#include "Memory.h" // Required as rapidjson will depend on our Allocators + +#define RAPIDJSON_NAMESPACE PlayFab::rapidjson +#define RAPIDJSON_NAMESPACE_BEGIN namespace PlayFab { namespace rapidjson { +#define RAPIDJSON_NAMESPACE_END } } + +#define RAPIDJSON_DEFAULT_ALLOCATOR PlayFab::JsonAllocator +#define RAPIDJSON_DEFAULT_STACK_ALLOCATOR PlayFab::JsonAllocator + +#define RAPIDJSON_NO_INT64DEFINE + +#include +#include +#include +#include +#include +#include \ No newline at end of file diff --git a/Source/PlayFabSharedInternal/Include/Result.h b/Source/PlayFabSharedInternal/Include/Result.h new file mode 100644 index 0000000..187490c --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/Result.h @@ -0,0 +1,146 @@ +#pragma once + +#include "Types.h" +#include + +namespace PlayFab +{ + +// Generic result class. Holds HRESULT, optional error message, and result payload +template +class Result +{ +public: + // Construct successful result + Result(T&& payload); + + // Failed result (no payload) + Result(HRESULT hr); + Result(HRESULT hr, String&& errorMessage); + Result(HRESULT hr, const String& errorMessage); + + Result(const Result&) = default; + Result(Result&&) = default; + Result& operator=(const Result&) = delete; + Result& operator=(Result&&) = delete; + ~Result() = default; + + HRESULT const hr; + String const errorMessage; + + // Get result payload. Asserts if there is no payload + const T& Payload() const; + T&& ExtractPayload(); + +private: + std::optional m_payload{}; +}; + +// Result specialization without a payload +template<> +class Result +{ +public: + // Construct successful result + Result(); + + // Failed result (no payload) + Result(HRESULT hr); + Result(HRESULT hr, String&& errorMessage); + Result(HRESULT hr, const String& errorMessage); + + Result(const Result&) = default; + Result(Result&&) = default; + Result& operator=(const Result&) = delete; + Result& operator=(Result&&) = delete; + ~Result() = default; + + HRESULT const hr; + String const errorMessage; +}; + +template +bool Succeeded(const Result& result) +{ + return SUCCEEDED(result.hr); +} + +template +bool Failed(const Result& result) +{ + return FAILED(result.hr); +} + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +template +Result::Result(T&& payload) : + hr{ S_OK }, + m_payload{ std::move(payload) } +{ +} + +template +Result::Result(HRESULT hr_) : + hr{ hr_ } +{ + assert(FAILED(hr)); +} + +template +Result::Result(HRESULT hr_, String&& errorMessage_) : + hr{ hr_ }, + errorMessage{ std::move(errorMessage_) } +{ + assert(FAILED(hr)); +} + +template +Result::Result(HRESULT hr_, const String& errorMessage_) : + hr{ hr_ }, + errorMessage{ errorMessage_ } +{ + assert(FAILED(hr)); +} + +template +const T& Result::Payload() const +{ + assert(m_payload.has_value()); + return *m_payload; +} + +template +T&& Result::ExtractPayload() +{ + assert(m_payload.has_value()); + return std::move(*m_payload); +} + +inline Result::Result() : + hr{ S_OK } +{ +} + +inline Result::Result(HRESULT hr_) : + hr{ hr_ } +{ +} + +inline Result::Result(HRESULT hr_, String&& errorMessage_) : + hr{ hr_ }, + errorMessage{ std::move(errorMessage_) } +{ + assert(FAILED(hr)); +} + +inline Result::Result(HRESULT hr_, const String& errorMessage_) : + hr{ hr_ }, + errorMessage{ errorMessage_ } +{ + assert(FAILED(hr)); +} + +} diff --git a/Source/PlayFabSharedInternal/Include/ResultMacros.h b/Source/PlayFabSharedInternal/Include/ResultMacros.h new file mode 100644 index 0000000..d783187 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/ResultMacros.h @@ -0,0 +1,25 @@ +#pragma once + +#define RETURN_HR(hr) return(hr) +#define RETURN_LAST_ERROR() return HRESULT_FROM_WIN32(GetLastError()) +#define RETURN_WIN32(win32err) return HRESULT_FROM_WIN32(win32err) + +#define RETURN_IF_FAILED(hr) do { HRESULT __hrRet = hr; if (FAILED(__hrRet)) { RETURN_HR(__hrRet); }} while (0, 0) +#define RETURN_IF_FAILED_PLAYFAB(PlayFabResult) do { auto __pfRet = PlayFabResult; if (FAILED(__pfRet.hr)) { return {__pfRet.hr, __pfRet.errorMessage}; }} while (0, 0) +#define RETURN_IF_WIN32_BOOL_FALSE(win32BOOL) do { BOOL __boolRet = win32BOOL; if (!__boolRet) { RETURN_LAST_ERROR(); }} while (0, 0) +#define RETURN_IF_NULL_ALLOC(ptr) do { if ((ptr) == nullptr) { RETURN_HR(E_OUTOFMEMORY); }} while (0, 0) +#define RETURN_HR_IF(hr, condition) do { if (condition) { RETURN_HR(hr); }} while (0, 0) +#define RETURN_HR_IF_FALSE(hr, condition) do { if (!(condition)) { RETURN_HR(hr); }} while (0, 0) +#define RETURN_HR_INVALIDARG_IF_NULL(arg) do { RETURN_HR_IF(E_INVALIDARG, arg == nullptr); } while(0, 0) +#define RETURN_LAST_ERROR_IF(condition) do { if (condition) { RETURN_LAST_ERROR(); }} while (0, 0) +#define RETURN_LAST_ERROR_IF_NULL(ptr) do { if ((ptr) == nullptr) { RETURN_LAST_ERROR(); }} while (0, 0) + +#if _DEBUG +#define ASSERT_SUCCEEDED(hr) do { HRESULT __hrRet = hr; assert(SUCCEEDED(__hrRet)); } while(0, 0) +#else +#define ASSERT_SUCCEEDED(hr) do { (void)hr; } while(0, 0) +#endif + +#ifndef UNREFERENCED_PARAMETER +#define UNREFERENCED_PARAMETER(args) (void)(args); +#endif diff --git a/Source/PlayFabSharedInternal/Include/RunContext.h b/Source/PlayFabSharedInternal/Include/RunContext.h new file mode 100644 index 0000000..3008e30 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/RunContext.h @@ -0,0 +1,141 @@ +#pragma once + +#include "XTaskQueue.h" +#include "CancellationToken.h" + +namespace PlayFab +{ + +// Interfaces used with RunContext +struct ITerminationListener +{ + virtual ~ITerminationListener() = default; + virtual void OnTerminated(void* context) = 0; +}; + +struct ITerminable +{ + virtual ~ITerminable() = default; + virtual void Terminate(ITerminationListener& listener, void* context) = 0; +}; + +struct ITaskQueueWork +{ + virtual ~ITaskQueueWork() = default; + virtual void Run() = 0; + virtual void WorkCancelled() {} +}; + +// RunContext is an execution context for asynchronous work in PlayFab. It provides an interface for basic XAsync primitives, as well +// as a way to attach and track arbitrary asynchronous work associated with the RunContext. +// +// During SDK cleanup, RunContext::Terminate will be called for all remaining RunContexts and all pending async work will be forcibly +// ended. The RunContext will then await its completion (including cleanup of any associated state), and then notify the Terminate caller +// that everything it is safe to return the the client so they can continue their cleanup. +class RunContext : public ITerminable +{ +public: + // Creates a Root RunContext. Should only done by global state + static RunContext Root(XTaskQueueHandle queue) noexcept; + + // Derive a new RunContext from another. Subtasks that can be canceled, succeed, or fail independently should derive their own RunContext + // from their parent's RunContext. The derived RunContext will use a derived TaskQueue as well. + RunContext Derive() noexcept; + + // Derive a new RunContext from another, but use an independent TaskQueue rather than a derived one. This is typically used when a client has + // specifed a specific queue for a given piece of work (ex. a public XAsync API call or a client callback that was registered with a queue) + RunContext DeriveOnQueue(XTaskQueueHandle queueHandle) noexcept; + + RunContext(RunContext const&) noexcept = default; + RunContext(RunContext&&) noexcept = default; + RunContext& operator=(RunContext const&) noexcept = delete; + RunContext& operator=(RunContext&&) noexcept = delete; + ~RunContext() noexcept = default; + +public: // XTaskQueue shims + // Retreive an XTaskQueueHandle to be passed to XAsyncAsync APIs + XTaskQueueHandle TaskQueueHandle() const noexcept; + + // Submits an ITaskQueueWork object to the TaskQueue work port + void TaskQueueSubmitWork(SharedPtr work, uint32_t delayInMs = 0) const noexcept; + + // Submits an arbitrary lambda to the TaskQueue work port + template, TCallback>, bool> = true> + void TaskQueueSubmitWork(TCallback work, uint32_t delayInMs = 0) const noexcept; + + // Submits an ITaskQueueWork object to the TaskQueue completion port + void TaskQueueSubmitCompletion(SharedPtr completion) const noexcept; + + // Submits an arbitrary lambda to the TaskQueue completion port + template, TCallback>, bool> = true> + void TaskQueueSubmitCompletion(TCallback completion) const noexcept; + + // Terminates the XTaskQueue. Can be used to cancel all work submitted to the TaskQueue. Note however that this will also cancel work submitted + // to derived RunContext's TaskQueue + void TaskQueueTerminate() noexcept; + +public: + // CancellationToken that can be used to cancel associated work and/or be notified when a cancellation request has been made + PlayFab::CancellationToken CancellationToken() const noexcept; + + // Registers an arbitrary piece of work with the RunContext. During Termination, if the work has not yet been unregistered, + // the RunContext will alert the registered terminable that the client has requested cleanup and all work should be terminated + // as soon as possible. + bool RegisterTerminableAndCheck(ITerminable& terminable) noexcept; + + // Unregisters a previously registered terminable. Typically done when the work has completed and has cleaned up any associated state. + bool UnregisterTerminableAndCheck(ITerminable& terminable) noexcept; + + // Terminates the TaskQueue, any terminable registered with RegisterTerminableAndCheck, and any Derived RunContexts. The provided + // ITerminationListener will be notified upon completion. + // + // Terminate should only called during PFCleanup. Allowing multiple terminations if a single RunContext prevents the RunContext from + // guaranteeing that it has completely cleaning up its state prior to each listener being notified. + void Terminate(ITerminationListener& listener, void* context) noexcept override; + +private: + RunContext(SharedPtr state) noexcept; + + SharedPtr m_state; +}; + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +namespace Detail +{ + +// Wrapper to enable submitting arbitrary lambdas to TaskQueues +template +class TaskQueueWork : public ITaskQueueWork +{ +public: + TaskQueueWork(TCallback&& callback) : m_callback{ std::move(callback) } + { + } + +private: + void Run() override + { + m_callback(); + } + + TCallback m_callback; +}; + +} // namespace Detail + +template, TCallback>, bool>> +void RunContext::TaskQueueSubmitWork(TCallback work, uint32_t delayInMs) const noexcept +{ + TaskQueueSubmitWork(MakeShared>(std::move(work)), delayInMs); +} + +template, TCallback>, bool>> +void RunContext::TaskQueueSubmitCompletion(TCallback completion) const noexcept +{ + TaskQueueSubmitCompletion(MakeShared>(std::move(completion))); +} + +} diff --git a/Source/PlayFabSharedInternal/Include/SdkVersion.h b/Source/PlayFabSharedInternal/Include/SdkVersion.h new file mode 100644 index 0000000..7b4ea83 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/SdkVersion.h @@ -0,0 +1,8 @@ +#pragma once + +namespace PlayFab +{ +constexpr char sdkVersion[] = "2306.0.230508"; // format: release YYMM.release qfe#.date in YYMMDD +constexpr char versionString[] = "PFCSdk-"; +constexpr char userAgent[] = "PFCSdk/"; +} diff --git a/Source/PlayFabSharedInternal/Include/Trace.h b/Source/PlayFabSharedInternal/Include/Trace.h new file mode 100644 index 0000000..32e171b --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/Trace.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +PFHC_DECLARE_TRACE_AREA(PlayFab); + +namespace PlayFab +{ + +#define TRACE_ERROR(msg, ...) PFHC_TRACE_ERROR(PlayFab, msg, ##__VA_ARGS__) +#define TRACE_ERROR_HR(failedHr, msg) PFHC_TRACE_ERROR_HR(PlayFab, failedHr, msg) + +#define TRACE_WARNING(msg, ...) PFHC_TRACE_WARNING(PlayFab, msg, ##__VA_ARGS__) +#define TRACE_WARNING_HR(failedHr, msg) PFHC_TRACE_WARNING_HR(PlayFab, failedHr, msg) + +#define TRACE_IMPORTANT(msg, ...) PFHC_TRACE_IMPORTANT(PlayFab, msg, ##__VA_ARGS__) + +#define TRACE_INFORMATION(msg, ...) PFHC_TRACE_INFORMATION(PlayFab, msg, ##__VA_ARGS__) + +#define TRACE_VERBOSE(msg, ...) PFHC_TRACE_VERBOSE(PlayFab, msg, ##__VA_ARGS__) + +} diff --git a/Source/PlayFabSharedInternal/Include/Types.h b/Source/PlayFabSharedInternal/Include/Types.h new file mode 100644 index 0000000..b35ff65 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/Types.h @@ -0,0 +1,61 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Memory.h" +#include "RapidJson.h" + +namespace PlayFab +{ + +template +using Vector = std::vector>; + +template> +using Map = std::map>>; + +template> +using Set = std::set>; + +template, class EQUAL = std::equal_to> +using UnorderedMap = std::unordered_map>>; + +template, class EQUAL = std::equal_to> +using UnorderedSet = std::unordered_set>; + +template> +using BasicString = std::basic_string>; +using String = BasicString; +using WString = BasicString; + +template> +using BasicStringsteam = std::basic_stringstream>; +using Stringstream = BasicStringsteam; +using WStringstream = BasicStringsteam; + +template +using Deque = std::deque>; + +template +using Queue = std::queue>; + +template +using List = std::list>; + +using JsonDocument = rapidjson::Document; +using JsonValue = rapidjson::Value; + +template +using JsonWriter = rapidjson::Writer, rapidjson::UTF8<>, JsonAllocator>; + +using Clock = std::chrono::steady_clock; +using SystemClock = std::chrono::system_clock; +using TimePoint = std::chrono::time_point; + +} diff --git a/Source/PlayFabSharedInternal/Include/XAsyncOperation.h b/Source/PlayFabSharedInternal/Include/XAsyncOperation.h new file mode 100644 index 0000000..92f0ac1 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/XAsyncOperation.h @@ -0,0 +1,166 @@ +#pragma once + +#include "RunContext.h" +#include "AsyncOp.h" +#include "Error.h" + +namespace PlayFab +{ + +// Generic interface for an operation that can be run +class IOperation +{ +public: + IOperation(RunContext&& runContext) noexcept; + IOperation(IOperation const&) noexcept = delete; + IOperation& operator=(IOperation const&) noexcept = delete; + virtual ~IOperation() noexcept = default; + + // Transfer ownership of the operation and run it. The operation is responsible + // for managing its own lifetime from this point on + static void Run(UniquePtr operation) noexcept; + +protected: // Interface to operations + RunContext RunContext() const noexcept; + +private: // Interface to be implemented by operations + virtual void OnStarted(UniquePtr self) = 0; + +private: + PlayFab::RunContext m_rc; +}; + +// Wrapper of an XAsync Operation. No Strongly typed result +class XAsyncOperationBase : public IOperation, public ICancellationListener +{ +public: + XAsyncOperationBase(PlayFab::RunContext&& runContext) noexcept; + XAsyncOperationBase(XAsyncOperationBase const&) noexcept = delete; + XAsyncOperationBase& operator=(XAsyncOperationBase const&) noexcept = delete; + virtual ~XAsyncOperationBase() noexcept; + +private: // Interface to be implemented by XAsync wrapper Operations + virtual HRESULT OnStarted(XAsyncBlock* async) = 0; + virtual void OnFailed(HRESULT hr) = 0; + virtual void OnCompleted(XAsyncBlock* async) = 0; + +private: // IOperation implementation + void OnStarted(UniquePtr self) noexcept override final; + +private: // ICancellationListener + void OnCancellation() noexcept override; + +private: + static void CALLBACK XAsyncCompletionCallback(XAsyncBlock* async); + + XAsyncBlock m_asyncBlock; +}; + +// Wrapper of an XAsyncOperation with a strongly typed result +template +class XAsyncOperation : public XAsyncOperationBase +{ +public: + XAsyncOperation(PlayFab::RunContext&& rc) noexcept; + XAsyncOperation(XAsyncOperation const&) = delete; + XAsyncOperation& operator=(XAsyncOperation const&) = delete; + virtual ~XAsyncOperation() noexcept = default; + + AsyncOp AsAsyncOp() const noexcept; + +private: // Interface to be implemented by XAsync wrapper Operations + virtual Result GetResult(XAsyncBlock* async) noexcept; + +private: // XAsyncOperationBase implementation + virtual void OnFailed(HRESULT hr) noexcept override final; + virtual void OnCompleted(XAsyncBlock* async) noexcept override final; + + SharedPtr> m_asyncContext; +}; + +// Helper methods to run operations +inline void RunOperation(UniquePtr operation) noexcept +{ + IOperation::Run(std::move(operation)); +} + +template +auto RunOperation(UniquePtr operation) noexcept -> decltype(operation->AsAsyncOp()) +{ + auto asyncOp = operation->AsAsyncOp(); + IOperation::Run(std::move(operation)); + return asyncOp; +} + +//------------------------------------------------------------------------------ +// Template implementations +//------------------------------------------------------------------------------ + +// XAsyncOp Implementation +template +XAsyncOperation::XAsyncOperation(PlayFab::RunContext&& rc) noexcept : + XAsyncOperationBase{ std::move(rc) }, + m_asyncContext{ MakeShared>() } +{ +} + +template +AsyncOp XAsyncOperation::AsAsyncOp() const noexcept +{ + return m_asyncContext; +} + +template +Result XAsyncOperation::GetResult(XAsyncBlock* asyncBlock) noexcept +{ + size_t resultSize{}; + RETURN_IF_FAILED(XAsyncGetResultSize(asyncBlock, &resultSize)); + assert(resultSize == 0); // Should be overriden for XAsync operations with non-empty result payloads + return S_OK; +} + +template +void XAsyncOperation::OnFailed(HRESULT hr) noexcept +{ + // Submit synchronous failures to TaskQueue so that completion runs on the correct port. + // Overriding ITaskQueueWork::WorkCancelled to complete the AsyncOp even if the TaskQueue is terminated + struct AsyncCompletion : public ITaskQueueWork + { + SharedPtr> asyncContext; + HRESULT hr{ S_OK }; + + void Run() noexcept override + { + asyncContext->Complete(hr); + } + void WorkCancelled() noexcept override + { + asyncContext->Complete(hr); + } + }; + + auto completion = MakeShared(); + completion->asyncContext = m_asyncContext; + completion->hr = hr; + + RunContext().TaskQueueSubmitCompletion(completion); +} + +template +void XAsyncOperation::OnCompleted(XAsyncBlock* asyncBlock) noexcept +{ + std::optional> result; + try + { + result.emplace(GetResult(asyncBlock)); + } + catch (...) + { + result.emplace(CurrentExceptionToHR()); + } + + assert(result.has_value()); + m_asyncContext->Complete(std::move(*result)); +} + +} diff --git a/Source/PlayFabSharedInternal/Include/XAsyncProviderBase.h b/Source/PlayFabSharedInternal/Include/XAsyncProviderBase.h new file mode 100644 index 0000000..d4eccb5 --- /dev/null +++ b/Source/PlayFabSharedInternal/Include/XAsyncProviderBase.h @@ -0,0 +1,91 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#pragma once + +#include +#include "RunContext.h" +#include "AsyncOp.h" + +namespace PlayFab +{ + +// XAsyncProviderBase is a helper class that makes implementing XAsync providers easier. It is designed to reduce the +// amount of boilerplate and edge cases each provider needs to implement. +// +// Each XAsync API should use a derived provider class and override the relevant operations: Begin, DoWork, +// and GetResult. +class XAsyncProviderBase : public ITerminable +{ +public: + XAsyncProviderBase(const XAsyncProviderBase&) = delete; + XAsyncProviderBase& operator=(const XAsyncProviderBase&) = delete; + virtual ~XAsyncProviderBase() noexcept = default; + + // Runs an XAsync Provider. After calling Run, the provider operations Begin, DoWork, and GetResult will + // be called by the XAsync framework. The lifetime of the provider will be managed by the Provider + // base class; it will be destroyed automatically after the operation is complete and the client has gotten + // the result. + static HRESULT Run(_In_ UniquePtr provider) noexcept; + +protected: + // Create a Provider from a client provided XAsyncBlock + XAsyncProviderBase(_In_ RunContext&& runContext, _In_ XAsyncBlock* async) noexcept; + + // Create a Provider from a client provided XAsyncBlock with the specified identityName + template + XAsyncProviderBase(_In_ RunContext&& runContext, _In_ XAsyncBlock* async, const char(&_identityName)[n]) noexcept : identityName{ _identityName }, m_runContext{ std::move(runContext) }, m_async{ async } {} + + // Provider Operations to be overriden. + + // The Begin operation should start the asynchronous task, either by calling Schedule(), or by calling + // another asynchronous API. Begin will be invoked synchronously by Run(), so this operation should never block. + // + // Default implementation will call Schedule with no delay. + virtual HRESULT Begin(RunContext runContext); + + // Perform any long running work. This method is invoked is guaranteed always be invoked on the thread dictated by the Provider's + // XAsync task queue. + // + // Default implementation will return E_FAIL, marking the operation as completed with no result payload. + virtual HRESULT DoWork(RunContext runContext); + + // The GetResult operation should copy the result payload into a client provided buffer. GetResult will be called + // synchronously when the client calls the appropriate get result API. + // + // Providers implementing XAsync APIs with a result payload MUST override this method. + // Default implementation will assert and return E_UNEXPECTED (it will never be invoked for XAsync APIs with + // no result payload). + virtual HRESULT GetResult(void* buffer, size_t bufferSize); + + // Schedule DoWork operation to the TaskQueue. Can be called multiple times. + virtual HRESULT Schedule(uint32_t delay) const; + +protected: + // Methods to be called by derived classes to mark XAsyncOp as complete + + // Mark the async operation as sucessfully completed. Provide the needed buffer size to hold the result object. + void Complete(size_t resultSize); + + // Marks the operation as complete with a failure code. By design, the client won't get a result payload + // when the operation fails. The Provider's GetResult method will never be invoked in this case. + void Fail(HRESULT hr); + + // Provider identity name, used for logging purposes. Typically this is set with the __FUNCTION__ compiler macro + // or XASYNC_IDENTITY(API) + const char* const identityName; + +private: + // ITerminable + void Terminate(ITerminationListener& listener, void* context) noexcept override; + + static HRESULT CALLBACK XAsyncProvider(_In_ XAsyncOp op, _Inout_ const XAsyncProviderData* data) noexcept; + + RunContext m_runContext; + XAsyncBlock* m_async{ nullptr }; + + ITerminationListener* m_terminationListener{ nullptr }; + void* m_terminationListenerContext{ nullptr }; +}; + +} // namespace PlayFab diff --git a/Source/PlayFabSharedInternal/Source/CancellationToken.cpp b/Source/PlayFabSharedInternal/Source/CancellationToken.cpp new file mode 100644 index 0000000..5d3f0dc --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/CancellationToken.cpp @@ -0,0 +1,194 @@ +#include "pch.h" +#include "CancellationToken.h" + +namespace PlayFab +{ + +class CancellationToken::SharedState : public std::enable_shared_from_this +{ +public: + SharedPtr Derive() noexcept; + + SharedState() = default; + SharedState(SharedState const&) = delete; + SharedState(SharedState&&) = delete; + SharedState& operator=(SharedState const&) = delete; + SharedState& operator=(SharedState&&) = delete; + ~SharedState() noexcept = default; + + bool IsCanceled() const noexcept; + + bool Cancel() noexcept; + + bool RegisterForNotificationAndCheck(ICancellationListener& listener); + bool UnregisterForNotificationAndCheck(ICancellationListener& listener) noexcept; + +private: + mutable std::mutex m_mutex; + std::recursive_mutex m_cancellationMutex; // intentionally recursive + std::atomic m_cancelled{ false }; + Vector m_listeners; // non-owning + Vector> m_children; + SharedPtr m_parent; +}; + +SharedPtr CancellationToken::SharedState::Derive() noexcept +{ + SharedPtr child = MakeShared(); + + std::unique_lock lock{ m_mutex }; + + // Clean up stale child references + m_children.erase( + std::remove_if( + m_children.begin(), + m_children.end(), + [](WeakPtr const& p) { return p.expired(); } + ), + m_children.end() + ); + + // Set up parent/child pointers depending on whether the token has been cancelled + if (m_cancelled) + { + child->m_cancelled = true; + } + else + { + child->m_parent = shared_from_this(); + m_children.push_back(child); + } + + return child; +} + +bool CancellationToken::SharedState::IsCanceled() const noexcept +{ + std::unique_lock lock{ m_mutex }; + return m_cancelled; +} + +bool CancellationToken::SharedState::Cancel() noexcept +{ + // Whoever is calling us has a strong reference but we still want to take a + // strong reference to ourselves just in case they let go of us in the + // callback + SharedPtr self{ shared_from_this() }; + + std::unique_lock cancellationLock{ m_cancellationMutex }; + std::unique_lock lock{ m_mutex }; + + // If we've already been cancelled, nothing to do + if (m_cancelled.exchange(true)) + { + return false; + } + + // We only needed to keep m_parent alive so we'd be recursively cancelled, safe to release it now + m_parent.reset(); + + Vector listeners{}; + Vector> children{}; + + // Move the listeners in a local to clear the list + std::swap(listeners, m_listeners); + + // Move the child tokens into a local to clear the list + std::swap(children, m_children); + + lock.unlock(); + + // Intentionally hold the cancellationLock while notifying to avoid races with unregister + for (auto l : listeners) + { + // We do not have ownership of l, but we do have an existance guarantee + // thanks to the mutual exclusion of this method and + // 'UnregisterForNotificationAndCheck' + // l could be destroyed after 'OnCancellation' returns + l->OnCancellation(); + } + + for (auto& weakChild : children) + { + SharedPtr child = weakChild.lock(); + if (child) + { + child->Cancel(); + } + } + + return !listeners.empty() || !children.empty(); +} + +bool CancellationToken::SharedState::RegisterForNotificationAndCheck(ICancellationListener& listener) +{ + // We don't need to sync on cancellation here, either the callback will + // happen entirely after we are done, or it will never happen at all + std::unique_lock lock{ m_mutex }; + + // We return the current cancellation state as part of this function so that + // callers can know if the callbacks will be invoked later or not + + if (m_cancelled) + { + return true; + } + + m_listeners.push_back(&listener); + + return false; +} + +bool CancellationToken::SharedState::UnregisterForNotificationAndCheck(ICancellationListener& listener) noexcept +{ + // We take the cancellationGuard to ensure that we are properly serialized + // with respect to the callbacks. Because it's a recursive lock, + // unregistering from within the callback will also work (and it's safe) + std::unique_lock cancallationLock{ m_cancellationMutex }; + std::unique_lock lock{ m_mutex }; + + auto it = std::find(m_listeners.begin(), m_listeners.end(), &listener); + if (it != m_listeners.end()) + { + m_listeners.erase(it); + } + + return m_cancelled; +} + +CancellationToken::CancellationToken(SharedPtr state) noexcept : + m_state{ std::move(state) } +{ +} + +CancellationToken CancellationToken::Root() noexcept +{ + return CancellationToken{ MakeShared() }; +} + +CancellationToken CancellationToken::Derive() const noexcept +{ + return CancellationToken{ m_state->SharedState::Derive() }; +} + +bool CancellationToken::IsCancelled() const noexcept +{ + return m_state->IsCanceled(); +} + +bool CancellationToken::Cancel() noexcept +{ + return m_state->Cancel(); +} + +bool CancellationToken::RegisterForNotificationAndCheck(ICancellationListener& listener) noexcept +{ + return m_state->RegisterForNotificationAndCheck(listener); +} + +bool CancellationToken::UnregisterForNotificationAndCheck(ICancellationListener& listener) noexcept +{ + return m_state->UnregisterForNotificationAndCheck(listener); +} + +} \ No newline at end of file diff --git a/Source/PlayFabSharedInternal/Source/GDK/PlatformUser_GDK.cpp b/Source/PlayFabSharedInternal/Source/GDK/PlatformUser_GDK.cpp new file mode 100644 index 0000000..416ef5b --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/GDK/PlatformUser_GDK.cpp @@ -0,0 +1,194 @@ +#include "pch.h" +#include "GDK/PlatformUser_GDK.h" +#include +#include + +namespace PlayFab +{ +namespace Platform +{ + +User::User(XUserHandle userHandle) noexcept + : m_user{ Wrappers::XUser::Wrap(userHandle) } +{ +} + +Result User::Wrap(XUserHandle userHandle) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(userHandle); + User user{ userHandle }; + RETURN_IF_FAILED(user.Initialize()); + return user; +} + +Result User::Duplicate(XUserHandle userHandle) noexcept +{ + XUserHandle copiedHandle; + RETURN_IF_FAILED(XUserDuplicateHandle(userHandle, &copiedHandle)); + + User copiedUser{ copiedHandle }; + RETURN_IF_FAILED(copiedUser.Initialize()); + + return std::move(copiedUser); +} + +class XUserAddOperation : public XAsyncOperation +{ +public: + XUserAddOperation(XUserAddOptions options, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + XUserAddOptions m_options; +}; + +XUserAddOperation::XUserAddOperation(XUserAddOptions options, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_options{ options } +{ +} + +HRESULT XUserAddOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return XUserAddAsync(m_options, async); +} + +Result XUserAddOperation::GetResult(XAsyncBlock* async) noexcept +{ + XUserHandle userHandle; + RETURN_IF_FAILED(XUserAddResult(async, &userHandle)); + return XUser::Wrap(userHandle); +} + +AsyncOp User::Add( + XUserAddOptions options, + RunContext rc +) noexcept +{ + return RunOperation(MakeUnique(options, rc)); +} + +HRESULT User::Initialize() noexcept +{ + RETURN_IF_FAILED(XUserGetId(m_user.Handle(), &m_id)); + return S_OK; +} + +XUserHandle User::Handle() const noexcept +{ + return m_user.Handle(); +} + +uint64_t User::Id() const noexcept +{ + return m_id; +} + +class XUserGetTokenAndSignatureOperation : public XAsyncOperation +{ +public: + XUserGetTokenAndSignatureOperation( + XUser userHandle, + XUserGetTokenAndSignatureOptions options, + String httpMethod, + String url, + UnorderedMap headers, + Vector requestBody, + PlayFab::RunContext runContext + ) noexcept; + + ~XUserGetTokenAndSignatureOperation() = default; + +private: + // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + XUser m_user; + XUserGetTokenAndSignatureOptions const m_options; + String const m_httpMethod; + String const m_url; + UnorderedMap const m_headers; + Vector const m_requestBody; +}; + +XUserGetTokenAndSignatureOperation::XUserGetTokenAndSignatureOperation( + XUser user, + XUserGetTokenAndSignatureOptions options, + String httpMethod, + String url, + UnorderedMap headers, + Vector requestBody, + PlayFab::RunContext runContext +) noexcept : + XAsyncOperation{ std::move(runContext) }, + m_user{ std::move(user) }, + m_options{ options }, + m_httpMethod{ std::move(httpMethod) }, + m_url{ std::move(url) }, + m_headers{ std::move(headers) }, + m_requestBody{ std::move(requestBody) } +{ +} + +HRESULT XUserGetTokenAndSignatureOperation::OnStarted(XAsyncBlock* async) noexcept +{ + Vector headers{}; + for (const auto& header : m_headers) + { + headers.push_back(XUserGetTokenAndSignatureHttpHeader{ header.first.data(), header.second.data() }); + } + + return XUserGetTokenAndSignatureAsync( + m_user.Handle(), + m_options, + m_httpMethod.data(), + m_url.data(), + headers.size(), + headers.empty() ? nullptr : headers.data(), + m_requestBody.size(), + m_requestBody.empty() ? nullptr : m_requestBody.data(), + async + ); +} + +Result XUserGetTokenAndSignatureOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize{ 0 }; + RETURN_IF_FAILED(XUserGetTokenAndSignatureResultSize(async, &bufferSize)); + + TokenAndSignature result; + Vector buffer(bufferSize, 0); + XUserGetTokenAndSignatureData* XUserTokenSignatureData{ nullptr }; + RETURN_IF_FAILED(XUserGetTokenAndSignatureResult(async, bufferSize, buffer.data(), &XUserTokenSignatureData, nullptr)); + + result.token = String{ XUserTokenSignatureData->token, XUserTokenSignatureData->tokenSize }; + result.signature = String{ XUserTokenSignatureData->signature, XUserTokenSignatureData->signatureSize }; + + return result; +} + +AsyncOp User::GetTokenAndSignature( + RunContext runContext +) const noexcept +{ + auto duplicateResult = XUser::Duplicate(m_user.Handle()); + RETURN_IF_FAILED(duplicateResult.hr); + + auto operation = MakeUnique( + duplicateResult.ExtractPayload(), + XUserGetTokenAndSignatureOptions::None, + "POST", + "https://playfabapi.com/", + UnorderedMap{}, + Vector{}, + std::move(runContext) + ); + + return RunOperation(std::move(operation)); +} + +} // namespace Platform +} // namespace PlayFab diff --git a/Source/PlayFabSharedInternal/Source/Generated/Error.cpp b/Source/PlayFabSharedInternal/Source/Generated/Error.cpp new file mode 100644 index 0000000..56401af --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/Generated/Error.cpp @@ -0,0 +1,893 @@ +#include "pch.h" +#include "Error.h" +#include + +namespace PlayFab +{ + +HRESULT ServiceErrorToHR(ServiceErrorCode errorCode) +{ + switch (errorCode) + { + case ServiceErrorCode::Success: return S_OK; + case ServiceErrorCode::UnkownError: return E_PF_UNKOWN_ERROR; + case ServiceErrorCode::InvalidParams: return E_PF_INVALID_PARAMS; + case ServiceErrorCode::AccountNotFound: return E_PF_ACCOUNT_NOT_FOUND; + case ServiceErrorCode::AccountBanned: return E_PF_ACCOUNT_BANNED; + case ServiceErrorCode::InvalidUsernameOrPassword: return E_PF_INVALID_USERNAME_OR_PASSWORD; + case ServiceErrorCode::InvalidTitleId: return E_PF_INVALID_TITLE_ID; + case ServiceErrorCode::InvalidEmailAddress: return E_PF_INVALID_EMAIL_ADDRESS; + case ServiceErrorCode::EmailAddressNotAvailable: return E_PF_EMAIL_ADDRESS_NOT_AVAILABLE; + case ServiceErrorCode::InvalidUsername: return E_PF_INVALID_USERNAME; + case ServiceErrorCode::InvalidPassword: return E_PF_INVALID_PASSWORD; + case ServiceErrorCode::UsernameNotAvailable: return E_PF_USERNAME_NOT_AVAILABLE; + case ServiceErrorCode::InvalidSteamTicket: return E_PF_INVALID_STEAM_TICKET; + case ServiceErrorCode::AccountAlreadyLinked: return E_PF_ACCOUNT_ALREADY_LINKED; + case ServiceErrorCode::LinkedAccountAlreadyClaimed: return E_PF_LINKED_ACCOUNT_ALREADY_CLAIMED; + case ServiceErrorCode::InvalidFacebookToken: return E_PF_INVALID_FACEBOOK_TOKEN; + case ServiceErrorCode::AccountNotLinked: return E_PF_ACCOUNT_NOT_LINKED; + case ServiceErrorCode::FailedByPaymentProvider: return E_PF_FAILED_BY_PAYMENT_PROVIDER; + case ServiceErrorCode::CouponCodeNotFound: return E_PF_COUPON_CODE_NOT_FOUND; + case ServiceErrorCode::InvalidContainerItem: return E_PF_INVALID_CONTAINER_ITEM; + case ServiceErrorCode::ContainerNotOwned: return E_PF_CONTAINER_NOT_OWNED; + case ServiceErrorCode::KeyNotOwned: return E_PF_KEY_NOT_OWNED; + case ServiceErrorCode::InvalidItemIdInTable: return E_PF_INVALID_ITEM_ID_IN_TABLE; + case ServiceErrorCode::InvalidReceipt: return E_PF_INVALID_RECEIPT; + case ServiceErrorCode::ReceiptAlreadyUsed: return E_PF_RECEIPT_ALREADY_USED; + case ServiceErrorCode::ReceiptCancelled: return E_PF_RECEIPT_CANCELLED; + case ServiceErrorCode::GameNotFound: return E_PF_GAME_NOT_FOUND; + case ServiceErrorCode::GameModeNotFound: return E_PF_GAME_MODE_NOT_FOUND; + case ServiceErrorCode::InvalidGoogleToken: return E_PF_INVALID_GOOGLE_TOKEN; + case ServiceErrorCode::UserIsNotPartOfDeveloper: return E_PF_USER_IS_NOT_PART_OF_DEVELOPER; + case ServiceErrorCode::InvalidTitleForDeveloper: return E_PF_INVALID_TITLE_FOR_DEVELOPER; + case ServiceErrorCode::TitleNameConflicts: return E_PF_TITLE_NAME_CONFLICTS; + case ServiceErrorCode::UserisNotValid: return E_PF_USERIS_NOT_VALID; + case ServiceErrorCode::ValueAlreadyExists: return E_PF_VALUE_ALREADY_EXISTS; + case ServiceErrorCode::BuildNotFound: return E_PF_BUILD_NOT_FOUND; + case ServiceErrorCode::PlayerNotInGame: return E_PF_PLAYER_NOT_IN_GAME; + case ServiceErrorCode::InvalidTicket: return E_PF_INVALID_TICKET; + case ServiceErrorCode::InvalidDeveloper: return E_PF_INVALID_DEVELOPER; + case ServiceErrorCode::InvalidOrderInfo: return E_PF_INVALID_ORDER_INFO; + case ServiceErrorCode::RegistrationIncomplete: return E_PF_REGISTRATION_INCOMPLETE; + case ServiceErrorCode::InvalidPlatform: return E_PF_INVALID_PLATFORM; + case ServiceErrorCode::UnknownError: return E_PF_UNKNOWN_ERROR; + case ServiceErrorCode::SteamApplicationNotOwned: return E_PF_STEAM_APPLICATION_NOT_OWNED; + case ServiceErrorCode::WrongSteamAccount: return E_PF_WRONG_STEAM_ACCOUNT; + case ServiceErrorCode::TitleNotActivated: return E_PF_TITLE_NOT_ACTIVATED; + case ServiceErrorCode::RegistrationSessionNotFound: return E_PF_REGISTRATION_SESSION_NOT_FOUND; + case ServiceErrorCode::NoSuchMod: return E_PF_NO_SUCH_MOD; + case ServiceErrorCode::FileNotFound: return E_PF_FILE_NOT_FOUND; + case ServiceErrorCode::DuplicateEmail: return E_PF_DUPLICATE_EMAIL; + case ServiceErrorCode::ItemNotFound: return E_PF_ITEM_NOT_FOUND; + case ServiceErrorCode::ItemNotOwned: return E_PF_ITEM_NOT_OWNED; + case ServiceErrorCode::ItemNotRecycleable: return E_PF_ITEM_NOT_RECYCLEABLE; + case ServiceErrorCode::ItemNotAffordable: return E_PF_ITEM_NOT_AFFORDABLE; + case ServiceErrorCode::InvalidVirtualCurrency: return E_PF_INVALID_VIRTUAL_CURRENCY; + case ServiceErrorCode::WrongVirtualCurrency: return E_PF_WRONG_VIRTUAL_CURRENCY; + case ServiceErrorCode::WrongPrice: return E_PF_WRONG_PRICE; + case ServiceErrorCode::NonPositiveValue: return E_PF_NON_POSITIVE_VALUE; + case ServiceErrorCode::InvalidRegion: return E_PF_INVALID_REGION; + case ServiceErrorCode::RegionAtCapacity: return E_PF_REGION_AT_CAPACITY; + case ServiceErrorCode::ServerFailedToStart: return E_PF_SERVER_FAILED_TO_START; + case ServiceErrorCode::NameNotAvailable: return E_PF_NAME_NOT_AVAILABLE; + case ServiceErrorCode::InsufficientFunds: return E_PF_INSUFFICIENT_FUNDS; + case ServiceErrorCode::InvalidDeviceID: return E_PF_INVALID_DEVICE_ID; + case ServiceErrorCode::InvalidPushNotificationToken: return E_PF_INVALID_PUSH_NOTIFICATION_TOKEN; + case ServiceErrorCode::NoRemainingUses: return E_PF_NO_REMAINING_USES; + case ServiceErrorCode::InvalidPaymentProvider: return E_PF_INVALID_PAYMENT_PROVIDER; + case ServiceErrorCode::PurchaseInitializationFailure: return E_PF_PURCHASE_INITIALIZATION_FAILURE; + case ServiceErrorCode::DuplicateUsername: return E_PF_DUPLICATE_USERNAME; + case ServiceErrorCode::InvalidBuyerInfo: return E_PF_INVALID_BUYER_INFO; + case ServiceErrorCode::NoGameModeParamsSet: return E_PF_NO_GAME_MODE_PARAMS_SET; + case ServiceErrorCode::BodyTooLarge: return E_PF_BODY_TOO_LARGE; + case ServiceErrorCode::ReservedWordInBody: return E_PF_RESERVED_WORD_IN_BODY; + case ServiceErrorCode::InvalidTypeInBody: return E_PF_INVALID_TYPE_IN_BODY; + case ServiceErrorCode::InvalidRequest: return E_PF_INVALID_REQUEST; + case ServiceErrorCode::ReservedEventName: return E_PF_RESERVED_EVENT_NAME; + case ServiceErrorCode::InvalidUserStatistics: return E_PF_INVALID_USER_STATISTICS; + case ServiceErrorCode::NotAuthenticated: return E_PF_NOT_AUTHENTICATED; + case ServiceErrorCode::StreamAlreadyExists: return E_PF_STREAM_ALREADY_EXISTS; + case ServiceErrorCode::ErrorCreatingStream: return E_PF_ERROR_CREATING_STREAM; + case ServiceErrorCode::StreamNotFound: return E_PF_STREAM_NOT_FOUND; + case ServiceErrorCode::InvalidAccount: return E_PF_INVALID_ACCOUNT; + case ServiceErrorCode::PurchaseDoesNotExist: return E_PF_PURCHASE_DOES_NOT_EXIST; + case ServiceErrorCode::InvalidPurchaseTransactionStatus: return E_PF_INVALID_PURCHASE_TRANSACTION_STATUS; + case ServiceErrorCode::APINotEnabledForGameClientAccess: return E_PF_API_NOT_ENABLED_FOR_GAME_CLIENT_ACCESS; + case ServiceErrorCode::NoPushNotificationARNForTitle: return E_PF_NO_PUSH_NOTIFICATION_ARN_FOR_TITLE; + case ServiceErrorCode::BuildAlreadyExists: return E_PF_BUILD_ALREADY_EXISTS; + case ServiceErrorCode::BuildPackageDoesNotExist: return E_PF_BUILD_PACKAGE_DOES_NOT_EXIST; + case ServiceErrorCode::CustomAnalyticsEventsNotEnabledForTitle: return E_PF_CUSTOM_ANALYTICS_EVENTS_NOT_ENABLED_FOR_TITLE; + case ServiceErrorCode::InvalidSharedGroupId: return E_PF_INVALID_SHARED_GROUP_ID; + case ServiceErrorCode::NotAuthorized: return E_PF_NOT_AUTHORIZED; + case ServiceErrorCode::MissingTitleGoogleProperties: return E_PF_MISSING_TITLE_GOOGLE_PROPERTIES; + case ServiceErrorCode::InvalidItemProperties: return E_PF_INVALID_ITEM_PROPERTIES; + case ServiceErrorCode::InvalidPSNAuthCode: return E_PF_INVALID_PSN_AUTH_CODE; + case ServiceErrorCode::InvalidItemId: return E_PF_INVALID_ITEM_ID; + case ServiceErrorCode::PushNotEnabledForAccount: return E_PF_PUSH_NOT_ENABLED_FOR_ACCOUNT; + case ServiceErrorCode::PushServiceError: return E_PF_PUSH_SERVICE_ERROR; + case ServiceErrorCode::ReceiptDoesNotContainInAppItems: return E_PF_RECEIPT_DOES_NOT_CONTAIN_IN_APP_ITEMS; + case ServiceErrorCode::ReceiptContainsMultipleInAppItems: return E_PF_RECEIPT_CONTAINS_MULTIPLE_IN_APP_ITEMS; + case ServiceErrorCode::InvalidBundleID: return E_PF_INVALID_BUNDLE_ID; + case ServiceErrorCode::JavascriptException: return E_PF_JAVASCRIPT_EXCEPTION; + case ServiceErrorCode::InvalidSessionTicket: return E_PF_INVALID_SESSION_TICKET; + case ServiceErrorCode::UnableToConnectToDatabase: return E_PF_UNABLE_TO_CONNECT_TO_DATABASE; + case ServiceErrorCode::InternalServerError: return E_PF_INTERNAL_SERVER_ERROR; + case ServiceErrorCode::InvalidReportDate: return E_PF_INVALID_REPORT_DATE; + case ServiceErrorCode::ReportNotAvailable: return E_PF_REPORT_NOT_AVAILABLE; + case ServiceErrorCode::DatabaseThroughputExceeded: return E_PF_DATABASE_THROUGHPUT_EXCEEDED; + case ServiceErrorCode::InvalidGameTicket: return E_PF_INVALID_GAME_TICKET; + case ServiceErrorCode::ExpiredGameTicket: return E_PF_EXPIRED_GAME_TICKET; + case ServiceErrorCode::GameTicketDoesNotMatchLobby: return E_PF_GAME_TICKET_DOES_NOT_MATCH_LOBBY; + case ServiceErrorCode::LinkedDeviceAlreadyClaimed: return E_PF_LINKED_DEVICE_ALREADY_CLAIMED; + case ServiceErrorCode::DeviceAlreadyLinked: return E_PF_DEVICE_ALREADY_LINKED; + case ServiceErrorCode::DeviceNotLinked: return E_PF_DEVICE_NOT_LINKED; + case ServiceErrorCode::PartialFailure: return E_PF_PARTIAL_FAILURE; + case ServiceErrorCode::PublisherNotSet: return E_PF_PUBLISHER_NOT_SET; + case ServiceErrorCode::ServiceUnavailable: return E_PF_SERVICE_UNAVAILABLE; + case ServiceErrorCode::VersionNotFound: return E_PF_VERSION_NOT_FOUND; + case ServiceErrorCode::RevisionNotFound: return E_PF_REVISION_NOT_FOUND; + case ServiceErrorCode::InvalidPublisherId: return E_PF_INVALID_PUBLISHER_ID; + case ServiceErrorCode::DownstreamServiceUnavailable: return E_PF_DOWNSTREAM_SERVICE_UNAVAILABLE; + case ServiceErrorCode::APINotIncludedInTitleUsageTier: return E_PF_API_NOT_INCLUDED_IN_TITLE_USAGE_TIER; + case ServiceErrorCode::DAULimitExceeded: return E_PF_DAU_LIMIT_EXCEEDED; + case ServiceErrorCode::APIRequestLimitExceeded: return E_PF_API_REQUEST_LIMIT_EXCEEDED; + case ServiceErrorCode::InvalidAPIEndpoint: return E_PF_INVALID_API_ENDPOINT; + case ServiceErrorCode::BuildNotAvailable: return E_PF_BUILD_NOT_AVAILABLE; + case ServiceErrorCode::ConcurrentEditError: return E_PF_CONCURRENT_EDIT_ERROR; + case ServiceErrorCode::ContentNotFound: return E_PF_CONTENT_NOT_FOUND; + case ServiceErrorCode::CharacterNotFound: return E_PF_CHARACTER_NOT_FOUND; + case ServiceErrorCode::CloudScriptNotFound: return E_PF_CLOUD_SCRIPT_NOT_FOUND; + case ServiceErrorCode::ContentQuotaExceeded: return E_PF_CONTENT_QUOTA_EXCEEDED; + case ServiceErrorCode::InvalidCharacterStatistics: return E_PF_INVALID_CHARACTER_STATISTICS; + case ServiceErrorCode::PhotonNotEnabledForTitle: return E_PF_PHOTON_NOT_ENABLED_FOR_TITLE; + case ServiceErrorCode::PhotonApplicationNotFound: return E_PF_PHOTON_APPLICATION_NOT_FOUND; + case ServiceErrorCode::PhotonApplicationNotAssociatedWithTitle: return E_PF_PHOTON_APPLICATION_NOT_ASSOCIATED_WITH_TITLE; + case ServiceErrorCode::InvalidEmailOrPassword: return E_PF_INVALID_EMAIL_OR_PASSWORD; + case ServiceErrorCode::FacebookAPIError: return E_PF_FACEBOOK_API_ERROR; + case ServiceErrorCode::InvalidContentType: return E_PF_INVALID_CONTENT_TYPE; + case ServiceErrorCode::KeyLengthExceeded: return E_PF_KEY_LENGTH_EXCEEDED; + case ServiceErrorCode::DataLengthExceeded: return E_PF_DATA_LENGTH_EXCEEDED; + case ServiceErrorCode::TooManyKeys: return E_PF_TOO_MANY_KEYS; + case ServiceErrorCode::FreeTierCannotHaveVirtualCurrency: return E_PF_FREE_TIER_CANNOT_HAVE_VIRTUAL_CURRENCY; + case ServiceErrorCode::MissingAmazonSharedKey: return E_PF_MISSING_AMAZON_SHARED_KEY; + case ServiceErrorCode::AmazonValidationError: return E_PF_AMAZON_VALIDATION_ERROR; + case ServiceErrorCode::InvalidPSNIssuerId: return E_PF_INVALID_PSN_ISSUER_ID; + case ServiceErrorCode::PSNInaccessible: return E_PF_PSN_INACCESSIBLE; + case ServiceErrorCode::ExpiredAuthToken: return E_PF_EXPIRED_AUTH_TOKEN; + case ServiceErrorCode::FailedToGetEntitlements: return E_PF_FAILED_TO_GET_ENTITLEMENTS; + case ServiceErrorCode::FailedToConsumeEntitlement: return E_PF_FAILED_TO_CONSUME_ENTITLEMENT; + case ServiceErrorCode::TradeAcceptingUserNotAllowed: return E_PF_TRADE_ACCEPTING_USER_NOT_ALLOWED; + case ServiceErrorCode::TradeInventoryItemIsAssignedToCharacter: return E_PF_TRADE_INVENTORY_ITEM_IS_ASSIGNED_TO_CHARACTER; + case ServiceErrorCode::TradeInventoryItemIsBundle: return E_PF_TRADE_INVENTORY_ITEM_IS_BUNDLE; + case ServiceErrorCode::TradeStatusNotValidForCancelling: return E_PF_TRADE_STATUS_NOT_VALID_FOR_CANCELLING; + case ServiceErrorCode::TradeStatusNotValidForAccepting: return E_PF_TRADE_STATUS_NOT_VALID_FOR_ACCEPTING; + case ServiceErrorCode::TradeDoesNotExist: return E_PF_TRADE_DOES_NOT_EXIST; + case ServiceErrorCode::TradeCancelled: return E_PF_TRADE_CANCELLED; + case ServiceErrorCode::TradeAlreadyFilled: return E_PF_TRADE_ALREADY_FILLED; + case ServiceErrorCode::TradeWaitForStatusTimeout: return E_PF_TRADE_WAIT_FOR_STATUS_TIMEOUT; + case ServiceErrorCode::TradeInventoryItemExpired: return E_PF_TRADE_INVENTORY_ITEM_EXPIRED; + case ServiceErrorCode::TradeMissingOfferedAndAcceptedItems: return E_PF_TRADE_MISSING_OFFERED_AND_ACCEPTED_ITEMS; + case ServiceErrorCode::TradeAcceptedItemIsBundle: return E_PF_TRADE_ACCEPTED_ITEM_IS_BUNDLE; + case ServiceErrorCode::TradeAcceptedItemIsStackable: return E_PF_TRADE_ACCEPTED_ITEM_IS_STACKABLE; + case ServiceErrorCode::TradeInventoryItemInvalidStatus: return E_PF_TRADE_INVENTORY_ITEM_INVALID_STATUS; + case ServiceErrorCode::TradeAcceptedCatalogItemInvalid: return E_PF_TRADE_ACCEPTED_CATALOG_ITEM_INVALID; + case ServiceErrorCode::TradeAllowedUsersInvalid: return E_PF_TRADE_ALLOWED_USERS_INVALID; + case ServiceErrorCode::TradeInventoryItemDoesNotExist: return E_PF_TRADE_INVENTORY_ITEM_DOES_NOT_EXIST; + case ServiceErrorCode::TradeInventoryItemIsConsumed: return E_PF_TRADE_INVENTORY_ITEM_IS_CONSUMED; + case ServiceErrorCode::TradeInventoryItemIsStackable: return E_PF_TRADE_INVENTORY_ITEM_IS_STACKABLE; + case ServiceErrorCode::TradeAcceptedItemsMismatch: return E_PF_TRADE_ACCEPTED_ITEMS_MISMATCH; + case ServiceErrorCode::InvalidKongregateToken: return E_PF_INVALID_KONGREGATE_TOKEN; + case ServiceErrorCode::FeatureNotConfiguredForTitle: return E_PF_FEATURE_NOT_CONFIGURED_FOR_TITLE; + case ServiceErrorCode::NoMatchingCatalogItemForReceipt: return E_PF_NO_MATCHING_CATALOG_ITEM_FOR_RECEIPT; + case ServiceErrorCode::InvalidCurrencyCode: return E_PF_INVALID_CURRENCY_CODE; + case ServiceErrorCode::NoRealMoneyPriceForCatalogItem: return E_PF_NO_REAL_MONEY_PRICE_FOR_CATALOG_ITEM; + case ServiceErrorCode::TradeInventoryItemIsNotTradable: return E_PF_TRADE_INVENTORY_ITEM_IS_NOT_TRADABLE; + case ServiceErrorCode::TradeAcceptedCatalogItemIsNotTradable: return E_PF_TRADE_ACCEPTED_CATALOG_ITEM_IS_NOT_TRADABLE; + case ServiceErrorCode::UsersAlreadyFriends: return E_PF_USERS_ALREADY_FRIENDS; + case ServiceErrorCode::LinkedIdentifierAlreadyClaimed: return E_PF_LINKED_IDENTIFIER_ALREADY_CLAIMED; + case ServiceErrorCode::CustomIdNotLinked: return E_PF_CUSTOM_ID_NOT_LINKED; + case ServiceErrorCode::TotalDataSizeExceeded: return E_PF_TOTAL_DATA_SIZE_EXCEEDED; + case ServiceErrorCode::DeleteKeyConflict: return E_PF_DELETE_KEY_CONFLICT; + case ServiceErrorCode::InvalidXboxLiveToken: return E_PF_INVALID_XBOX_LIVE_TOKEN; + case ServiceErrorCode::ExpiredXboxLiveToken: return E_PF_EXPIRED_XBOX_LIVE_TOKEN; + case ServiceErrorCode::ResettableStatisticVersionRequired: return E_PF_RESETTABLE_STATISTIC_VERSION_REQUIRED; + case ServiceErrorCode::NotAuthorizedByTitle: return E_PF_NOT_AUTHORIZED_BY_TITLE; + case ServiceErrorCode::NoPartnerEnabled: return E_PF_NO_PARTNER_ENABLED; + case ServiceErrorCode::InvalidPartnerResponse: return E_PF_INVALID_PARTNER_RESPONSE; + case ServiceErrorCode::APINotEnabledForGameServerAccess: return E_PF_API_NOT_ENABLED_FOR_GAME_SERVER_ACCESS; + case ServiceErrorCode::StatisticNotFound: return E_PF_STATISTIC_NOT_FOUND; + case ServiceErrorCode::StatisticNameConflict: return E_PF_STATISTIC_NAME_CONFLICT; + case ServiceErrorCode::StatisticVersionClosedForWrites: return E_PF_STATISTIC_VERSION_CLOSED_FOR_WRITES; + case ServiceErrorCode::StatisticVersionInvalid: return E_PF_STATISTIC_VERSION_INVALID; + case ServiceErrorCode::APIClientRequestRateLimitExceeded: return E_PF_API_CLIENT_REQUEST_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::InvalidJSONContent: return E_PF_INVALID_JSON_CONTENT; + case ServiceErrorCode::InvalidDropTable: return E_PF_INVALID_DROP_TABLE; + case ServiceErrorCode::StatisticVersionAlreadyIncrementedForScheduledInterval: return E_PF_STATISTIC_VERSION_ALREADY_INCREMENTED_FOR_SCHEDULED_INTERVAL; + case ServiceErrorCode::StatisticCountLimitExceeded: return E_PF_STATISTIC_COUNT_LIMIT_EXCEEDED; + case ServiceErrorCode::StatisticVersionIncrementRateExceeded: return E_PF_STATISTIC_VERSION_INCREMENT_RATE_EXCEEDED; + case ServiceErrorCode::ContainerKeyInvalid: return E_PF_CONTAINER_KEY_INVALID; + case ServiceErrorCode::CloudScriptExecutionTimeLimitExceeded: return E_PF_CLOUD_SCRIPT_EXECUTION_TIME_LIMIT_EXCEEDED; + case ServiceErrorCode::NoWritePermissionsForEvent: return E_PF_NO_WRITE_PERMISSIONS_FOR_EVENT; + case ServiceErrorCode::CloudScriptFunctionArgumentSizeExceeded: return E_PF_CLOUD_SCRIPT_FUNCTION_ARGUMENT_SIZE_EXCEEDED; + case ServiceErrorCode::CloudScriptAPIRequestCountExceeded: return E_PF_CLOUD_SCRIPT_API_REQUEST_COUNT_EXCEEDED; + case ServiceErrorCode::CloudScriptAPIRequestError: return E_PF_CLOUD_SCRIPT_API_REQUEST_ERROR; + case ServiceErrorCode::CloudScriptHTTPRequestError: return E_PF_CLOUD_SCRIPT_HTTP_REQUEST_ERROR; + case ServiceErrorCode::InsufficientGuildRole: return E_PF_INSUFFICIENT_GUILD_ROLE; + case ServiceErrorCode::GuildNotFound: return E_PF_GUILD_NOT_FOUND; + case ServiceErrorCode::OverLimit: return E_PF_OVER_LIMIT; + case ServiceErrorCode::EventNotFound: return E_PF_EVENT_NOT_FOUND; + case ServiceErrorCode::InvalidEventField: return E_PF_INVALID_EVENT_FIELD; + case ServiceErrorCode::InvalidEventName: return E_PF_INVALID_EVENT_NAME; + case ServiceErrorCode::CatalogNotConfigured: return E_PF_CATALOG_NOT_CONFIGURED; + case ServiceErrorCode::OperationNotSupportedForPlatform: return E_PF_OPERATION_NOT_SUPPORTED_FOR_PLATFORM; + case ServiceErrorCode::SegmentNotFound: return E_PF_SEGMENT_NOT_FOUND; + case ServiceErrorCode::StoreNotFound: return E_PF_STORE_NOT_FOUND; + case ServiceErrorCode::InvalidStatisticName: return E_PF_INVALID_STATISTIC_NAME; + case ServiceErrorCode::TitleNotQualifiedForLimit: return E_PF_TITLE_NOT_QUALIFIED_FOR_LIMIT; + case ServiceErrorCode::InvalidServiceLimitLevel: return E_PF_INVALID_SERVICE_LIMIT_LEVEL; + case ServiceErrorCode::ServiceLimitLevelInTransition: return E_PF_SERVICE_LIMIT_LEVEL_IN_TRANSITION; + case ServiceErrorCode::CouponAlreadyRedeemed: return E_PF_COUPON_ALREADY_REDEEMED; + case ServiceErrorCode::GameServerBuildSizeLimitExceeded: return E_PF_GAME_SERVER_BUILD_SIZE_LIMIT_EXCEEDED; + case ServiceErrorCode::GameServerBuildCountLimitExceeded: return E_PF_GAME_SERVER_BUILD_COUNT_LIMIT_EXCEEDED; + case ServiceErrorCode::VirtualCurrencyCountLimitExceeded: return E_PF_VIRTUAL_CURRENCY_COUNT_LIMIT_EXCEEDED; + case ServiceErrorCode::VirtualCurrencyCodeExists: return E_PF_VIRTUAL_CURRENCY_CODE_EXISTS; + case ServiceErrorCode::TitleNewsItemCountLimitExceeded: return E_PF_TITLE_NEWS_ITEM_COUNT_LIMIT_EXCEEDED; + case ServiceErrorCode::InvalidTwitchToken: return E_PF_INVALID_TWITCH_TOKEN; + case ServiceErrorCode::TwitchResponseError: return E_PF_TWITCH_RESPONSE_ERROR; + case ServiceErrorCode::ProfaneDisplayName: return E_PF_PROFANE_DISPLAY_NAME; + case ServiceErrorCode::UserAlreadyAdded: return E_PF_USER_ALREADY_ADDED; + case ServiceErrorCode::InvalidVirtualCurrencyCode: return E_PF_INVALID_VIRTUAL_CURRENCY_CODE; + case ServiceErrorCode::VirtualCurrencyCannotBeDeleted: return E_PF_VIRTUAL_CURRENCY_CANNOT_BE_DELETED; + case ServiceErrorCode::IdentifierAlreadyClaimed: return E_PF_IDENTIFIER_ALREADY_CLAIMED; + case ServiceErrorCode::IdentifierNotLinked: return E_PF_IDENTIFIER_NOT_LINKED; + case ServiceErrorCode::InvalidContinuationToken: return E_PF_INVALID_CONTINUATION_TOKEN; + case ServiceErrorCode::ExpiredContinuationToken: return E_PF_EXPIRED_CONTINUATION_TOKEN; + case ServiceErrorCode::InvalidSegment: return E_PF_INVALID_SEGMENT; + case ServiceErrorCode::InvalidSessionId: return E_PF_INVALID_SESSION_ID; + case ServiceErrorCode::SessionLogNotFound: return E_PF_SESSION_LOG_NOT_FOUND; + case ServiceErrorCode::InvalidSearchTerm: return E_PF_INVALID_SEARCH_TERM; + case ServiceErrorCode::TwoFactorAuthenticationTokenRequired: return E_PF_TWO_FACTOR_AUTHENTICATION_TOKEN_REQUIRED; + case ServiceErrorCode::GameServerHostCountLimitExceeded: return E_PF_GAME_SERVER_HOST_COUNT_LIMIT_EXCEEDED; + case ServiceErrorCode::PlayerTagCountLimitExceeded: return E_PF_PLAYER_TAG_COUNT_LIMIT_EXCEEDED; + case ServiceErrorCode::RequestAlreadyRunning: return E_PF_REQUEST_ALREADY_RUNNING; + case ServiceErrorCode::ActionGroupNotFound: return E_PF_ACTION_GROUP_NOT_FOUND; + case ServiceErrorCode::MaximumSegmentBulkActionJobsRunning: return E_PF_MAXIMUM_SEGMENT_BULK_ACTION_JOBS_RUNNING; + case ServiceErrorCode::NoActionsOnPlayersInSegmentJob: return E_PF_NO_ACTIONS_ON_PLAYERS_IN_SEGMENT_JOB; + case ServiceErrorCode::DuplicateStatisticName: return E_PF_DUPLICATE_STATISTIC_NAME; + case ServiceErrorCode::ScheduledTaskNameConflict: return E_PF_SCHEDULED_TASK_NAME_CONFLICT; + case ServiceErrorCode::ScheduledTaskCreateConflict: return E_PF_SCHEDULED_TASK_CREATE_CONFLICT; + case ServiceErrorCode::InvalidScheduledTaskName: return E_PF_INVALID_SCHEDULED_TASK_NAME; + case ServiceErrorCode::InvalidTaskSchedule: return E_PF_INVALID_TASK_SCHEDULE; + case ServiceErrorCode::SteamNotEnabledForTitle: return E_PF_STEAM_NOT_ENABLED_FOR_TITLE; + case ServiceErrorCode::LimitNotAnUpgradeOption: return E_PF_LIMIT_NOT_AN_UPGRADE_OPTION; + case ServiceErrorCode::NoSecretKeyEnabledForCloudScript: return E_PF_NO_SECRET_KEY_ENABLED_FOR_CLOUD_SCRIPT; + case ServiceErrorCode::TaskNotFound: return E_PF_TASK_NOT_FOUND; + case ServiceErrorCode::TaskInstanceNotFound: return E_PF_TASK_INSTANCE_NOT_FOUND; + case ServiceErrorCode::InvalidIdentityProviderId: return E_PF_INVALID_IDENTITY_PROVIDER_ID; + case ServiceErrorCode::MisconfiguredIdentityProvider: return E_PF_MISCONFIGURED_IDENTITY_PROVIDER; + case ServiceErrorCode::InvalidScheduledTaskType: return E_PF_INVALID_SCHEDULED_TASK_TYPE; + case ServiceErrorCode::BillingInformationRequired: return E_PF_BILLING_INFORMATION_REQUIRED; + case ServiceErrorCode::LimitedEditionItemUnavailable: return E_PF_LIMITED_EDITION_ITEM_UNAVAILABLE; + case ServiceErrorCode::InvalidAdPlacementAndReward: return E_PF_INVALID_AD_PLACEMENT_AND_REWARD; + case ServiceErrorCode::AllAdPlacementViewsAlreadyConsumed: return E_PF_ALL_AD_PLACEMENT_VIEWS_ALREADY_CONSUMED; + case ServiceErrorCode::GoogleOAuthNotConfiguredForTitle: return E_PF_GOOGLE_O_AUTH_NOT_CONFIGURED_FOR_TITLE; + case ServiceErrorCode::GoogleOAuthError: return E_PF_GOOGLE_O_AUTH_ERROR; + case ServiceErrorCode::UserNotFriend: return E_PF_USER_NOT_FRIEND; + case ServiceErrorCode::InvalidSignature: return E_PF_INVALID_SIGNATURE; + case ServiceErrorCode::InvalidPublicKey: return E_PF_INVALID_PUBLIC_KEY; + case ServiceErrorCode::GoogleOAuthNoIdTokenIncludedInResponse: return E_PF_GOOGLE_O_AUTH_NO_ID_TOKEN_INCLUDED_IN_RESPONSE; + case ServiceErrorCode::StatisticUpdateInProgress: return E_PF_STATISTIC_UPDATE_IN_PROGRESS; + case ServiceErrorCode::LeaderboardVersionNotAvailable: return E_PF_LEADERBOARD_VERSION_NOT_AVAILABLE; + case ServiceErrorCode::StatisticAlreadyHasPrizeTable: return E_PF_STATISTIC_ALREADY_HAS_PRIZE_TABLE; + case ServiceErrorCode::PrizeTableHasOverlappingRanks: return E_PF_PRIZE_TABLE_HAS_OVERLAPPING_RANKS; + case ServiceErrorCode::PrizeTableHasMissingRanks: return E_PF_PRIZE_TABLE_HAS_MISSING_RANKS; + case ServiceErrorCode::PrizeTableRankStartsAtZero: return E_PF_PRIZE_TABLE_RANK_STARTS_AT_ZERO; + case ServiceErrorCode::InvalidStatistic: return E_PF_INVALID_STATISTIC; + case ServiceErrorCode::ExpressionParseFailure: return E_PF_EXPRESSION_PARSE_FAILURE; + case ServiceErrorCode::ExpressionInvokeFailure: return E_PF_EXPRESSION_INVOKE_FAILURE; + case ServiceErrorCode::ExpressionTooLong: return E_PF_EXPRESSION_TOO_LONG; + case ServiceErrorCode::DataUpdateRateExceeded: return E_PF_DATA_UPDATE_RATE_EXCEEDED; + case ServiceErrorCode::RestrictedEmailDomain: return E_PF_RESTRICTED_EMAIL_DOMAIN; + case ServiceErrorCode::EncryptionKeyDisabled: return E_PF_ENCRYPTION_KEY_DISABLED; + case ServiceErrorCode::EncryptionKeyMissing: return E_PF_ENCRYPTION_KEY_MISSING; + case ServiceErrorCode::EncryptionKeyBroken: return E_PF_ENCRYPTION_KEY_BROKEN; + case ServiceErrorCode::NoSharedSecretKeyConfigured: return E_PF_NO_SHARED_SECRET_KEY_CONFIGURED; + case ServiceErrorCode::SecretKeyNotFound: return E_PF_SECRET_KEY_NOT_FOUND; + case ServiceErrorCode::PlayerSecretAlreadyConfigured: return E_PF_PLAYER_SECRET_ALREADY_CONFIGURED; + case ServiceErrorCode::APIRequestsDisabledForTitle: return E_PF_API_REQUESTS_DISABLED_FOR_TITLE; + case ServiceErrorCode::InvalidSharedSecretKey: return E_PF_INVALID_SHARED_SECRET_KEY; + case ServiceErrorCode::PrizeTableHasNoRanks: return E_PF_PRIZE_TABLE_HAS_NO_RANKS; + case ServiceErrorCode::ProfileDoesNotExist: return E_PF_PROFILE_DOES_NOT_EXIST; + case ServiceErrorCode::ContentS3OriginBucketNotConfigured: return E_PF_CONTENT_S_3_ORIGIN_BUCKET_NOT_CONFIGURED; + case ServiceErrorCode::InvalidEnvironmentForReceipt: return E_PF_INVALID_ENVIRONMENT_FOR_RECEIPT; + case ServiceErrorCode::EncryptedRequestNotAllowed: return E_PF_ENCRYPTED_REQUEST_NOT_ALLOWED; + case ServiceErrorCode::SignedRequestNotAllowed: return E_PF_SIGNED_REQUEST_NOT_ALLOWED; + case ServiceErrorCode::RequestViewConstraintParamsNotAllowed: return E_PF_REQUEST_VIEW_CONSTRAINT_PARAMS_NOT_ALLOWED; + case ServiceErrorCode::BadPartnerConfiguration: return E_PF_BAD_PARTNER_CONFIGURATION; + case ServiceErrorCode::XboxBPCertificateFailure: return E_PF_XBOX_BP_CERTIFICATE_FAILURE; + case ServiceErrorCode::XboxXASSExchangeFailure: return E_PF_XBOX_XASS_EXCHANGE_FAILURE; + case ServiceErrorCode::InvalidEntityId: return E_PF_INVALID_ENTITY_ID; + case ServiceErrorCode::StatisticValueAggregationOverflow: return E_PF_STATISTIC_VALUE_AGGREGATION_OVERFLOW; + case ServiceErrorCode::EmailMessageFromAddressIsMissing: return E_PF_EMAIL_MESSAGE_FROM_ADDRESS_IS_MISSING; + case ServiceErrorCode::EmailMessageToAddressIsMissing: return E_PF_EMAIL_MESSAGE_TO_ADDRESS_IS_MISSING; + case ServiceErrorCode::SmtpServerAuthenticationError: return E_PF_SMTP_SERVER_AUTHENTICATION_ERROR; + case ServiceErrorCode::SmtpServerLimitExceeded: return E_PF_SMTP_SERVER_LIMIT_EXCEEDED; + case ServiceErrorCode::SmtpServerInsufficientStorage: return E_PF_SMTP_SERVER_INSUFFICIENT_STORAGE; + case ServiceErrorCode::SmtpServerCommunicationError: return E_PF_SMTP_SERVER_COMMUNICATION_ERROR; + case ServiceErrorCode::SmtpServerGeneralFailure: return E_PF_SMTP_SERVER_GENERAL_FAILURE; + case ServiceErrorCode::EmailClientTimeout: return E_PF_EMAIL_CLIENT_TIMEOUT; + case ServiceErrorCode::EmailClientCanceledTask: return E_PF_EMAIL_CLIENT_CANCELED_TASK; + case ServiceErrorCode::EmailTemplateMissing: return E_PF_EMAIL_TEMPLATE_MISSING; + case ServiceErrorCode::InvalidHostForTitleId: return E_PF_INVALID_HOST_FOR_TITLE_ID; + case ServiceErrorCode::EmailConfirmationTokenDoesNotExist: return E_PF_EMAIL_CONFIRMATION_TOKEN_DOES_NOT_EXIST; + case ServiceErrorCode::EmailConfirmationTokenExpired: return E_PF_EMAIL_CONFIRMATION_TOKEN_EXPIRED; + case ServiceErrorCode::AccountDeleted: return E_PF_ACCOUNT_DELETED; + case ServiceErrorCode::PlayerSecretNotConfigured: return E_PF_PLAYER_SECRET_NOT_CONFIGURED; + case ServiceErrorCode::InvalidSignatureTime: return E_PF_INVALID_SIGNATURE_TIME; + case ServiceErrorCode::NoContactEmailAddressFound: return E_PF_NO_CONTACT_EMAIL_ADDRESS_FOUND; + case ServiceErrorCode::InvalidAuthToken: return E_PF_INVALID_AUTH_TOKEN; + case ServiceErrorCode::AuthTokenDoesNotExist: return E_PF_AUTH_TOKEN_DOES_NOT_EXIST; + case ServiceErrorCode::AuthTokenExpired: return E_PF_AUTH_TOKEN_EXPIRED; + case ServiceErrorCode::AuthTokenAlreadyUsedToResetPassword: return E_PF_AUTH_TOKEN_ALREADY_USED_TO_RESET_PASSWORD; + case ServiceErrorCode::MembershipNameTooLong: return E_PF_MEMBERSHIP_NAME_TOO_LONG; + case ServiceErrorCode::MembershipNotFound: return E_PF_MEMBERSHIP_NOT_FOUND; + case ServiceErrorCode::GoogleServiceAccountInvalid: return E_PF_GOOGLE_SERVICE_ACCOUNT_INVALID; + case ServiceErrorCode::GoogleServiceAccountParseFailure: return E_PF_GOOGLE_SERVICE_ACCOUNT_PARSE_FAILURE; + case ServiceErrorCode::EntityTokenMissing: return E_PF_ENTITY_TOKEN_MISSING; + case ServiceErrorCode::EntityTokenInvalid: return E_PF_ENTITY_TOKEN_INVALID; + case ServiceErrorCode::EntityTokenExpired: return E_PF_ENTITY_TOKEN_EXPIRED; + case ServiceErrorCode::EntityTokenRevoked: return E_PF_ENTITY_TOKEN_REVOKED; + case ServiceErrorCode::InvalidProductForSubscription: return E_PF_INVALID_PRODUCT_FOR_SUBSCRIPTION; + case ServiceErrorCode::XboxInaccessible: return E_PF_XBOX_INACCESSIBLE; + case ServiceErrorCode::SubscriptionAlreadyTaken: return E_PF_SUBSCRIPTION_ALREADY_TAKEN; + case ServiceErrorCode::SmtpAddonNotEnabled: return E_PF_SMTP_ADDON_NOT_ENABLED; + case ServiceErrorCode::APIConcurrentRequestLimitExceeded: return E_PF_API_CONCURRENT_REQUEST_LIMIT_EXCEEDED; + case ServiceErrorCode::XboxRejectedXSTSExchangeRequest: return E_PF_XBOX_REJECTED_XSTS_EXCHANGE_REQUEST; + case ServiceErrorCode::VariableNotDefined: return E_PF_VARIABLE_NOT_DEFINED; + case ServiceErrorCode::TemplateVersionNotDefined: return E_PF_TEMPLATE_VERSION_NOT_DEFINED; + case ServiceErrorCode::FileTooLarge: return E_PF_FILE_TOO_LARGE; + case ServiceErrorCode::TitleDeleted: return E_PF_TITLE_DELETED; + case ServiceErrorCode::TitleContainsUserAccounts: return E_PF_TITLE_CONTAINS_USER_ACCOUNTS; + case ServiceErrorCode::TitleDeletionPlayerCleanupFailure: return E_PF_TITLE_DELETION_PLAYER_CLEANUP_FAILURE; + case ServiceErrorCode::EntityFileOperationPending: return E_PF_ENTITY_FILE_OPERATION_PENDING; + case ServiceErrorCode::NoEntityFileOperationPending: return E_PF_NO_ENTITY_FILE_OPERATION_PENDING; + case ServiceErrorCode::EntityProfileVersionMismatch: return E_PF_ENTITY_PROFILE_VERSION_MISMATCH; + case ServiceErrorCode::TemplateVersionTooOld: return E_PF_TEMPLATE_VERSION_TOO_OLD; + case ServiceErrorCode::MembershipDefinitionInUse: return E_PF_MEMBERSHIP_DEFINITION_IN_USE; + case ServiceErrorCode::PaymentPageNotConfigured: return E_PF_PAYMENT_PAGE_NOT_CONFIGURED; + case ServiceErrorCode::FailedLoginAttemptRateLimitExceeded: return E_PF_FAILED_LOGIN_ATTEMPT_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::EntityBlockedByGroup: return E_PF_ENTITY_BLOCKED_BY_GROUP; + case ServiceErrorCode::RoleDoesNotExist: return E_PF_ROLE_DOES_NOT_EXIST; + case ServiceErrorCode::EntityIsAlreadyMember: return E_PF_ENTITY_IS_ALREADY_MEMBER; + case ServiceErrorCode::DuplicateRoleId: return E_PF_DUPLICATE_ROLE_ID; + case ServiceErrorCode::GroupInvitationNotFound: return E_PF_GROUP_INVITATION_NOT_FOUND; + case ServiceErrorCode::GroupApplicationNotFound: return E_PF_GROUP_APPLICATION_NOT_FOUND; + case ServiceErrorCode::OutstandingInvitationAcceptedInstead: return E_PF_OUTSTANDING_INVITATION_ACCEPTED_INSTEAD; + case ServiceErrorCode::OutstandingApplicationAcceptedInstead: return E_PF_OUTSTANDING_APPLICATION_ACCEPTED_INSTEAD; + case ServiceErrorCode::RoleIsGroupDefaultMember: return E_PF_ROLE_IS_GROUP_DEFAULT_MEMBER; + case ServiceErrorCode::RoleIsGroupAdmin: return E_PF_ROLE_IS_GROUP_ADMIN; + case ServiceErrorCode::RoleNameNotAvailable: return E_PF_ROLE_NAME_NOT_AVAILABLE; + case ServiceErrorCode::GroupNameNotAvailable: return E_PF_GROUP_NAME_NOT_AVAILABLE; + case ServiceErrorCode::EmailReportAlreadySent: return E_PF_EMAIL_REPORT_ALREADY_SENT; + case ServiceErrorCode::EmailReportRecipientBlacklisted: return E_PF_EMAIL_REPORT_RECIPIENT_BLACKLISTED; + case ServiceErrorCode::EventNamespaceNotAllowed: return E_PF_EVENT_NAMESPACE_NOT_ALLOWED; + case ServiceErrorCode::EventEntityNotAllowed: return E_PF_EVENT_ENTITY_NOT_ALLOWED; + case ServiceErrorCode::InvalidEntityType: return E_PF_INVALID_ENTITY_TYPE; + case ServiceErrorCode::NullTokenResultFromAad: return E_PF_NULL_TOKEN_RESULT_FROM_AAD; + case ServiceErrorCode::InvalidTokenResultFromAad: return E_PF_INVALID_TOKEN_RESULT_FROM_AAD; + case ServiceErrorCode::NoValidCertificateForAad: return E_PF_NO_VALID_CERTIFICATE_FOR_AAD; + case ServiceErrorCode::InvalidCertificateForAad: return E_PF_INVALID_CERTIFICATE_FOR_AAD; + case ServiceErrorCode::DuplicateDropTableId: return E_PF_DUPLICATE_DROP_TABLE_ID; + case ServiceErrorCode::MultiplayerServerError: return E_PF_MULTIPLAYER_SERVER_ERROR; + case ServiceErrorCode::MultiplayerServerTooManyRequests: return E_PF_MULTIPLAYER_SERVER_TOO_MANY_REQUESTS; + case ServiceErrorCode::MultiplayerServerNoContent: return E_PF_MULTIPLAYER_SERVER_NO_CONTENT; + case ServiceErrorCode::MultiplayerServerBadRequest: return E_PF_MULTIPLAYER_SERVER_BAD_REQUEST; + case ServiceErrorCode::MultiplayerServerUnauthorized: return E_PF_MULTIPLAYER_SERVER_UNAUTHORIZED; + case ServiceErrorCode::MultiplayerServerForbidden: return E_PF_MULTIPLAYER_SERVER_FORBIDDEN; + case ServiceErrorCode::MultiplayerServerNotFound: return E_PF_MULTIPLAYER_SERVER_NOT_FOUND; + case ServiceErrorCode::MultiplayerServerConflict: return E_PF_MULTIPLAYER_SERVER_CONFLICT; + case ServiceErrorCode::MultiplayerServerInternalServerError: return E_PF_MULTIPLAYER_SERVER_INTERNAL_SERVER_ERROR; + case ServiceErrorCode::MultiplayerServerUnavailable: return E_PF_MULTIPLAYER_SERVER_UNAVAILABLE; + case ServiceErrorCode::ExplicitContentDetected: return E_PF_EXPLICIT_CONTENT_DETECTED; + case ServiceErrorCode::PIIContentDetected: return E_PF_PII_CONTENT_DETECTED; + case ServiceErrorCode::InvalidScheduledTaskParameter: return E_PF_INVALID_SCHEDULED_TASK_PARAMETER; + case ServiceErrorCode::PerEntityEventRateLimitExceeded: return E_PF_PER_ENTITY_EVENT_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::TitleDefaultLanguageNotSet: return E_PF_TITLE_DEFAULT_LANGUAGE_NOT_SET; + case ServiceErrorCode::EmailTemplateMissingDefaultVersion: return E_PF_EMAIL_TEMPLATE_MISSING_DEFAULT_VERSION; + case ServiceErrorCode::FacebookInstantGamesIdNotLinked: return E_PF_FACEBOOK_INSTANT_GAMES_ID_NOT_LINKED; + case ServiceErrorCode::InvalidFacebookInstantGamesSignature: return E_PF_INVALID_FACEBOOK_INSTANT_GAMES_SIGNATURE; + case ServiceErrorCode::FacebookInstantGamesAuthNotConfiguredForTitle: return E_PF_FACEBOOK_INSTANT_GAMES_AUTH_NOT_CONFIGURED_FOR_TITLE; + case ServiceErrorCode::EntityProfileConstraintValidationFailed: return E_PF_ENTITY_PROFILE_CONSTRAINT_VALIDATION_FAILED; + case ServiceErrorCode::TelemetryIngestionKeyPending: return E_PF_TELEMETRY_INGESTION_KEY_PENDING; + case ServiceErrorCode::TelemetryIngestionKeyNotFound: return E_PF_TELEMETRY_INGESTION_KEY_NOT_FOUND; + case ServiceErrorCode::StatisticChildNameInvalid: return E_PF_STATISTIC_CHILD_NAME_INVALID; + case ServiceErrorCode::DataIntegrityError: return E_PF_DATA_INTEGRITY_ERROR; + case ServiceErrorCode::VirtualCurrencyCannotBeSetToOlderVersion: return E_PF_VIRTUAL_CURRENCY_CANNOT_BE_SET_TO_OLDER_VERSION; + case ServiceErrorCode::VirtualCurrencyMustBeWithinIntegerRange: return E_PF_VIRTUAL_CURRENCY_MUST_BE_WITHIN_INTEGER_RANGE; + case ServiceErrorCode::EmailTemplateInvalidSyntax: return E_PF_EMAIL_TEMPLATE_INVALID_SYNTAX; + case ServiceErrorCode::EmailTemplateMissingCallback: return E_PF_EMAIL_TEMPLATE_MISSING_CALLBACK; + case ServiceErrorCode::PushNotificationTemplateInvalidPayload: return E_PF_PUSH_NOTIFICATION_TEMPLATE_INVALID_PAYLOAD; + case ServiceErrorCode::InvalidLocalizedPushNotificationLanguage: return E_PF_INVALID_LOCALIZED_PUSH_NOTIFICATION_LANGUAGE; + case ServiceErrorCode::MissingLocalizedPushNotificationMessage: return E_PF_MISSING_LOCALIZED_PUSH_NOTIFICATION_MESSAGE; + case ServiceErrorCode::PushNotificationTemplateMissingPlatformPayload: return E_PF_PUSH_NOTIFICATION_TEMPLATE_MISSING_PLATFORM_PAYLOAD; + case ServiceErrorCode::PushNotificationTemplatePayloadContainsInvalidJson: return E_PF_PUSH_NOTIFICATION_TEMPLATE_PAYLOAD_CONTAINS_INVALID_JSON; + case ServiceErrorCode::PushNotificationTemplateContainsInvalidIosPayload: return E_PF_PUSH_NOTIFICATION_TEMPLATE_CONTAINS_INVALID_IOS_PAYLOAD; + case ServiceErrorCode::PushNotificationTemplateContainsInvalidAndroidPayload: return E_PF_PUSH_NOTIFICATION_TEMPLATE_CONTAINS_INVALID_ANDROID_PAYLOAD; + case ServiceErrorCode::PushNotificationTemplateIosPayloadMissingNotificationBody: return E_PF_PUSH_NOTIFICATION_TEMPLATE_IOS_PAYLOAD_MISSING_NOTIFICATION_BODY; + case ServiceErrorCode::PushNotificationTemplateAndroidPayloadMissingNotificationBody: return E_PF_PUSH_NOTIFICATION_TEMPLATE_ANDROID_PAYLOAD_MISSING_NOTIFICATION_BODY; + case ServiceErrorCode::PushNotificationTemplateNotFound: return E_PF_PUSH_NOTIFICATION_TEMPLATE_NOT_FOUND; + case ServiceErrorCode::PushNotificationTemplateMissingDefaultVersion: return E_PF_PUSH_NOTIFICATION_TEMPLATE_MISSING_DEFAULT_VERSION; + case ServiceErrorCode::PushNotificationTemplateInvalidSyntax: return E_PF_PUSH_NOTIFICATION_TEMPLATE_INVALID_SYNTAX; + case ServiceErrorCode::PushNotificationTemplateNoCustomPayloadForV1: return E_PF_PUSH_NOTIFICATION_TEMPLATE_NO_CUSTOM_PAYLOAD_FOR_V_1; + case ServiceErrorCode::NoLeaderboardForStatistic: return E_PF_NO_LEADERBOARD_FOR_STATISTIC; + case ServiceErrorCode::TitleNewsMissingDefaultLanguage: return E_PF_TITLE_NEWS_MISSING_DEFAULT_LANGUAGE; + case ServiceErrorCode::TitleNewsNotFound: return E_PF_TITLE_NEWS_NOT_FOUND; + case ServiceErrorCode::TitleNewsDuplicateLanguage: return E_PF_TITLE_NEWS_DUPLICATE_LANGUAGE; + case ServiceErrorCode::TitleNewsMissingTitleOrBody: return E_PF_TITLE_NEWS_MISSING_TITLE_OR_BODY; + case ServiceErrorCode::TitleNewsInvalidLanguage: return E_PF_TITLE_NEWS_INVALID_LANGUAGE; + case ServiceErrorCode::EmailRecipientBlacklisted: return E_PF_EMAIL_RECIPIENT_BLACKLISTED; + case ServiceErrorCode::InvalidGameCenterAuthRequest: return E_PF_INVALID_GAME_CENTER_AUTH_REQUEST; + case ServiceErrorCode::GameCenterAuthenticationFailed: return E_PF_GAME_CENTER_AUTHENTICATION_FAILED; + case ServiceErrorCode::CannotEnablePartiesForTitle: return E_PF_CANNOT_ENABLE_PARTIES_FOR_TITLE; + case ServiceErrorCode::PartyError: return E_PF_PARTY_ERROR; + case ServiceErrorCode::PartyRequests: return E_PF_PARTY_REQUESTS; + case ServiceErrorCode::PartyNoContent: return E_PF_PARTY_NO_CONTENT; + case ServiceErrorCode::PartyBadRequest: return E_PF_PARTY_BAD_REQUEST; + case ServiceErrorCode::PartyUnauthorized: return E_PF_PARTY_UNAUTHORIZED; + case ServiceErrorCode::PartyForbidden: return E_PF_PARTY_FORBIDDEN; + case ServiceErrorCode::PartyNotFound: return E_PF_PARTY_NOT_FOUND; + case ServiceErrorCode::PartyConflict: return E_PF_PARTY_CONFLICT; + case ServiceErrorCode::PartyInternalServerError: return E_PF_PARTY_INTERNAL_SERVER_ERROR; + case ServiceErrorCode::PartyUnavailable: return E_PF_PARTY_UNAVAILABLE; + case ServiceErrorCode::PartyTooManyRequests: return E_PF_PARTY_TOO_MANY_REQUESTS; + case ServiceErrorCode::PushNotificationTemplateMissingName: return E_PF_PUSH_NOTIFICATION_TEMPLATE_MISSING_NAME; + case ServiceErrorCode::CannotEnableMultiplayerServersForTitle: return E_PF_CANNOT_ENABLE_MULTIPLAYER_SERVERS_FOR_TITLE; + case ServiceErrorCode::WriteAttemptedDuringExport: return E_PF_WRITE_ATTEMPTED_DURING_EXPORT; + case ServiceErrorCode::MultiplayerServerTitleQuotaCoresExceeded: return E_PF_MULTIPLAYER_SERVER_TITLE_QUOTA_CORES_EXCEEDED; + case ServiceErrorCode::AutomationRuleNotFound: return E_PF_AUTOMATION_RULE_NOT_FOUND; + case ServiceErrorCode::EntityAPIKeyLimitExceeded: return E_PF_ENTITY_API_KEY_LIMIT_EXCEEDED; + case ServiceErrorCode::EntityAPIKeyNotFound: return E_PF_ENTITY_API_KEY_NOT_FOUND; + case ServiceErrorCode::EntityAPIKeyOrSecretInvalid: return E_PF_ENTITY_API_KEY_OR_SECRET_INVALID; + case ServiceErrorCode::EconomyServiceUnavailable: return E_PF_ECONOMY_SERVICE_UNAVAILABLE; + case ServiceErrorCode::EconomyServiceInternalError: return E_PF_ECONOMY_SERVICE_INTERNAL_ERROR; + case ServiceErrorCode::QueryRateLimitExceeded: return E_PF_QUERY_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::EntityAPIKeyCreationDisabledForEntity: return E_PF_ENTITY_API_KEY_CREATION_DISABLED_FOR_ENTITY; + case ServiceErrorCode::ForbiddenByEntityPolicy: return E_PF_FORBIDDEN_BY_ENTITY_POLICY; + case ServiceErrorCode::UpdateInventoryRateLimitExceeded: return E_PF_UPDATE_INVENTORY_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::StudioCreationRateLimited: return E_PF_STUDIO_CREATION_RATE_LIMITED; + case ServiceErrorCode::StudioCreationInProgress: return E_PF_STUDIO_CREATION_IN_PROGRESS; + case ServiceErrorCode::DuplicateStudioName: return E_PF_DUPLICATE_STUDIO_NAME; + case ServiceErrorCode::StudioNotFound: return E_PF_STUDIO_NOT_FOUND; + case ServiceErrorCode::StudioDeleted: return E_PF_STUDIO_DELETED; + case ServiceErrorCode::StudioDeactivated: return E_PF_STUDIO_DEACTIVATED; + case ServiceErrorCode::StudioActivated: return E_PF_STUDIO_ACTIVATED; + case ServiceErrorCode::TitleCreationRateLimited: return E_PF_TITLE_CREATION_RATE_LIMITED; + case ServiceErrorCode::TitleCreationInProgress: return E_PF_TITLE_CREATION_IN_PROGRESS; + case ServiceErrorCode::DuplicateTitleName: return E_PF_DUPLICATE_TITLE_NAME; + case ServiceErrorCode::TitleActivationRateLimited: return E_PF_TITLE_ACTIVATION_RATE_LIMITED; + case ServiceErrorCode::TitleActivationInProgress: return E_PF_TITLE_ACTIVATION_IN_PROGRESS; + case ServiceErrorCode::TitleDeactivated: return E_PF_TITLE_DEACTIVATED; + case ServiceErrorCode::TitleActivated: return E_PF_TITLE_ACTIVATED; + case ServiceErrorCode::CloudScriptAzureFunctionsExecutionTimeLimitExceeded: return E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_EXECUTION_TIME_LIMIT_EXCEEDED; + case ServiceErrorCode::CloudScriptAzureFunctionsArgumentSizeExceeded: return E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_ARGUMENT_SIZE_EXCEEDED; + case ServiceErrorCode::CloudScriptAzureFunctionsReturnSizeExceeded: return E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_RETURN_SIZE_EXCEEDED; + case ServiceErrorCode::CloudScriptAzureFunctionsHTTPRequestError: return E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_HTTP_REQUEST_ERROR; + case ServiceErrorCode::VirtualCurrencyBetaGetError: return E_PF_VIRTUAL_CURRENCY_BETA_GET_ERROR; + case ServiceErrorCode::VirtualCurrencyBetaCreateError: return E_PF_VIRTUAL_CURRENCY_BETA_CREATE_ERROR; + case ServiceErrorCode::VirtualCurrencyBetaInitialDepositSaveError: return E_PF_VIRTUAL_CURRENCY_BETA_INITIAL_DEPOSIT_SAVE_ERROR; + case ServiceErrorCode::VirtualCurrencyBetaSaveError: return E_PF_VIRTUAL_CURRENCY_BETA_SAVE_ERROR; + case ServiceErrorCode::VirtualCurrencyBetaDeleteError: return E_PF_VIRTUAL_CURRENCY_BETA_DELETE_ERROR; + case ServiceErrorCode::VirtualCurrencyBetaRestoreError: return E_PF_VIRTUAL_CURRENCY_BETA_RESTORE_ERROR; + case ServiceErrorCode::VirtualCurrencyBetaSaveConflict: return E_PF_VIRTUAL_CURRENCY_BETA_SAVE_CONFLICT; + case ServiceErrorCode::VirtualCurrencyBetaUpdateError: return E_PF_VIRTUAL_CURRENCY_BETA_UPDATE_ERROR; + case ServiceErrorCode::InsightsManagementDatabaseNotFound: return E_PF_INSIGHTS_MANAGEMENT_DATABASE_NOT_FOUND; + case ServiceErrorCode::InsightsManagementOperationNotFound: return E_PF_INSIGHTS_MANAGEMENT_OPERATION_NOT_FOUND; + case ServiceErrorCode::InsightsManagementErrorPendingOperationExists: return E_PF_INSIGHTS_MANAGEMENT_ERROR_PENDING_OPERATION_EXISTS; + case ServiceErrorCode::InsightsManagementSetPerformanceLevelInvalidParameter: return E_PF_INSIGHTS_MANAGEMENT_SET_PERFORMANCE_LEVEL_INVALID_PARAMETER; + case ServiceErrorCode::InsightsManagementSetStorageRetentionInvalidParameter: return E_PF_INSIGHTS_MANAGEMENT_SET_STORAGE_RETENTION_INVALID_PARAMETER; + case ServiceErrorCode::InsightsManagementGetStorageUsageInvalidParameter: return E_PF_INSIGHTS_MANAGEMENT_GET_STORAGE_USAGE_INVALID_PARAMETER; + case ServiceErrorCode::InsightsManagementGetOperationStatusInvalidParameter: return E_PF_INSIGHTS_MANAGEMENT_GET_OPERATION_STATUS_INVALID_PARAMETER; + case ServiceErrorCode::DuplicatePurchaseTransactionId: return E_PF_DUPLICATE_PURCHASE_TRANSACTION_ID; + case ServiceErrorCode::EvaluationModePlayerCountExceeded: return E_PF_EVALUATION_MODE_PLAYER_COUNT_EXCEEDED; + case ServiceErrorCode::GetPlayersInSegmentRateLimitExceeded: return E_PF_GET_PLAYERS_IN_SEGMENT_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::CloudScriptFunctionNameSizeExceeded: return E_PF_CLOUD_SCRIPT_FUNCTION_NAME_SIZE_EXCEEDED; + case ServiceErrorCode::PaidInsightsFeaturesNotEnabled: return E_PF_PAID_INSIGHTS_FEATURES_NOT_ENABLED; + case ServiceErrorCode::CloudScriptAzureFunctionsQueueRequestError: return E_PF_CLOUD_SCRIPT_AZURE_FUNCTIONS_QUEUE_REQUEST_ERROR; + case ServiceErrorCode::EvaluationModeTitleCountExceeded: return E_PF_EVALUATION_MODE_TITLE_COUNT_EXCEEDED; + case ServiceErrorCode::InsightsManagementTitleNotInFlight: return E_PF_INSIGHTS_MANAGEMENT_TITLE_NOT_IN_FLIGHT; + case ServiceErrorCode::LimitNotFound: return E_PF_LIMIT_NOT_FOUND; + case ServiceErrorCode::LimitNotAvailableViaAPI: return E_PF_LIMIT_NOT_AVAILABLE_VIA_API; + case ServiceErrorCode::InsightsManagementSetStorageRetentionBelowMinimum: return E_PF_INSIGHTS_MANAGEMENT_SET_STORAGE_RETENTION_BELOW_MINIMUM; + case ServiceErrorCode::InsightsManagementSetStorageRetentionAboveMaximum: return E_PF_INSIGHTS_MANAGEMENT_SET_STORAGE_RETENTION_ABOVE_MAXIMUM; + case ServiceErrorCode::AppleNotEnabledForTitle: return E_PF_APPLE_NOT_ENABLED_FOR_TITLE; + case ServiceErrorCode::InsightsManagementNewActiveEventExportLimitInvalid: return E_PF_INSIGHTS_MANAGEMENT_NEW_ACTIVE_EVENT_EXPORT_LIMIT_INVALID; + case ServiceErrorCode::InsightsManagementSetPerformanceRateLimited: return E_PF_INSIGHTS_MANAGEMENT_SET_PERFORMANCE_RATE_LIMITED; + case ServiceErrorCode::PartyRequestsThrottledFromRateLimiter: return E_PF_PARTY_REQUESTS_THROTTLED_FROM_RATE_LIMITER; + case ServiceErrorCode::XboxServiceTooManyRequests: return E_PF_XBOX_SERVICE_TOO_MANY_REQUESTS; + case ServiceErrorCode::NintendoSwitchNotEnabledForTitle: return E_PF_NINTENDO_SWITCH_NOT_ENABLED_FOR_TITLE; + case ServiceErrorCode::RequestMultiplayerServersThrottledFromRateLimiter: return E_PF_REQUEST_MULTIPLAYER_SERVERS_THROTTLED_FROM_RATE_LIMITER; + case ServiceErrorCode::TitleDataOverrideNotFound: return E_PF_TITLE_DATA_OVERRIDE_NOT_FOUND; + case ServiceErrorCode::DuplicateKeys: return E_PF_DUPLICATE_KEYS; + case ServiceErrorCode::WasNotCreatedWithCloudRoot: return E_PF_WAS_NOT_CREATED_WITH_CLOUD_ROOT; + case ServiceErrorCode::LegacyMultiplayerServersDeprecated: return E_PF_LEGACY_MULTIPLAYER_SERVERS_DEPRECATED; + case ServiceErrorCode::VirtualCurrencyCurrentlyUnavailable: return E_PF_VIRTUAL_CURRENCY_CURRENTLY_UNAVAILABLE; + case ServiceErrorCode::SteamUserNotFound: return E_PF_STEAM_USER_NOT_FOUND; + case ServiceErrorCode::ElasticSearchOperationFailed: return E_PF_ELASTIC_SEARCH_OPERATION_FAILED; + case ServiceErrorCode::NotImplemented: return E_PF_NOT_IMPLEMENTED; + case ServiceErrorCode::PublisherNotFound: return E_PF_PUBLISHER_NOT_FOUND; + case ServiceErrorCode::PublisherDeleted: return E_PF_PUBLISHER_DELETED; + case ServiceErrorCode::ApiDisabledForMigration: return E_PF_API_DISABLED_FOR_MIGRATION; + case ServiceErrorCode::ResourceNameUpdateNotAllowed: return E_PF_RESOURCE_NAME_UPDATE_NOT_ALLOWED; + case ServiceErrorCode::ApiNotEnabledForTitle: return E_PF_API_NOT_ENABLED_FOR_TITLE; + case ServiceErrorCode::DuplicateTitleNameForPublisher: return E_PF_DUPLICATE_TITLE_NAME_FOR_PUBLISHER; + case ServiceErrorCode::AzureTitleCreationInProgress: return E_PF_AZURE_TITLE_CREATION_IN_PROGRESS; + case ServiceErrorCode::TitleConstraintsPublisherDeletion: return E_PF_TITLE_CONSTRAINTS_PUBLISHER_DELETION; + case ServiceErrorCode::InvalidPlayerAccountPoolId: return E_PF_INVALID_PLAYER_ACCOUNT_POOL_ID; + case ServiceErrorCode::PlayerAccountPoolNotFound: return E_PF_PLAYER_ACCOUNT_POOL_NOT_FOUND; + case ServiceErrorCode::PlayerAccountPoolDeleted: return E_PF_PLAYER_ACCOUNT_POOL_DELETED; + case ServiceErrorCode::TitleCleanupInProgress: return E_PF_TITLE_CLEANUP_IN_PROGRESS; + case ServiceErrorCode::AzureResourceConcurrentOperationInProgress: return E_PF_AZURE_RESOURCE_CONCURRENT_OPERATION_IN_PROGRESS; + case ServiceErrorCode::TitlePublisherUpdateNotAllowed: return E_PF_TITLE_PUBLISHER_UPDATE_NOT_ALLOWED; + case ServiceErrorCode::AzureResourceManagerNotSupportedInStamp: return E_PF_AZURE_RESOURCE_MANAGER_NOT_SUPPORTED_IN_STAMP; + case ServiceErrorCode::ApiNotIncludedInAzurePlayFabFeatureSet: return E_PF_API_NOT_INCLUDED_IN_AZURE_PLAY_FAB_FEATURE_SET; + case ServiceErrorCode::GoogleServiceAccountFailedAuth: return E_PF_GOOGLE_SERVICE_ACCOUNT_FAILED_AUTH; + case ServiceErrorCode::GoogleAPIServiceUnavailable: return E_PF_GOOGLE_API_SERVICE_UNAVAILABLE; + case ServiceErrorCode::GoogleAPIServiceUnknownError: return E_PF_GOOGLE_API_SERVICE_UNKNOWN_ERROR; + case ServiceErrorCode::NoValidIdentityForAad: return E_PF_NO_VALID_IDENTITY_FOR_AAD; + case ServiceErrorCode::PlayerIdentityLinkNotFound: return E_PF_PLAYER_IDENTITY_LINK_NOT_FOUND; + case ServiceErrorCode::PhotonApplicationIdAlreadyInUse: return E_PF_PHOTON_APPLICATION_ID_ALREADY_IN_USE; + case ServiceErrorCode::CloudScriptUnableToDeleteProductionRevision: return E_PF_CLOUD_SCRIPT_UNABLE_TO_DELETE_PRODUCTION_REVISION; + case ServiceErrorCode::CustomIdNotFound: return E_PF_CUSTOM_ID_NOT_FOUND; + case ServiceErrorCode::AutomationInvalidInput: return E_PF_AUTOMATION_INVALID_INPUT; + case ServiceErrorCode::AutomationInvalidRuleName: return E_PF_AUTOMATION_INVALID_RULE_NAME; + case ServiceErrorCode::AutomationRuleAlreadyExists: return E_PF_AUTOMATION_RULE_ALREADY_EXISTS; + case ServiceErrorCode::AutomationRuleLimitExceeded: return E_PF_AUTOMATION_RULE_LIMIT_EXCEEDED; + case ServiceErrorCode::InvalidGooglePlayGamesServerAuthCode: return E_PF_INVALID_GOOGLE_PLAY_GAMES_SERVER_AUTH_CODE; + case ServiceErrorCode::PlayStreamConnectionFailed: return E_PF_PLAY_STREAM_CONNECTION_FAILED; + case ServiceErrorCode::InvalidEventContents: return E_PF_INVALID_EVENT_CONTENTS; + case ServiceErrorCode::InsightsV1Deprecated: return E_PF_INSIGHTS_V_1_DEPRECATED; + case ServiceErrorCode::AnalysisSubscriptionNotFound: return E_PF_ANALYSIS_SUBSCRIPTION_NOT_FOUND; + case ServiceErrorCode::AnalysisSubscriptionFailed: return E_PF_ANALYSIS_SUBSCRIPTION_FAILED; + case ServiceErrorCode::AnalysisSubscriptionFoundAlready: return E_PF_ANALYSIS_SUBSCRIPTION_FOUND_ALREADY; + case ServiceErrorCode::AnalysisSubscriptionManagementInvalidInput: return E_PF_ANALYSIS_SUBSCRIPTION_MANAGEMENT_INVALID_INPUT; + case ServiceErrorCode::InvalidGameCenterId: return E_PF_INVALID_GAME_CENTER_ID; + case ServiceErrorCode::InvalidNintendoSwitchAccountId: return E_PF_INVALID_NINTENDO_SWITCH_ACCOUNT_ID; + case ServiceErrorCode::EntityAPIKeysNotSupported: return E_PF_ENTITY_API_KEYS_NOT_SUPPORTED; + case ServiceErrorCode::IpAddressBanned: return E_PF_IP_ADDRESS_BANNED; + case ServiceErrorCode::EntityLineageBanned: return E_PF_ENTITY_LINEAGE_BANNED; + case ServiceErrorCode::NamespaceMismatch: return E_PF_NAMESPACE_MISMATCH; + case ServiceErrorCode::InvalidServiceConfiguration: return E_PF_INVALID_SERVICE_CONFIGURATION; + case ServiceErrorCode::InvalidNamespaceMismatch: return E_PF_INVALID_NAMESPACE_MISMATCH; + case ServiceErrorCode::MatchmakingEntityInvalid: return E_PF_MATCHMAKING_ENTITY_INVALID; + case ServiceErrorCode::MatchmakingPlayerAttributesInvalid: return E_PF_MATCHMAKING_PLAYER_ATTRIBUTES_INVALID; + case ServiceErrorCode::MatchmakingQueueNotFound: return E_PF_MATCHMAKING_QUEUE_NOT_FOUND; + case ServiceErrorCode::MatchmakingMatchNotFound: return E_PF_MATCHMAKING_MATCH_NOT_FOUND; + case ServiceErrorCode::MatchmakingTicketNotFound: return E_PF_MATCHMAKING_TICKET_NOT_FOUND; + case ServiceErrorCode::MatchmakingAlreadyJoinedTicket: return E_PF_MATCHMAKING_ALREADY_JOINED_TICKET; + case ServiceErrorCode::MatchmakingTicketAlreadyCompleted: return E_PF_MATCHMAKING_TICKET_ALREADY_COMPLETED; + case ServiceErrorCode::MatchmakingQueueConfigInvalid: return E_PF_MATCHMAKING_QUEUE_CONFIG_INVALID; + case ServiceErrorCode::MatchmakingMemberProfileInvalid: return E_PF_MATCHMAKING_MEMBER_PROFILE_INVALID; + case ServiceErrorCode::NintendoSwitchDeviceIdNotLinked: return E_PF_NINTENDO_SWITCH_DEVICE_ID_NOT_LINKED; + case ServiceErrorCode::MatchmakingNotEnabled: return E_PF_MATCHMAKING_NOT_ENABLED; + case ServiceErrorCode::MatchmakingPlayerAttributesTooLarge: return E_PF_MATCHMAKING_PLAYER_ATTRIBUTES_TOO_LARGE; + case ServiceErrorCode::MatchmakingNumberOfPlayersInTicketTooLarge: return E_PF_MATCHMAKING_NUMBER_OF_PLAYERS_IN_TICKET_TOO_LARGE; + case ServiceErrorCode::MatchmakingAttributeInvalid: return E_PF_MATCHMAKING_ATTRIBUTE_INVALID; + case ServiceErrorCode::MatchmakingPlayerHasNotJoinedTicket: return E_PF_MATCHMAKING_PLAYER_HAS_NOT_JOINED_TICKET; + case ServiceErrorCode::MatchmakingRateLimitExceeded: return E_PF_MATCHMAKING_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::MatchmakingTicketMembershipLimitExceeded: return E_PF_MATCHMAKING_TICKET_MEMBERSHIP_LIMIT_EXCEEDED; + case ServiceErrorCode::MatchmakingUnauthorized: return E_PF_MATCHMAKING_UNAUTHORIZED; + case ServiceErrorCode::MatchmakingQueueLimitExceeded: return E_PF_MATCHMAKING_QUEUE_LIMIT_EXCEEDED; + case ServiceErrorCode::MatchmakingRequestTypeMismatch: return E_PF_MATCHMAKING_REQUEST_TYPE_MISMATCH; + case ServiceErrorCode::MatchmakingBadRequest: return E_PF_MATCHMAKING_BAD_REQUEST; + case ServiceErrorCode::PubSubFeatureNotEnabledForTitle: return E_PF_PUB_SUB_FEATURE_NOT_ENABLED_FOR_TITLE; + case ServiceErrorCode::PubSubTooManyRequests: return E_PF_PUB_SUB_TOO_MANY_REQUESTS; + case ServiceErrorCode::PubSubConnectionNotFoundForEntity: return E_PF_PUB_SUB_CONNECTION_NOT_FOUND_FOR_ENTITY; + case ServiceErrorCode::PubSubConnectionHandleInvalid: return E_PF_PUB_SUB_CONNECTION_HANDLE_INVALID; + case ServiceErrorCode::PubSubSubscriptionLimitExceeded: return E_PF_PUB_SUB_SUBSCRIPTION_LIMIT_EXCEEDED; + case ServiceErrorCode::TitleConfigNotFound: return E_PF_TITLE_CONFIG_NOT_FOUND; + case ServiceErrorCode::TitleConfigUpdateConflict: return E_PF_TITLE_CONFIG_UPDATE_CONFLICT; + case ServiceErrorCode::TitleConfigSerializationError: return E_PF_TITLE_CONFIG_SERIALIZATION_ERROR; + case ServiceErrorCode::CatalogApiNotImplemented: return E_PF_CATALOG_API_NOT_IMPLEMENTED; + case ServiceErrorCode::CatalogEntityInvalid: return E_PF_CATALOG_ENTITY_INVALID; + case ServiceErrorCode::CatalogTitleIdMissing: return E_PF_CATALOG_TITLE_ID_MISSING; + case ServiceErrorCode::CatalogPlayerIdMissing: return E_PF_CATALOG_PLAYER_ID_MISSING; + case ServiceErrorCode::CatalogClientIdentityInvalid: return E_PF_CATALOG_CLIENT_IDENTITY_INVALID; + case ServiceErrorCode::CatalogOneOrMoreFilesInvalid: return E_PF_CATALOG_ONE_OR_MORE_FILES_INVALID; + case ServiceErrorCode::CatalogItemMetadataInvalid: return E_PF_CATALOG_ITEM_METADATA_INVALID; + case ServiceErrorCode::CatalogItemIdInvalid: return E_PF_CATALOG_ITEM_ID_INVALID; + case ServiceErrorCode::CatalogSearchParameterInvalid: return E_PF_CATALOG_SEARCH_PARAMETER_INVALID; + case ServiceErrorCode::CatalogFeatureDisabled: return E_PF_CATALOG_FEATURE_DISABLED; + case ServiceErrorCode::CatalogConfigInvalid: return E_PF_CATALOG_CONFIG_INVALID; + case ServiceErrorCode::CatalogItemTypeInvalid: return E_PF_CATALOG_ITEM_TYPE_INVALID; + case ServiceErrorCode::CatalogBadRequest: return E_PF_CATALOG_BAD_REQUEST; + case ServiceErrorCode::CatalogTooManyRequests: return E_PF_CATALOG_TOO_MANY_REQUESTS; + case ServiceErrorCode::ExportInvalidStatusUpdate: return E_PF_EXPORT_INVALID_STATUS_UPDATE; + case ServiceErrorCode::ExportInvalidPrefix: return E_PF_EXPORT_INVALID_PREFIX; + case ServiceErrorCode::ExportBlobContainerDoesNotExist: return E_PF_EXPORT_BLOB_CONTAINER_DOES_NOT_EXIST; + case ServiceErrorCode::ExportNotFound: return E_PF_EXPORT_NOT_FOUND; + case ServiceErrorCode::ExportCouldNotUpdate: return E_PF_EXPORT_COULD_NOT_UPDATE; + case ServiceErrorCode::ExportInvalidStorageType: return E_PF_EXPORT_INVALID_STORAGE_TYPE; + case ServiceErrorCode::ExportAmazonBucketDoesNotExist: return E_PF_EXPORT_AMAZON_BUCKET_DOES_NOT_EXIST; + case ServiceErrorCode::ExportInvalidBlobStorage: return E_PF_EXPORT_INVALID_BLOB_STORAGE; + case ServiceErrorCode::ExportKustoException: return E_PF_EXPORT_KUSTO_EXCEPTION; + case ServiceErrorCode::ExportKustoConnectionFailed: return E_PF_EXPORT_KUSTO_CONNECTION_FAILED; + case ServiceErrorCode::ExportUnknownError: return E_PF_EXPORT_UNKNOWN_ERROR; + case ServiceErrorCode::ExportCantEditPendingExport: return E_PF_EXPORT_CANT_EDIT_PENDING_EXPORT; + case ServiceErrorCode::ExportLimitExports: return E_PF_EXPORT_LIMIT_EXPORTS; + case ServiceErrorCode::ExportLimitEvents: return E_PF_EXPORT_LIMIT_EVENTS; + case ServiceErrorCode::ExportInvalidPartitionStatusModification: return E_PF_EXPORT_INVALID_PARTITION_STATUS_MODIFICATION; + case ServiceErrorCode::ExportCouldNotCreate: return E_PF_EXPORT_COULD_NOT_CREATE; + case ServiceErrorCode::ExportNoBackingDatabaseFound: return E_PF_EXPORT_NO_BACKING_DATABASE_FOUND; + case ServiceErrorCode::ExportCouldNotDelete: return E_PF_EXPORT_COULD_NOT_DELETE; + case ServiceErrorCode::ExportCannotDetermineEventQuery: return E_PF_EXPORT_CANNOT_DETERMINE_EVENT_QUERY; + case ServiceErrorCode::ExportInvalidQuerySchemaModification: return E_PF_EXPORT_INVALID_QUERY_SCHEMA_MODIFICATION; + case ServiceErrorCode::ExportQuerySchemaMissingRequiredColumns: return E_PF_EXPORT_QUERY_SCHEMA_MISSING_REQUIRED_COLUMNS; + case ServiceErrorCode::ExportCannotParseQuery: return E_PF_EXPORT_CANNOT_PARSE_QUERY; + case ServiceErrorCode::ExportControlCommandsNotAllowed: return E_PF_EXPORT_CONTROL_COMMANDS_NOT_ALLOWED; + case ServiceErrorCode::ExportQueryMissingTableReference: return E_PF_EXPORT_QUERY_MISSING_TABLE_REFERENCE; + case ServiceErrorCode::ExportInsightsV1Deprecated: return E_PF_EXPORT_INSIGHTS_V_1_DEPRECATED; + case ServiceErrorCode::ExplorerBasicInvalidQueryName: return E_PF_EXPLORER_BASIC_INVALID_QUERY_NAME; + case ServiceErrorCode::ExplorerBasicInvalidQueryDescription: return E_PF_EXPLORER_BASIC_INVALID_QUERY_DESCRIPTION; + case ServiceErrorCode::ExplorerBasicInvalidQueryConditions: return E_PF_EXPLORER_BASIC_INVALID_QUERY_CONDITIONS; + case ServiceErrorCode::ExplorerBasicInvalidQueryStartDate: return E_PF_EXPLORER_BASIC_INVALID_QUERY_START_DATE; + case ServiceErrorCode::ExplorerBasicInvalidQueryEndDate: return E_PF_EXPLORER_BASIC_INVALID_QUERY_END_DATE; + case ServiceErrorCode::ExplorerBasicInvalidQueryGroupBy: return E_PF_EXPLORER_BASIC_INVALID_QUERY_GROUP_BY; + case ServiceErrorCode::ExplorerBasicInvalidQueryAggregateType: return E_PF_EXPLORER_BASIC_INVALID_QUERY_AGGREGATE_TYPE; + case ServiceErrorCode::ExplorerBasicInvalidQueryAggregateProperty: return E_PF_EXPLORER_BASIC_INVALID_QUERY_AGGREGATE_PROPERTY; + case ServiceErrorCode::ExplorerBasicLoadQueriesError: return E_PF_EXPLORER_BASIC_LOAD_QUERIES_ERROR; + case ServiceErrorCode::ExplorerBasicLoadQueryError: return E_PF_EXPLORER_BASIC_LOAD_QUERY_ERROR; + case ServiceErrorCode::ExplorerBasicCreateQueryError: return E_PF_EXPLORER_BASIC_CREATE_QUERY_ERROR; + case ServiceErrorCode::ExplorerBasicDeleteQueryError: return E_PF_EXPLORER_BASIC_DELETE_QUERY_ERROR; + case ServiceErrorCode::ExplorerBasicUpdateQueryError: return E_PF_EXPLORER_BASIC_UPDATE_QUERY_ERROR; + case ServiceErrorCode::ExplorerBasicSavedQueriesLimit: return E_PF_EXPLORER_BASIC_SAVED_QUERIES_LIMIT; + case ServiceErrorCode::ExplorerBasicSavedQueryNotFound: return E_PF_EXPLORER_BASIC_SAVED_QUERY_NOT_FOUND; + case ServiceErrorCode::TenantShardMapperShardNotFound: return E_PF_TENANT_SHARD_MAPPER_SHARD_NOT_FOUND; + case ServiceErrorCode::TitleNotEnabledForParty: return E_PF_TITLE_NOT_ENABLED_FOR_PARTY; + case ServiceErrorCode::PartyVersionNotFound: return E_PF_PARTY_VERSION_NOT_FOUND; + case ServiceErrorCode::MultiplayerServerBuildReferencedByMatchmakingQueue: return E_PF_MULTIPLAYER_SERVER_BUILD_REFERENCED_BY_MATCHMAKING_QUEUE; + case ServiceErrorCode::MultiplayerServerBuildReferencedByBuildAlias: return E_PF_MULTIPLAYER_SERVER_BUILD_REFERENCED_BY_BUILD_ALIAS; + case ServiceErrorCode::MultiplayerServerBuildAliasReferencedByMatchmakingQueue: return E_PF_MULTIPLAYER_SERVER_BUILD_ALIAS_REFERENCED_BY_MATCHMAKING_QUEUE; + case ServiceErrorCode::PartySerializationError: return E_PF_PARTY_SERIALIZATION_ERROR; + case ServiceErrorCode::ExperimentationExperimentStopped: return E_PF_EXPERIMENTATION_EXPERIMENT_STOPPED; + case ServiceErrorCode::ExperimentationExperimentRunning: return E_PF_EXPERIMENTATION_EXPERIMENT_RUNNING; + case ServiceErrorCode::ExperimentationExperimentNotFound: return E_PF_EXPERIMENTATION_EXPERIMENT_NOT_FOUND; + case ServiceErrorCode::ExperimentationExperimentNeverStarted: return E_PF_EXPERIMENTATION_EXPERIMENT_NEVER_STARTED; + case ServiceErrorCode::ExperimentationExperimentDeleted: return E_PF_EXPERIMENTATION_EXPERIMENT_DELETED; + case ServiceErrorCode::ExperimentationClientTimeout: return E_PF_EXPERIMENTATION_CLIENT_TIMEOUT; + case ServiceErrorCode::ExperimentationInvalidVariantConfiguration: return E_PF_EXPERIMENTATION_INVALID_VARIANT_CONFIGURATION; + case ServiceErrorCode::ExperimentationInvalidVariableConfiguration: return E_PF_EXPERIMENTATION_INVALID_VARIABLE_CONFIGURATION; + case ServiceErrorCode::ExperimentInvalidId: return E_PF_EXPERIMENT_INVALID_ID; + case ServiceErrorCode::ExperimentationNoScorecard: return E_PF_EXPERIMENTATION_NO_SCORECARD; + case ServiceErrorCode::ExperimentationTreatmentAssignmentFailed: return E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_FAILED; + case ServiceErrorCode::ExperimentationTreatmentAssignmentDisabled: return E_PF_EXPERIMENTATION_TREATMENT_ASSIGNMENT_DISABLED; + case ServiceErrorCode::ExperimentationInvalidDuration: return E_PF_EXPERIMENTATION_INVALID_DURATION; + case ServiceErrorCode::ExperimentationMaxExperimentsReached: return E_PF_EXPERIMENTATION_MAX_EXPERIMENTS_REACHED; + case ServiceErrorCode::ExperimentationExperimentSchedulingInProgress: return E_PF_EXPERIMENTATION_EXPERIMENT_SCHEDULING_IN_PROGRESS; + case ServiceErrorCode::ExperimentationInvalidEndDate: return E_PF_EXPERIMENTATION_INVALID_END_DATE; + case ServiceErrorCode::ExperimentationInvalidStartDate: return E_PF_EXPERIMENTATION_INVALID_START_DATE; + case ServiceErrorCode::ExperimentationMaxDurationExceeded: return E_PF_EXPERIMENTATION_MAX_DURATION_EXCEEDED; + case ServiceErrorCode::ExperimentationExclusionGroupNotFound: return E_PF_EXPERIMENTATION_EXCLUSION_GROUP_NOT_FOUND; + case ServiceErrorCode::ExperimentationExclusionGroupInsufficientCapacity: return E_PF_EXPERIMENTATION_EXCLUSION_GROUP_INSUFFICIENT_CAPACITY; + case ServiceErrorCode::ExperimentationExclusionGroupCannotDelete: return E_PF_EXPERIMENTATION_EXCLUSION_GROUP_CANNOT_DELETE; + case ServiceErrorCode::ExperimentationExclusionGroupInvalidTrafficAllocation: return E_PF_EXPERIMENTATION_EXCLUSION_GROUP_INVALID_TRAFFIC_ALLOCATION; + case ServiceErrorCode::ExperimentationExclusionGroupInvalidName: return E_PF_EXPERIMENTATION_EXCLUSION_GROUP_INVALID_NAME; + case ServiceErrorCode::MaxActionDepthExceeded: return E_PF_MAX_ACTION_DEPTH_EXCEEDED; + case ServiceErrorCode::TitleNotOnUpdatedPricingPlan: return E_PF_TITLE_NOT_ON_UPDATED_PRICING_PLAN; + case ServiceErrorCode::SegmentManagementTitleNotInFlight: return E_PF_SEGMENT_MANAGEMENT_TITLE_NOT_IN_FLIGHT; + case ServiceErrorCode::SegmentManagementNoExpressionTree: return E_PF_SEGMENT_MANAGEMENT_NO_EXPRESSION_TREE; + case ServiceErrorCode::SegmentManagementTriggerActionCountOverLimit: return E_PF_SEGMENT_MANAGEMENT_TRIGGER_ACTION_COUNT_OVER_LIMIT; + case ServiceErrorCode::SegmentManagementSegmentCountOverLimit: return E_PF_SEGMENT_MANAGEMENT_SEGMENT_COUNT_OVER_LIMIT; + case ServiceErrorCode::SegmentManagementInvalidSegmentId: return E_PF_SEGMENT_MANAGEMENT_INVALID_SEGMENT_ID; + case ServiceErrorCode::SegmentManagementInvalidInput: return E_PF_SEGMENT_MANAGEMENT_INVALID_INPUT; + case ServiceErrorCode::SegmentManagementInvalidSegmentName: return E_PF_SEGMENT_MANAGEMENT_INVALID_SEGMENT_NAME; + case ServiceErrorCode::DeleteSegmentRateLimitExceeded: return E_PF_DELETE_SEGMENT_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::CreateSegmentRateLimitExceeded: return E_PF_CREATE_SEGMENT_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::UpdateSegmentRateLimitExceeded: return E_PF_UPDATE_SEGMENT_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::GetSegmentsRateLimitExceeded: return E_PF_GET_SEGMENTS_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::AsyncExportNotInFlight: return E_PF_ASYNC_EXPORT_NOT_IN_FLIGHT; + case ServiceErrorCode::AsyncExportNotFound: return E_PF_ASYNC_EXPORT_NOT_FOUND; + case ServiceErrorCode::AsyncExportRateLimitExceeded: return E_PF_ASYNC_EXPORT_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::AnalyticsSegmentCountOverLimit: return E_PF_ANALYTICS_SEGMENT_COUNT_OVER_LIMIT; + case ServiceErrorCode::SnapshotNotFound: return E_PF_SNAPSHOT_NOT_FOUND; + case ServiceErrorCode::InventoryApiNotImplemented: return E_PF_INVENTORY_API_NOT_IMPLEMENTED; + case ServiceErrorCode::LobbyDoesNotExist: return E_PF_LOBBY_DOES_NOT_EXIST; + case ServiceErrorCode::LobbyRateLimitExceeded: return E_PF_LOBBY_RATE_LIMIT_EXCEEDED; + case ServiceErrorCode::LobbyPlayerAlreadyJoined: return E_PF_LOBBY_PLAYER_ALREADY_JOINED; + case ServiceErrorCode::LobbyNotJoinable: return E_PF_LOBBY_NOT_JOINABLE; + case ServiceErrorCode::LobbyMemberCannotRejoin: return E_PF_LOBBY_MEMBER_CANNOT_REJOIN; + case ServiceErrorCode::LobbyCurrentPlayersMoreThanMaxPlayers: return E_PF_LOBBY_CURRENT_PLAYERS_MORE_THAN_MAX_PLAYERS; + case ServiceErrorCode::LobbyPlayerNotPresent: return E_PF_LOBBY_PLAYER_NOT_PRESENT; + case ServiceErrorCode::LobbyBadRequest: return E_PF_LOBBY_BAD_REQUEST; + case ServiceErrorCode::LobbyPlayerMaxLobbyLimitExceeded: return E_PF_LOBBY_PLAYER_MAX_LOBBY_LIMIT_EXCEEDED; + case ServiceErrorCode::LobbyNewOwnerMustBeConnected: return E_PF_LOBBY_NEW_OWNER_MUST_BE_CONNECTED; + case ServiceErrorCode::LobbyCurrentOwnerStillConnected: return E_PF_LOBBY_CURRENT_OWNER_STILL_CONNECTED; + case ServiceErrorCode::LobbyMemberIsNotOwner: return E_PF_LOBBY_MEMBER_IS_NOT_OWNER; + case ServiceErrorCode::EventSamplingInvalidRatio: return E_PF_EVENT_SAMPLING_INVALID_RATIO; + case ServiceErrorCode::EventSamplingInvalidEventNamespace: return E_PF_EVENT_SAMPLING_INVALID_EVENT_NAMESPACE; + case ServiceErrorCode::EventSamplingInvalidEventName: return E_PF_EVENT_SAMPLING_INVALID_EVENT_NAME; + case ServiceErrorCode::EventSamplingRatioNotFound: return E_PF_EVENT_SAMPLING_RATIO_NOT_FOUND; + case ServiceErrorCode::TelemetryKeyNotFound: return E_PF_TELEMETRY_KEY_NOT_FOUND; + case ServiceErrorCode::TelemetryKeyInvalidName: return E_PF_TELEMETRY_KEY_INVALID_NAME; + case ServiceErrorCode::TelemetryKeyAlreadyExists: return E_PF_TELEMETRY_KEY_ALREADY_EXISTS; + case ServiceErrorCode::TelemetryKeyInvalid: return E_PF_TELEMETRY_KEY_INVALID; + case ServiceErrorCode::TelemetryKeyCountOverLimit: return E_PF_TELEMETRY_KEY_COUNT_OVER_LIMIT; + case ServiceErrorCode::TelemetryKeyDeactivated: return E_PF_TELEMETRY_KEY_DEACTIVATED; + case ServiceErrorCode::TelemetryKeyLongInsightsRetentionNotAllowed: return E_PF_TELEMETRY_KEY_LONG_INSIGHTS_RETENTION_NOT_ALLOWED; + case ServiceErrorCode::EventSinkConnectionInvalid: return E_PF_EVENT_SINK_CONNECTION_INVALID; + case ServiceErrorCode::EventSinkConnectionUnauthorized: return E_PF_EVENT_SINK_CONNECTION_UNAUTHORIZED; + case ServiceErrorCode::EventSinkRegionInvalid: return E_PF_EVENT_SINK_REGION_INVALID; + case ServiceErrorCode::EventSinkLimitExceeded: return E_PF_EVENT_SINK_LIMIT_EXCEEDED; + case ServiceErrorCode::EventSinkSasTokenInvalid: return E_PF_EVENT_SINK_SAS_TOKEN_INVALID; + case ServiceErrorCode::EventSinkNotFound: return E_PF_EVENT_SINK_NOT_FOUND; + case ServiceErrorCode::EventSinkNameInvalid: return E_PF_EVENT_SINK_NAME_INVALID; + case ServiceErrorCode::EventSinkSasTokenPermissionInvalid: return E_PF_EVENT_SINK_SAS_TOKEN_PERMISSION_INVALID; + case ServiceErrorCode::EventSinkSecretInvalid: return E_PF_EVENT_SINK_SECRET_INVALID; + case ServiceErrorCode::EventSinkTenantNotFound: return E_PF_EVENT_SINK_TENANT_NOT_FOUND; + case ServiceErrorCode::EventSinkAadNotFound: return E_PF_EVENT_SINK_AAD_NOT_FOUND; + case ServiceErrorCode::EventSinkDatabaseNotFound: return E_PF_EVENT_SINK_DATABASE_NOT_FOUND; + case ServiceErrorCode::OperationCanceled: return E_PF_OPERATION_CANCELED; + case ServiceErrorCode::InvalidDisplayNameRandomSuffixLength: return E_PF_INVALID_DISPLAY_NAME_RANDOM_SUFFIX_LENGTH; + case ServiceErrorCode::AllowNonUniquePlayerDisplayNamesDisableNotAllowed: return E_PF_ALLOW_NON_UNIQUE_PLAYER_DISPLAY_NAMES_DISABLE_NOT_ALLOWED; + case ServiceErrorCode::PartitionedEventInvalid: return E_PF_PARTITIONED_EVENT_INVALID; + case ServiceErrorCode::PartitionedEventCountOverLimit: return E_PF_PARTITIONED_EVENT_COUNT_OVER_LIMIT; + case ServiceErrorCode::PlayerCustomPropertiesPropertyNameTooLong: return E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_NAME_TOO_LONG; + case ServiceErrorCode::PlayerCustomPropertiesPropertyNameIsInvalid: return E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_NAME_IS_INVALID; + case ServiceErrorCode::PlayerCustomPropertiesStringPropertyValueTooLong: return E_PF_PLAYER_CUSTOM_PROPERTIES_STRING_PROPERTY_VALUE_TOO_LONG; + case ServiceErrorCode::PlayerCustomPropertiesValueIsInvalidType: return E_PF_PLAYER_CUSTOM_PROPERTIES_VALUE_IS_INVALID_TYPE; + case ServiceErrorCode::PlayerCustomPropertiesVersionMismatch: return E_PF_PLAYER_CUSTOM_PROPERTIES_VERSION_MISMATCH; + case ServiceErrorCode::PlayerCustomPropertiesPropertyCountTooHigh: return E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_COUNT_TOO_HIGH; + case ServiceErrorCode::PlayerCustomPropertiesDuplicatePropertyName: return E_PF_PLAYER_CUSTOM_PROPERTIES_DUPLICATE_PROPERTY_NAME; + case ServiceErrorCode::PlayerCustomPropertiesPropertyDoesNotExist: return E_PF_PLAYER_CUSTOM_PROPERTIES_PROPERTY_DOES_NOT_EXIST; + case ServiceErrorCode::AddonAlreadyExists: return E_PF_ADDON_ALREADY_EXISTS; + case ServiceErrorCode::AddonDoesntExist: return E_PF_ADDON_DOESNT_EXIST; + default: return E_PF_UNKNOWN_ERROR; + } +} + +#define MAKE_HTTP_HRESULT(httpStatus) MAKE_HRESULT(1, 0x019, httpStatus) + +HRESULT HttpStatusToHR(uint32_t httpStatus) +{ + // 2xx are http success codes + if (httpStatus >= 200 && httpStatus < 300) + { + return S_OK; + } + else if (httpStatus == 1223) + { + // MSXML XHR bug: get_status() returns HTTP/1223 for HTTP/204: + // http://blogs.msdn.com/b/ieinternals/archive/2009/07/23/the-ie8-native-xmlhttprequest-object.aspx + // treat it as success code as well + return S_OK; + } + else + { + switch (httpStatus) + { + case 300: return HTTP_E_STATUS_AMBIGUOUS; + case 301: return HTTP_E_STATUS_MOVED; + case 302: return HTTP_E_STATUS_REDIRECT; + case 303: return HTTP_E_STATUS_REDIRECT_METHOD; + case 304: return HTTP_E_STATUS_NOT_MODIFIED; + case 305: return HTTP_E_STATUS_USE_PROXY; + case 306: return HTTP_E_STATUS_REDIRECT_KEEP_VERB; + + case 400: return HTTP_E_STATUS_BAD_REQUEST; + case 401: return HTTP_E_STATUS_DENIED; + case 402: return HTTP_E_STATUS_PAYMENT_REQ; + case 403: return HTTP_E_STATUS_FORBIDDEN; + case 404: return HTTP_E_STATUS_NOT_FOUND; + case 405: return HTTP_E_STATUS_BAD_METHOD; + case 406: return HTTP_E_STATUS_NONE_ACCEPTABLE; + case 407: return HTTP_E_STATUS_PROXY_AUTH_REQ; + case 408: return HTTP_E_STATUS_REQUEST_TIMEOUT; + case 409: return HTTP_E_STATUS_CONFLICT; + case 410: return HTTP_E_STATUS_GONE; + case 411: return HTTP_E_STATUS_LENGTH_REQUIRED; + case 412: return HTTP_E_STATUS_PRECOND_FAILED; + case 413: return HTTP_E_STATUS_REQUEST_TOO_LARGE; + case 414: return HTTP_E_STATUS_URI_TOO_LONG; + case 415: return HTTP_E_STATUS_UNSUPPORTED_MEDIA; + case 416: return HTTP_E_STATUS_RANGE_NOT_SATISFIABLE; + case 417: return HTTP_E_STATUS_EXPECTATION_FAILED; + case 421: return MAKE_HTTP_HRESULT(421); // Misdirected request + case 422: return MAKE_HTTP_HRESULT(422); // Unprocessable entity + case 423: return MAKE_HTTP_HRESULT(423); // Locked + case 424: return MAKE_HTTP_HRESULT(424); // Failed dependency + case 426: return MAKE_HTTP_HRESULT(426); // Upgrade required + case 428: return MAKE_HTTP_HRESULT(428); // Precondition required + case 429: return MAKE_HTTP_HRESULT(429); // Too many requests + case 431: return MAKE_HTTP_HRESULT(431); // Request header fields too large + case 449: return MAKE_HTTP_HRESULT(449); // Retry with + case 451: return MAKE_HTTP_HRESULT(451); // Unavailable for legal reasons + + case 500: return HTTP_E_STATUS_SERVER_ERROR; + case 501: return HTTP_E_STATUS_NOT_SUPPORTED; + case 502: return HTTP_E_STATUS_BAD_GATEWAY; + case 503: return HTTP_E_STATUS_SERVICE_UNAVAIL; + case 504: return HTTP_E_STATUS_GATEWAY_TIMEOUT; + case 505: return HTTP_E_STATUS_VERSION_NOT_SUP; + case 506: return MAKE_HTTP_HRESULT(506); // Variant also negotiates + case 507: return MAKE_HTTP_HRESULT(507); // Insufficient storage + case 508: return MAKE_HTTP_HRESULT(508); // Loop detected + case 510: return MAKE_HTTP_HRESULT(510); // Not extended + case 511: return MAKE_HTTP_HRESULT(511); // Network authentication required + + default: return HTTP_E_STATUS_UNEXPECTED; + } + } +} + +HRESULT CurrentExceptionToHR() +{ + try + { + throw; + } + // std exceptions + catch (const std::bad_alloc&) // is an exception + { + return E_OUTOFMEMORY; + } + catch (const std::bad_cast&) // is an exception + { + return E_NOINTERFACE; + } + catch (const std::invalid_argument&) // is a logic_error + { + return E_INVALIDARG; + } + catch (const std::out_of_range&) // is a logic_error + { + return E_BOUNDS; + } + catch (const std::length_error&) // is a logic_error + { + return __HRESULT_FROM_WIN32(ERROR_BAD_LENGTH); + } + catch (const std::overflow_error&) // is a runtime_error + { + return __HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + } + catch (const std::underflow_error&) // is a runtime_error + { + return __HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + } + catch (const std::range_error&) // is a runtime_error + { + return E_BOUNDS; + } + catch (const std::system_error& ex) // is a runtime_error + { + if (ex.code().category() == std::system_category()) + { + return __HRESULT_FROM_WIN32(ex.code().value()); + } + else + { + return ex.code().value(); + } + } + catch (const std::logic_error&) // is an exception + { + return E_UNEXPECTED; + } + catch (const std::runtime_error&) // is an exception + { + return E_FAIL; + } + catch (const std::exception&) // base class for standard C++ exceptions + { + return E_FAIL; + } + catch (HRESULT exceptionHR) + { + return exceptionHR; + } + catch (...) // everything else + { + return E_FAIL; + } +} + +} diff --git a/Source/PlayFabSharedInternal/Source/HttpRequest.cpp b/Source/PlayFabSharedInternal/Source/HttpRequest.cpp new file mode 100644 index 0000000..e8b6be3 --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/HttpRequest.cpp @@ -0,0 +1,242 @@ +#include "pch.h" +#include "HttpRequest.h" +#include "JsonUtils.h" +#include "SdkVersion.h" + +namespace PlayFab +{ + +ServiceResponse::ServiceResponse(const ServiceResponse& src) : + HttpCode{ src.HttpCode }, + HttpStatus{ src.HttpStatus }, + ErrorCode{ src.ErrorCode }, + ErrorName{ src.ErrorName }, + ErrorMessage{ src.ErrorMessage }, + RequestId{ src.RequestId } +{ + JsonUtils::FromJson(src.ErrorDetails, ErrorDetails); + JsonUtils::FromJson(src.Data, Data); +} + +ServiceResponse& ServiceResponse::operator=(const ServiceResponse& src) +{ + HttpCode = src.HttpCode; + HttpStatus = src.HttpStatus; + ErrorCode = src.ErrorCode; + ErrorName = src.ErrorName; + ErrorMessage = src.ErrorMessage; + JsonUtils::FromJson(src.ErrorDetails, ErrorDetails); + JsonUtils::FromJson(src.Data, Data); + RequestId = src.RequestId; + return *this; +} + +HRESULT ServiceResponse::FromJson(const JsonValue& input) +{ + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "code", HttpCode)); + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "status", HttpStatus)); + std::optional errorCode{}; + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "errorCode", errorCode)); + if (errorCode.has_value()) + { + ErrorCode = static_cast(*errorCode); + } + else + { + ErrorCode = ServiceErrorCode::Success; + } + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "error", ErrorName)); + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "errorMessage", ErrorMessage)); + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "errorDetails", ErrorDetails)); + RETURN_IF_FAILED(JsonUtils::ObjectGetMember(input, "data", Data)); + + return S_OK; +} + +HCHttpCall::HCHttpCall( + String method, + String url, + UnorderedMap headers, + String requestBody, + PlayFab::RunContext runContext +) noexcept : + XAsyncOperation{ std::move(runContext) }, + m_method{ std::move(method) }, + m_url{ std::move(url) }, + m_headers{ std::move(headers) }, + m_requestBody{ std::move(requestBody) } +{ +} + +HCHttpCall::HCHttpCall( + String method, + String url, + UnorderedMap headers, + String requestBody, + uint32_t retryCacheId, + PFHttpRetrySettings const& retrySettings, + PlayFab::RunContext runContext +) noexcept : + XAsyncOperation{ std::move(runContext) }, + m_method{ std::move(method) }, + m_url{ std::move(url) }, + m_headers{ std::move(headers) }, + m_requestBody{ std::move(requestBody) }, + m_retryCacheId{ retryCacheId }, + m_retryAllowed{ retrySettings.allowRetry }, + m_retryDelay{ retrySettings.minimumRetryDelayInSeconds }, + m_timeoutWindow{ retrySettings.timeoutWindowInSeconds } +{ +} + +HCHttpCall::~HCHttpCall() noexcept +{ + if (m_callHandle) + { + PFHCHttpCallCloseHandle(m_callHandle); + } +} + +void HCHttpCall::SetHeader(String headerName, String headerValue) noexcept +{ + m_headers[std::move(headerName)] = std::move(headerValue); +} + +HRESULT HCHttpCall::OnStarted(XAsyncBlock* async) noexcept +{ + // Set up HCHttpCallHandle + RETURN_IF_FAILED(PFHCHttpCallCreate(&m_callHandle)); + RETURN_IF_FAILED(PFHCHttpCallRequestSetUrl(m_callHandle, m_method.data(), m_url.data())); + RETURN_IF_FAILED(PFHCHttpCallResponseSetResponseBodyWriteFunction(m_callHandle, HCHttpCall::HCResponseBodyWrite, this)); + + // Add default PlayFab headers + RETURN_IF_FAILED(PFHCHttpCallRequestSetHeader(m_callHandle, "Accept", "application/json", true)); + RETURN_IF_FAILED(PFHCHttpCallRequestSetHeader(m_callHandle, "Content-Type", "application/json; charset=utf-8", true)); + RETURN_IF_FAILED(PFHCHttpCallRequestSetHeader(m_callHandle, "X-ReportErrorAsSuccess", "true", true)); + + // Configure retries + RETURN_IF_FAILED(PFHCHttpCallRequestSetRetryAllowed(m_callHandle, m_retryAllowed)); + RETURN_IF_FAILED(PFHCHttpCallRequestSetRetryDelay(m_callHandle, m_retryDelay)); + RETURN_IF_FAILED(PFHCHttpCallRequestSetTimeoutWindow(m_callHandle, m_timeoutWindow)); + + // Add additional version string header + Stringstream sdkFullVer; + sdkFullVer << versionString << sdkVersion; + String strFullVerStr = sdkFullVer.str(); + RETURN_IF_FAILED(PFHCHttpCallRequestSetHeader(m_callHandle, kSDKVersionStringHeaderName, strFullVerStr.c_str(), true)); + + Stringstream sdkUserAgent; + sdkUserAgent << userAgent << sdkVersion; + String sdkUserAgentStr = sdkUserAgent.str(); + RETURN_IF_FAILED(PFHCHttpCallRequestSetHeader(m_callHandle, kSDKUserAgentHeader, sdkUserAgentStr.c_str(), true)); + + for (const auto& pair : m_headers) + { + if (!pair.first.empty() && !pair.second.empty()) + { + RETURN_IF_FAILED(PFHCHttpCallRequestSetHeader(m_callHandle, pair.first.data(), pair.second.data(), true)); + } + } + + if (!m_requestBody.empty()) + { + RETURN_IF_FAILED(PFHCHttpCallRequestSetRequestBodyReadFunction(m_callHandle, HCHttpCall::HCRequestBodyRead, m_requestBody.size(), this)); + } + + if (m_retryCacheId.has_value()) + { + RETURN_IF_FAILED(PFHCHttpCallRequestSetRetryCacheId(m_callHandle, *m_retryCacheId)); + } + + return PFHCHttpCallPerformAsync(m_callHandle, async); +} + +Result HCHttpCall::GetResult(XAsyncBlock* async) noexcept +{ + // By design XAsyncBlock should succeed for HttpCall Perform + RETURN_IF_FAILED(XAsyncGetStatus(async, false)); + + // Try to parse the response body no matter what. PlayFab often returns a response body even + // on failure and they can provide more details about what went wrong. If we are unable to parse the response + // body correctly, fall back to returning the Http status code. + + // Ensure response is null terminated before treating as a string + m_responseBody.push_back(0); + + JsonDocument responseJson{ &JsonUtils::allocator, JsonUtils::kDefaultStackCapacity, &JsonUtils::allocator }; + responseJson.Parse(m_responseBody.data()); + if (responseJson.HasParseError()) + { + // Couldn't parse response body, fall back to Http status code + uint32_t httpCode{ 0 }; + RETURN_IF_FAILED(PFHCHttpCallResponseGetStatusCode(m_callHandle, &httpCode)); + RETURN_IF_FAILED(HttpStatusToHR(httpCode)); + + // This is an unusal case. We weren't able to parse the response body, but the Http status code indicates that the + // call was successful. Return the Json parse error in this case. + Stringstream errorMessage; + errorMessage << "Failed to parse PlayFab service response: " << rapidjson::GetParseError_En(responseJson.GetParseError()); + TRACE_ERROR(errorMessage.str().data()); + + return Result{ E_FAIL, errorMessage.str() }; + } + + // Successful response from service (doesn't always indicate the call was successful, just that the service responded successfully) + ServiceResponse response{}; + response.FromJson(responseJson); + + // Get requestId response header + const char* requestId; + RETURN_IF_FAILED(PFHCHttpCallResponseGetHeader(m_callHandle, "X-RequestId", &requestId)); + + if (requestId) + { + response.RequestId = requestId; + } + + return response; +} + +HRESULT HCHttpCall::HCRequestBodyRead( + _In_ PFHCCallHandle callHandle, + _In_ size_t offset, + _In_ size_t bytesAvailable, + _In_opt_ void* context, + _Out_writes_bytes_to_(bytesAvailable, *bytesWritten) uint8_t* destination, + _Out_ size_t* bytesWritten +) +{ + UNREFERENCED_PARAMETER(callHandle); + + assert(destination); + assert(bytesAvailable > 0); + assert(bytesWritten); + + auto call{ static_cast(context) }; // non-owning + assert(offset < call->m_requestBody.size()); + + *bytesWritten = std::min(bytesAvailable, call->m_requestBody.size() - offset); + std::memcpy(destination, call->m_requestBody.data() + offset, *bytesWritten); + + return S_OK; +} + +HRESULT HCHttpCall::HCResponseBodyWrite( + _In_ PFHCCallHandle callHandle, + _In_reads_bytes_(bytesAvailable) const uint8_t* source, + _In_ size_t bytesAvailable, + _In_opt_ void* context +) +{ + UNREFERENCED_PARAMETER(callHandle); + + assert(source); + assert(bytesAvailable > 0); + + auto call{ static_cast(context) }; // non-owning + call->m_responseBody.insert(call->m_responseBody.end(), source, source + bytesAvailable); + + return S_OK; +} + +} diff --git a/Source/PlayFabSharedInternal/Source/JsonUtils.cpp b/Source/PlayFabSharedInternal/Source/JsonUtils.cpp new file mode 100644 index 0000000..57987ec --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/JsonUtils.cpp @@ -0,0 +1,488 @@ +#include "pch.h" +#include "JsonUtils.h" +#include "BaseModel.h" + +namespace PlayFab +{ +namespace JsonUtils +{ + +JsonAllocator allocator{}; + +// Helper class for writing JsonValue directly into a PlayFab::String. Implements rapidjson write-only stream +// concept (see rapidjson/stream.h for details). Avoids additional copy needed when first writing to rapidjson::StringBuffer +class StringOutputStream +{ +public: + using Ch = String::traits_type::char_type; + + StringOutputStream(size_t initialCapacity = kDefaultCapacity) + { + m_string.reserve(initialCapacity); + } + + void Put(Ch c) + { + m_string.push_back(c); + } + + void Flush() + { + // no-op + } + + const String& GetString() const + { + return m_string; + } + + String&& ExtractString() + { + return std::move(m_string); + } + + static const size_t kDefaultCapacity = 256; // use same default capacity as rapidjson::GenericStringBuffer + +private: + String m_string; +}; + +String WriteToString(const JsonValue& jsonValue) +{ + StringOutputStream stream; + JsonWriter writer{ stream, &allocator }; + jsonValue.Accept(writer); + return stream.ExtractString(); +} + +JsonValue ToJson(const char* string) +{ + if (!string) + { + return JsonValue{ rapidjson::kNullType }; + } + return JsonValue{ string, allocator }; +} + +JsonValue ToJson(const String& string) +{ + // By design, map empty string to null JsonValue + if (string.empty()) + { + return JsonValue{ rapidjson::kNullType }; + } + return JsonValue{ string.data(), allocator }; +} + +JsonValue ToJson(const PFJsonObject& jsonObject) +{ + // By design, map empty jsonObject to null JsonValue + if (!jsonObject.stringValue) + { + return JsonValue{ rapidjson::kNullType }; + } + JsonDocument document{ &JsonUtils::allocator, JsonUtils::kDefaultStackCapacity, &JsonUtils::allocator }; + document.Parse(jsonObject.stringValue); + return JsonValue{ document, allocator }; +} + +JsonValue ToJsonTime(time_t value) +{ + return JsonValue{ TimeTToIso8601String(value).data(), allocator }; +} + +JsonValue ToJson(const InputModel& value) +{ + return value.ToJson(); +} + +HRESULT FromJson(const JsonValue& input, String& output) +{ + if (!input.IsString()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = input.GetString(); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, bool& output) +{ + if (!input.IsBool()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = input.GetBool(); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, int16_t& output) +{ + if (!input.IsInt()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = static_cast(input.GetInt()); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, uint16_t& output) +{ + if (!input.IsUint()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = static_cast(input.GetUint()); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, int32_t& output) +{ + if (!input.IsInt()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = static_cast(input.GetInt()); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, uint32_t& output) +{ + if (!input.IsUint()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = static_cast(input.GetUint()); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, int64_t& output) +{ + if (!input.IsInt64()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = input.GetInt64(); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, uint64_t& output) +{ + if (!input.IsUint64()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = input.GetUint64(); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, float& output) +{ + if (!input.IsFloat()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = input.GetFloat(); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, double& output) +{ + if (!input.IsDouble()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = input.GetDouble(); + return S_OK; +} + +HRESULT FromJsonTime(const JsonValue& input, time_t& output) +{ + if (!input.IsString()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output = Iso8601StringToTimeT(input.GetString()); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, JsonObject& output) +{ + if (!input.IsObject()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + output.stringValue = JsonUtils::WriteToString(input); + return S_OK; +} + +HRESULT FromJson(const JsonValue& input, JsonValue& output) +{ + output.CopyFrom(input, allocator); // Deep copy + return S_OK; +} + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue&& name, JsonValue&& value) +{ + if (!jsonObject.IsObject()) + { + TRACE_ERROR("Json Error: cannot add member to non-object"); + return E_FAIL; + } + jsonObject.AddMember(name, value, allocator); + return S_OK; +} + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, JsonValue&& value) +{ + return ObjectAddMember(jsonObject, JsonValue{ name }, std::move(value)); +} + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const JsonValue& value) +{ + return ObjectAddMember(jsonObject, name, std::move(JsonValue{}.CopyFrom(value, allocator))); +} + +HRESULT ObjectAddMember(JsonValue& jsonObject, JsonValue::StringRefType name, const String& value) +{ + return ObjectAddMember(jsonObject, name, ToJson(value)); +} + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, time_t value) +{ + return ObjectAddMember(jsonObject, name, ToJsonTime(value)); +} + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const std::optional& value) +{ + if (value.has_value()) + { + return ObjectAddMember(jsonObject, name, ToJsonTime(*value)); + } + else + { + return ObjectAddMember(jsonObject, name, JsonValue{ rapidjson::kNullType }); + } +} + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const time_t* value) +{ + if (value != nullptr) + { + return ObjectAddMember(jsonObject, name, ToJsonTime(*value)); + } + else + { + return ObjectAddMember(jsonObject, name, JsonValue{ rapidjson::kNullType }); + } +} + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const time_t* array, uint32_t arrayCount) +{ + JsonValue member{ rapidjson::kArrayType }; + for (auto i = 0u; i < arrayCount; ++i) + { + member.PushBack(ToJsonTime(array[i]), allocator); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +HRESULT ObjectAddMemberTime(JsonValue& jsonObject, JsonValue::StringRefType name, const PFDateTimeDictionaryEntry* associativeArray, uint32_t arrayCount) +{ + JsonValue member{ rapidjson::kObjectType }; + for (auto i = 0u; i < arrayCount; ++i) + { + auto& entry{ associativeArray[i] }; + RETURN_IF_FAILED(ObjectAddMember(member, ToJson(entry.key), ToJsonTime(entry.value))); + } + return ObjectAddMember(jsonObject, name, std::move(member)); +} + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, JsonValue& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.SetNull(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + RETURN_IF_FAILED(FromJson(findResult.Payload()->value, output)); + } + return S_OK; +} + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, String& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + RETURN_IF_FAILED(FromJson(findResult.Payload()->value, output)); + } + return S_OK; +} + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, JsonObject& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.stringValue.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + RETURN_IF_FAILED(FromJson(findResult.Payload()->value, output)); + } + return S_OK; +} + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, CStringVector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsArray()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto jsonArray{ findResult.Payload()->value.GetArray() }; + output.reserve(jsonArray.Size()); + for (auto& value : jsonArray) + { + String stringValue; + RETURN_IF_FAILED(FromJson(value, stringValue)); + output.push_back(std::move(stringValue)); + } + } + return S_OK; +} + +HRESULT ObjectGetMember(const JsonValue& jsonObject, const char* name, StringDictionaryEntryVector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsObject()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto memberObject{ findResult.Payload()->value.GetObj()}; + output.reserve(memberObject.MemberCount()); + for (auto& pair : memberObject) + { + String stringValue{}; + RETURN_IF_FAILED(FromJson(pair.value, stringValue)); + output.insert_or_assign(pair.name.GetString(), std::move(stringValue)); + } + } + return S_OK; +} + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, time_t& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + if (findResult.Payload() == jsonObject.MemberEnd()) + { + TRACE_ERROR("Json Parse Error: object missing non-optional member \"%s\"", name); + return E_FAIL; + } + return FromJsonTime(findResult.Payload()->value, output); +} + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, std::optional& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.reset(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + output.emplace(); + RETURN_IF_FAILED(FromJsonTime(findResult.Payload()->value, *output)); + } + return S_OK; +} + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, Vector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsArray()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto jsonArray{ findResult.Payload()->value.GetArray() }; + output.reserve(jsonArray.Size()); + for (auto& value : jsonArray) + { + output.emplace_back(); + RETURN_IF_FAILED(FromJsonTime(value, output.back())); + } + } + return S_OK; +} + +HRESULT ObjectGetMemberTime(const JsonValue& jsonObject, const char* name, DictionaryEntryVector& output) +{ + auto findResult = Detail::ObjectFindMember(jsonObject, name); + RETURN_IF_FAILED(findResult.hr); + output.clear(); + if (findResult.Payload() != jsonObject.MemberEnd()) + { + if (!findResult.Payload()->value.IsObject()) + { + TRACE_ERROR("Json Parse Error: unexpected token"); + return E_FAIL; + } + + auto memberObject{ findResult.Payload()->value.GetObj() }; + output.reserve(memberObject.MemberCount()); + for (auto& pair : memberObject) + { + time_t value{}; + RETURN_IF_FAILED(FromJsonTime(pair.value, value)); + output.insert_or_assign(pair.name.GetString(), value); + } + } + return S_OK; +} + +namespace Detail +{ + +Result ObjectFindMember(const JsonValue& jsonObject, const char* name) +{ + if (!jsonObject.IsObject()) + { + TRACE_ERROR("Json Parse Error: cannot get member from a JsonValue that isn't an object"); + return E_FAIL; + } + return jsonObject.FindMember(name); +} + +} // namespace Detail +} // namespace JsonUtils +} // namespace PlayFab diff --git a/Source/PlayFabSharedInternal/Source/Memory.cpp b/Source/PlayFabSharedInternal/Source/Memory.cpp new file mode 100644 index 0000000..e44ed61 --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/Memory.cpp @@ -0,0 +1,96 @@ +#include "pch.h" +#include "Memory.h" + +namespace PlayFab +{ + +// Default memory functions +_Ret_maybenull_ _Post_writable_byte_size_(size) void* DefaultAlloc(size_t size) noexcept +{ + if (size > 0) + { + return std::malloc(size); + } + return static_cast(nullptr); +} + +void DefaultFree(_In_ _Post_invalid_ void* pointer) noexcept +{ + if (pointer) + { + std::free(pointer); + } +} + +PFMemoryHooks& GetMemoryHooks() +{ + // The memory hooks are a function level static so we have guarantees about initialization order. If we make them a + // global static, the initialization of other globals that require allocation may cause a crash + static PFMemoryHooks s_hooks{ DefaultAlloc, DefaultFree }; + return s_hooks; +} + +HRESULT SetMemoryHooks(PFMemoryHooks& newHooks) +{ + auto& hooks = GetMemoryHooks(); + + if (newHooks.alloc && newHooks.free) + { + hooks = newHooks; + } + else if (!newHooks.alloc && !newHooks.free) + { + hooks.alloc = DefaultAlloc; + hooks.free = DefaultFree; + } + else + { + // Hooks must be set together + return E_INVALIDARG; + } + + return S_OK; +} + +void* Alloc(size_t size) +{ + void* pointer = GetMemoryHooks().alloc(size); + if (size != 0) // RapidJson for example will request 0 size alloc during parsing of "Variants":[] and expects to get nullptr back + { + assert(pointer); + } + + return pointer; +} + +void Free(void* pointer) noexcept +{ + if (pointer) + { + GetMemoryHooks().free(pointer); + } +} + +void* JsonAllocator::Malloc(size_t size) +{ + return PlayFab::Alloc(size); +} + +void* JsonAllocator::Realloc(void* originalPtr, size_t originalSize, size_t newSize) +{ + void* newPtr = nullptr; + if (newSize > 0) + { + newPtr = PlayFab::Alloc(newSize); + memcpy(newPtr, originalPtr, (originalSize < newSize ? originalSize : newSize)); + } + Free(originalPtr); + return newPtr; +} + +void JsonAllocator::Free(void* ptr) +{ + PlayFab::Free(ptr); +} + +} diff --git a/Source/PlayFabSharedInternal/Source/ModelBuffer.cpp b/Source/PlayFabSharedInternal/Source/ModelBuffer.cpp new file mode 100644 index 0000000..92b3511 --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/ModelBuffer.cpp @@ -0,0 +1,100 @@ +#include "pch.h" +#include "ModelBuffer.h" + +namespace PlayFab +{ + +ModelBuffer::ModelBuffer(void* buffer, size_t bufferSize) : +#if _DEBUG + m_buffer{ static_cast(buffer) }, + m_bufferSize{ bufferSize }, +#endif + m_bufferPtr{ buffer }, + m_remaining{ bufferSize } +{ +} + +size_t ModelBuffer::RemainingSpace() const +{ + return m_remaining; +} + +Result ModelBuffer::CopyTo(const char* input) +{ + if (input) + { + // Alloc + size_t bytesNeeded = std::strlen(input) + 1; // null terminator + auto allocResult = Alloc(bytesNeeded); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); +#if HC_PLATFORM_IS_MICROSOFT + auto error = strcpy_s(outputPtr, bytesNeeded, input); + RETURN_HR_IF(E_FAIL, error); + + return outputPtr; +#else + return std::strcpy(outputPtr, input); +#endif + } + else + { + // Nothing to copy + return nullptr; + } +} + +Result ModelBuffer::CopyToArray(const char* const* input, size_t inputCount) +{ + if (input && inputCount) + { + // Alloc + auto allocResult = Alloc(inputCount); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + for (size_t i = 0; i < inputCount; ++i) + { + auto copyResult = this->CopyTo(input[i]); + RETURN_IF_FAILED(copyResult.hr); + outputPtr[i] = copyResult.ExtractPayload(); + } + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +Result ModelBuffer::CopyToDictionary(PFStringDictionaryEntry const* input, size_t inputCount) +{ + if (input && inputCount) + { + // Alloc + auto allocResult = Alloc(inputCount); + RETURN_IF_FAILED(allocResult.hr); + // Copy + auto outputPtr = allocResult.ExtractPayload(); + for (size_t i = 0; i < inputCount; ++i) + { + auto copyKeyResult = this->CopyTo(input[i].key); + RETURN_IF_FAILED(copyKeyResult.hr); + outputPtr[i].key = copyKeyResult.ExtractPayload(); + + auto copyValueResult = this->CopyTo(input[i].value); + RETURN_IF_FAILED(copyValueResult.hr); + outputPtr[i].value = copyValueResult.ExtractPayload(); + } + return outputPtr; + } + else + { + // Nothing to copy + return nullptr; + } +} + +} diff --git a/Source/PlayFabSharedInternal/Source/RunContext.cpp b/Source/PlayFabSharedInternal/Source/RunContext.cpp new file mode 100644 index 0000000..e8f5805 --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/RunContext.cpp @@ -0,0 +1,542 @@ +#include "pch.h" +#include "RunContext.h" + +namespace PlayFab +{ + +static std::atomic g_nextId{ 0 }; + +// RAII wrapper of XTaskQueueHandle +class TaskQueue +{ +public: + // The only queues we should use internally should be derived from another Queue. We don't want to directly + // submit work to a client owned queue because we will terminate queues during cleanup. + TaskQueue DeriveWorkQueue() const noexcept; + static TaskQueue DeriveWorkQueue(XTaskQueueHandle handle) noexcept; + + TaskQueue(XTaskQueueHandle handle) noexcept; // Takes ownership of handle + TaskQueue(const TaskQueue& other) noexcept = delete; + TaskQueue(TaskQueue&& other) noexcept; + TaskQueue& operator=(TaskQueue const& other) noexcept = delete; + TaskQueue& operator=(TaskQueue&& other) noexcept = delete; + ~TaskQueue() noexcept; + + XTaskQueueHandle Handle() const noexcept; + +private: + XTaskQueueHandle m_handle{ nullptr }; +}; + +class RunContextState : public ITerminable, public ITerminationListener, public std::enable_shared_from_this +{ +public: + static SharedPtr Root(XTaskQueueHandle queueHandle) noexcept; + SharedPtr Derive() noexcept; + SharedPtr DeriveOnQueue(XTaskQueueHandle queueHandle) noexcept; + + RunContextState(TaskQueue&& queue, PlayFab::CancellationToken&& ct, SharedPtr parent) noexcept; + RunContextState(RunContextState const&) noexcept = delete; + RunContextState(RunContextState&&) noexcept = delete; + RunContextState& operator=(RunContextState const&) noexcept = delete; + RunContextState& operator=(RunContextState&&) noexcept = delete; + ~RunContextState() noexcept; + +public: + XTaskQueueHandle TaskQueueHandle() const noexcept; + void TaskQueueSubmitCallback(XTaskQueuePort port, SharedPtr work, uint32_t delayInMs) noexcept; + void TaskQueueTerminate() noexcept; + + PlayFab::CancellationToken CancellationToken() const noexcept; + + bool RegisterTerminableAndCheck(ITerminable& terminable) noexcept; + bool UnregisterTerminableAndCheck(ITerminable& terminable) noexcept; + + void Terminate(ITerminationListener& listener, void* context) override; + +private: + void AppendChild(SharedPtr child) noexcept; + + // ITerminationListener + void OnTerminated(void* context) noexcept override; + + // XTaskQueue callbacks + static void CALLBACK TaskQueueCallback(void* context, bool cancelled) noexcept; + static void CALLBACK TaskQueueTerminated(void* context) noexcept; + + static void CheckTerminationAndNotifyListener(SharedPtr runContext, std::unique_lock lock) noexcept; + + std::mutex m_mutex; + std::recursive_mutex m_terminationMutex; + TaskQueue const m_queue; + PlayFab::CancellationToken m_cancellationToken; + SharedPtr m_parent; + Vector> m_children; + Vector m_terminables; // non-owning + size_t m_pendingTaskQueueCallbacks{ 0 }; + bool m_terminated{ false }; + ITerminationListener* m_terminationListener{ nullptr }; // non-owning + void* m_terminationListenerContext{ nullptr }; + size_t m_pendingTerminations{ 0 }; + bool m_queueTerminated{ false }; + + // For debugging purposes only + uint32_t m_id; + uint32_t m_depth; +}; + +//------------------------------------------------------------------------------ +// TaskQueue +//------------------------------------------------------------------------------ + +TaskQueue::TaskQueue(XTaskQueueHandle handle) noexcept : + m_handle{ handle } +{ + assert(handle); +} + +TaskQueue::TaskQueue(TaskQueue&& other) noexcept : + m_handle{ other.m_handle } +{ + other.m_handle = nullptr; +} + + +TaskQueue::~TaskQueue() noexcept +{ + if (m_handle) + { + XTaskQueueCloseHandle(m_handle); + } +} + +TaskQueue TaskQueue::DeriveWorkQueue() const noexcept +{ + return DeriveWorkQueue(m_handle); +} + +TaskQueue TaskQueue::DeriveWorkQueue(XTaskQueueHandle handle) noexcept +{ + std::optional processQueue{}; // We will derive from process queue if handle is null + if (!handle) + { + bool haveProcessQueue = XTaskQueueGetCurrentProcessTaskQueue(&handle); + if (haveProcessQueue) + { + // Wrap process queue handle so that it gets closed + processQueue.emplace(handle); + } + else + { + // Fatal situation + TRACE_ERROR("Client provided null XTaskQueueHandle and no default process queue is available"); + assert(false); + } + } + + XTaskQueuePortHandle workPort{ nullptr }; + HRESULT hr = XTaskQueueGetPort(handle, XTaskQueuePort::Work, &workPort); + if (FAILED(hr)) + { + TRACE_ERROR_HR(hr, "Failed to get work port from queue"); + assert(false); // handle this + } + + XTaskQueueHandle derivedHandle{ nullptr }; + hr = XTaskQueueCreateComposite(workPort, workPort, &derivedHandle); + if (FAILED(hr)) + { + TRACE_ERROR_HR(hr, "Failed to create composite queue"); + assert(false); + } + + return TaskQueue{ derivedHandle }; +} + +XTaskQueueHandle TaskQueue::Handle() const noexcept +{ + return m_handle; +} + +//------------------------------------------------------------------------------ +// RunContextState +//------------------------------------------------------------------------------ + +RunContextState::RunContextState(TaskQueue&& q, PlayFab::CancellationToken&& ct, SharedPtr parent) noexcept : + m_queue{ std::move(q) }, + m_cancellationToken{ std::move(ct) }, + m_parent{ std::move(parent) }, + m_id{ g_nextId++ }, + m_depth{ m_parent ? m_parent->m_depth + 1 : 0 } +{ +} + +RunContextState::~RunContextState() noexcept +{ + TRACE_VERBOSE("RunContextState[id=%u]::~RunContextState", m_id); +} + +SharedPtr RunContextState::Root(XTaskQueueHandle queueHandle) noexcept +{ + return MakeShared(TaskQueue::DeriveWorkQueue(queueHandle), CancellationToken::Root(), nullptr); +} + +SharedPtr RunContextState::Derive() noexcept +{ + SharedPtr derived = MakeShared(m_queue.DeriveWorkQueue(), m_cancellationToken.Derive(), shared_from_this()); + AppendChild(derived); + return derived; +} + +SharedPtr RunContextState::DeriveOnQueue(XTaskQueueHandle queueHandle) noexcept +{ + SharedPtr derived = MakeShared(TaskQueue::DeriveWorkQueue(queueHandle), m_cancellationToken.Derive(), shared_from_this()); + AppendChild(derived); + return derived; +} + +void RunContextState::AppendChild(SharedPtr child) noexcept +{ + std::unique_lock lock{ m_mutex }; + // Clean up stale child references + m_children.erase( + std::remove_if( + m_children.begin(), + m_children.end(), + [](WeakPtr const& p) { return p.expired(); } + ), + m_children.end() + ); + + m_children.push_back(child); +} + +XTaskQueueHandle RunContextState::TaskQueueHandle() const noexcept +{ + return m_queue.Handle(); +} + +struct XTaskQueueCallbackContext +{ + SharedPtr runContext; + SharedPtr work; +}; + +void RunContextState::TaskQueueSubmitCallback(XTaskQueuePort port, SharedPtr work, uint32_t delayInMs) noexcept +{ + assert(work); + assert(m_queue.Handle()); + + Allocator a; + XTaskQueueCallbackContext* context = new (a.allocate(1)) XTaskQueueCallbackContext{ shared_from_this(), std::move(work) }; // reclaimed in TaskQueueCallback + + std::unique_lock lock{ m_mutex }; + ++m_pendingTaskQueueCallbacks; + lock.unlock(); + + TRACE_VERBOSE("RunContextState[id=%u] TaskQueue callback submitted", m_id); + + HRESULT hr = XTaskQueueSubmitDelayedCallback(m_queue.Handle(), port, delayInMs, context, TaskQueueCallback); + if (FAILED(hr)) + { + // Treat other errors as cancellations by calling TaskQueueCallback so that the cancellation handler is called and + // m_pendingTaskQueueCallbacks is updated correctly + TaskQueueCallback(context, true); + + TRACE_WARNING_HR(hr, "XTaskQueueSubmitDelayedCallback failed"); + assert(hr == E_ABORT); // The only error we expect to ever see here is E_ABORT + } +} + +void CALLBACK RunContextState::TaskQueueCallback(void* c, bool cancelled) noexcept +{ + assert(c); + UniquePtr callbackContext{ static_cast(c) }; + assert(callbackContext->runContext && callbackContext->work); + + TRACE_VERBOSE("RunContextState[id=%u] TaskQueueCallback", callbackContext->runContext->m_id); + + if (cancelled) + { + callbackContext->work->WorkCancelled(); + } + else + { + callbackContext->work->Run(); + } + + SharedPtr runContext{ std::move(callbackContext->runContext) }; + callbackContext.reset(); + + std::unique_lock lock{ runContext->m_mutex }; + --runContext->m_pendingTaskQueueCallbacks; + + TRACE_VERBOSE("RunContextState[id=%u] TaskQueueCallback complete, %u remaining", runContext->m_id, runContext->m_pendingTaskQueueCallbacks); + + CheckTerminationAndNotifyListener(std::move(runContext), std::move(lock)); +} + +void RunContextState::TaskQueueTerminate() noexcept +{ + std::unique_lock lock{ m_mutex }; + + if (m_queueTerminated) + { + // Early out if the queue has already been terminated. Check needed because unlike XTaskQueueSubmitDelayedCallback, + // XTaskQueueTerminate will succeed even after the queue has been terminated (creating another asyncronous callback that could + // run beyond RunContext::Terminate completing in some cases) + return; + } + + // Track termination callbacks together with work callbacks. Because XTaskQueueTerminate doesn't guarantee that all submitted work callbacks + // have completed before invoking termination callbacks (it only guarantees that they've been started), we need additional tracking to ensure + // all work has completed during RunContext termination + ++m_pendingTaskQueueCallbacks; + m_queueTerminated = true; + lock.unlock(); + + TRACE_VERBOSE("RunContextState[id=%u] TaskQueue terminating, %u callbacks remaining", m_id, m_pendingTaskQueueCallbacks); + + assert(m_queue.Handle()); + Allocator a; + XTaskQueueCallbackContext* context = new (a.allocate(1)) XTaskQueueCallbackContext{ shared_from_this() }; // reclaimed in TaskQueueTerminated + + HRESULT hr = XTaskQueueTerminate(m_queue.Handle(), false, context, TaskQueueTerminated); + if (FAILED(hr)) + { + // This likely indicates a bug, but consider the queue terminated to not block cleanup + assert(SUCCEEDED(hr)); + TRACE_ERROR_HR(hr, "Failed to terminate queue"); + + TaskQueueTerminated(context); + } +} + +void CALLBACK RunContextState::TaskQueueTerminated(void* c) noexcept +{ + assert(c); + UniquePtr callbackContext{ static_cast(c) }; + assert(callbackContext->runContext && !callbackContext->work); + + SharedPtr runContext{ std::move(callbackContext->runContext) }; + callbackContext.reset(); + + std::unique_lock lock{ runContext->m_mutex }; + --runContext->m_pendingTaskQueueCallbacks; + + TRACE_VERBOSE("RunContextState[id=%u] TaskQueueTerminated, %u callbacks remaining", runContext->m_id, runContext->m_pendingTaskQueueCallbacks); + + CheckTerminationAndNotifyListener(std::move(runContext), std::move(lock)); +} + +PlayFab::CancellationToken RunContextState::CancellationToken() const noexcept +{ + return m_cancellationToken; +} + +bool RunContextState::RegisterTerminableAndCheck(ITerminable& terminable) noexcept +{ + std::unique_lock lock{ m_mutex }; + + if (m_terminated) + { + return true; + } + + m_terminables.push_back(&terminable); + + return false; +} + +bool RunContextState::UnregisterTerminableAndCheck(ITerminable& terminable) noexcept +{ + // We take the terminationMutex to ensure that we are properly serialized with respect to the terminating m_terminables. + // Because it's a recursive lock, unregistering from within Terminate is safe + std::unique_lock terminationLock{ m_terminationMutex }; + std::unique_lock lock{ m_mutex }; + + auto it = std::find(m_terminables.begin(), m_terminables.end(), &terminable); + if (it != m_terminables.end()) + { + m_terminables.erase(it); + } + + return m_terminated; +} + +using TerminationContext = SharedPtr; + +void RunContextState::Terminate(ITerminationListener& listener, void* listenerContext) +{ + TRACE_VERBOSE(__FUNCTION__); + + std::unique_lock terminationLock{ m_terminationMutex }; + std::unique_lock lock{ m_mutex }; + + assert(!m_terminated); + m_terminated = true; + m_terminationListener = &listener; + m_terminationListenerContext = listenerContext; + + // We only needed to keep m_parent alive so we'd be recursively terminated. Safe to release it now that we've been + // terminated. + m_parent.reset(); + + Vector> children; + for (auto& weakChild : m_children) + { + if (auto child = weakChild.lock()) + { + children.emplace_back(child); + } + } + + m_pendingTerminations = m_terminables.size() + children.size(); + TRACE_VERBOSE("RunContextState[id=%u] terminating with %u terminables", m_id, m_pendingTerminations); + + // context will ensure our lifetime until Termination completes + TerminationContext* context = nullptr; + if (m_pendingTerminations) + { + context = MakeUnique(shared_from_this()).release(); // reclaimed in OnTerminated + } + + // Release state lock but intentionally hold terminationLock while notifying terminables to avoid races with unregister + lock.unlock(); + + // Terminate Queue, registered terminables, and children + TaskQueueTerminate(); + + for (auto& terminable : m_terminables) + { + terminable->Terminate(*this, context); + } + + for (auto& child : children) + { + child->Terminate(*this, context); + } + + lock.lock(); + + // Check if termination is trivially complete - TaskQueue was already terminated, we had no terminables, and no children. + CheckTerminationAndNotifyListener(shared_from_this(), std::move(lock)); +} + +void RunContextState::OnTerminated(void* c) noexcept +{ + std::unique_lock lock{ m_mutex }; + + assert(m_pendingTerminations); + --m_pendingTerminations; + TRACE_VERBOSE("RunContextState[id=%u] terminable terminated, %u remaining", m_id, m_pendingTerminations); + + if (!m_pendingTerminations) + { + // Free context and check if termination is complete + UniquePtr terminationContext{ static_cast(c) }; + SharedPtr self = std::move(*terminationContext); + terminationContext.reset(); + + CheckTerminationAndNotifyListener(std::move(self), std::move(lock)); + } +} + +void RunContextState::CheckTerminationAndNotifyListener(SharedPtr runContext, std::unique_lock lock) noexcept +{ + // Notify listener iff + // 1) m_terminationListener is non-null (Terminate has been called and hasn't previously been completed) + // 2) there are no pending TaskQueue callbacks + // 3) there are no pending terminations of registered or child terminables + + assert(lock.owns_lock()); + + if (runContext->m_terminationListener && !runContext->m_pendingTaskQueueCallbacks && !runContext->m_pendingTerminations) + { + // Move listener and listenerContext to the stack before releasing runContext, it may be destroyed here + ITerminationListener& listener = *runContext->m_terminationListener; + void* listenerContext = runContext->m_terminationListenerContext; + + // reset m_terminationListener to avoid double notifying in some race scenarios + runContext->m_terminationListener = nullptr; + + TRACE_VERBOSE("RunContextState[id=%u] Termination complete, notifying listener", runContext->m_id); + + lock.unlock(); + runContext.reset(); + + listener.OnTerminated(listenerContext); + } + else + { + // Explicitly unlock before exiting function scope to ensure runContext isn't destroyed while the mutex is held. + // Needed because C++ doesn't define destruction order of function parameters so it may vary depending on compiler + lock.unlock(); + } +} + +//------------------------------------------------------------------------------ +// RunContext +//------------------------------------------------------------------------------ + +RunContext::RunContext(SharedPtr state) noexcept : + m_state{ std::move(state) } +{ +} + +RunContext RunContext::Root(XTaskQueueHandle queue) noexcept +{ + return RunContext{ RunContextState::Root(queue) }; +} + +RunContext RunContext::Derive() noexcept +{ + return RunContext{ m_state->Derive() }; +} + +RunContext RunContext::DeriveOnQueue(XTaskQueueHandle queueHandle) noexcept +{ + return RunContext{ m_state->DeriveOnQueue(queueHandle) }; +} + +XTaskQueueHandle RunContext::TaskQueueHandle() const noexcept +{ + return m_state->TaskQueueHandle(); +} + +void RunContext::TaskQueueSubmitWork(SharedPtr work, uint32_t delayInMs) const noexcept +{ + m_state->TaskQueueSubmitCallback(XTaskQueuePort::Work, std::move(work), delayInMs); +} + +void RunContext::TaskQueueSubmitCompletion(SharedPtr completion) const noexcept +{ + m_state->TaskQueueSubmitCallback(XTaskQueuePort::Completion, std::move(completion), 0); +} + +void RunContext::TaskQueueTerminate() noexcept +{ + m_state->TaskQueueTerminate(); +} + +CancellationToken RunContext::CancellationToken() const noexcept +{ + return m_state->CancellationToken(); +} + +bool RunContext::RegisterTerminableAndCheck(ITerminable& terminable) noexcept +{ + return m_state->RegisterTerminableAndCheck(terminable); +} + +bool RunContext::UnregisterTerminableAndCheck(ITerminable& terminable) noexcept +{ + return m_state->UnregisterTerminableAndCheck(terminable); +} + +void RunContext::Terminate(ITerminationListener& listener, void* context) noexcept +{ + m_state->Terminate(listener, context); +} + +} // namespace PlayFab diff --git a/Source/PlayFabSharedInternal/Source/Trace.cpp b/Source/PlayFabSharedInternal/Source/Trace.cpp new file mode 100644 index 0000000..0ed1d04 --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/Trace.cpp @@ -0,0 +1,4 @@ +#include "pch.h" +#include "Trace.h" + +PFHC_DEFINE_TRACE_AREA(PlayFab, PFHCTraceLevel::Verbose); \ No newline at end of file diff --git a/Source/PlayFabSharedInternal/Source/XAsyncOperation.cpp b/Source/PlayFabSharedInternal/Source/XAsyncOperation.cpp new file mode 100644 index 0000000..cfe9553 --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/XAsyncOperation.cpp @@ -0,0 +1,64 @@ +#include "pch.h" +#include "XAsyncOperation.h" + +namespace PlayFab +{ + +IOperation::IOperation(PlayFab::RunContext&& runContext) noexcept : m_rc{ std::move(runContext) } +{ +} + +void IOperation::Run(UniquePtr operation) noexcept +{ + operation->OnStarted(std::move(operation)); +} + +RunContext IOperation::RunContext() const noexcept +{ + return m_rc; +} + +XAsyncOperationBase::XAsyncOperationBase(PlayFab::RunContext&& runContext) noexcept : + IOperation{ std::move(runContext) }, + m_asyncBlock{ RunContext().TaskQueueHandle(), this, XAsyncCompletionCallback, {} } +{ +} + +XAsyncOperationBase::~XAsyncOperationBase() noexcept +{ + RunContext().CancellationToken().UnregisterForNotificationAndCheck(*this); +} + +void XAsyncOperationBase::OnStarted(UniquePtr self) noexcept +{ + bool alreadyCancelled = RunContext().CancellationToken().RegisterForNotificationAndCheck(*this); + if (alreadyCancelled) + { + OnFailed(E_ABORT); + return; + } + + HRESULT hr = OnStarted(&m_asyncBlock); + if (FAILED(hr)) + { + // XAsyncCompletionCallback won't be called in this case. Operation will be destroyed here + OnFailed(hr); + return; + } + + // Release operation. It will be reclaim in XAsyncCompletionCallback + self.release(); +} + +void XAsyncOperationBase::OnCancellation() noexcept +{ + XAsyncCancel(&m_asyncBlock); +} + +void CALLBACK XAsyncOperationBase::XAsyncCompletionCallback(XAsyncBlock* async) +{ + UniquePtr operation{ static_cast(async->context) }; + operation->OnCompleted(async); +} + +} diff --git a/Source/PlayFabSharedInternal/Source/XAsyncProviderBase.cpp b/Source/PlayFabSharedInternal/Source/XAsyncProviderBase.cpp new file mode 100644 index 0000000..3e5f66e --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/XAsyncProviderBase.cpp @@ -0,0 +1,149 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#include "pch.h" +#include "XAsyncProviderBase.h" +#include "EnumTraits.h" + +namespace PlayFab +{ + +constexpr char defaultProviderIdentity[]{ "UnnamedProvider" }; + +XAsyncProviderBase::XAsyncProviderBase(_In_ RunContext&& runContext, _In_ XAsyncBlock* async) noexcept + : identityName{ defaultProviderIdentity }, + m_runContext{ std::move(runContext) }, + m_async{ async } +{ +} + +HRESULT XAsyncProviderBase::Run(_In_ UniquePtr provider) noexcept +{ + RETURN_HR_IF(E_ABORT, provider->m_runContext.RegisterTerminableAndCheck(*provider)); + RETURN_IF_FAILED(XAsyncBegin(provider->m_async, provider.get(), nullptr, provider->identityName, XAsyncProvider)); + provider.release(); + return S_OK; +} + +HRESULT XAsyncProviderBase::Begin(RunContext) +{ + return Schedule(0); +} + +HRESULT XAsyncProviderBase::DoWork(RunContext) +{ + return E_FAIL; +} + +HRESULT XAsyncProviderBase::GetResult(void*, size_t) +{ + assert(false); + return E_UNEXPECTED; +} + +HRESULT XAsyncProviderBase::Schedule(uint32_t delay) const +{ + return XAsyncSchedule(m_async, delay); +} + +void XAsyncProviderBase::Complete(size_t resultSize) +{ + XAsyncComplete(m_async, S_OK, resultSize); +} + +void XAsyncProviderBase::Fail(HRESULT hr) +{ + XAsyncComplete(m_async, hr, 0); +} + +void XAsyncProviderBase::Terminate(ITerminationListener& listener, void* context) noexcept +{ + TRACE_WARNING("XAsyncProvider terminated before completion. PFUninitialize may be blocked until result payload is retreived."); + + assert(!m_terminationListener); + m_terminationListener = &listener; + m_terminationListenerContext = context; +} + +HRESULT CALLBACK XAsyncProviderBase::XAsyncProvider(_In_ XAsyncOp op, _Inout_ const XAsyncProviderData* data) noexcept +{ + auto provider{ static_cast(data->context) }; + + TRACE_VERBOSE("Provider[ID=%s] XAsyncOp::%s", provider->identityName, EnumName(op)); + + switch (op) + { + case XAsyncOp::Begin: + try + { + return provider->Begin(provider->m_runContext); + } + catch (...) + { + return CurrentExceptionToHR(); + } + case XAsyncOp::DoWork: + try + { + return provider->DoWork(provider->m_runContext); + } + catch (...) + { + return CurrentExceptionToHR(); + } + case XAsyncOp::GetResult: + try + { + return provider->GetResult(data->buffer, data->bufferSize); + } + catch (...) + { + return CurrentExceptionToHR(); + } + case XAsyncOp::Cancel: + { + try + { + provider->m_runContext.CancellationToken().Cancel(); + return S_OK; + } + catch (...) + { + return CurrentExceptionToHR(); + } + } + case XAsyncOp::Cleanup: + { + // Cleanup should only fail in catostrophic cases. Can't pass result to client + // at this point so die with exception. + + // Copy the ITerminationListener locally before destroying the provider, but unregister + // beforehand to avoid race condition between termination and provider cleanup. + bool terminated = provider->m_runContext.UnregisterTerminableAndCheck(*provider); + ITerminationListener* terminationListener = provider->m_terminationListener; + void* terminationListenerContext = provider->m_terminationListenerContext; + + // Sanity check - if the runContext was terminated, we should have a terminationListener + assert(!terminated || terminationListener); + UNREFERENCED_PARAMETER(terminated); + + // Cleanup provider + UniquePtr{ provider }.reset(); + + // Notify listener if needed + if (terminationListener) + { + terminationListener->OnTerminated(terminationListenerContext); + } + + return S_OK; + } + default: + { + assert(false); + return S_OK; + } + } +} + +} // PlayFab diff --git a/Source/PlayFabSharedInternal/Source/pch.cpp b/Source/PlayFabSharedInternal/Source/pch.cpp new file mode 100644 index 0000000..1d9f38c --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/pch.cpp @@ -0,0 +1 @@ +#include "pch.h" diff --git a/Source/PlayFabSharedInternal/Source/pch.h b/Source/PlayFabSharedInternal/Source/pch.h new file mode 100644 index 0000000..7cf922a --- /dev/null +++ b/Source/PlayFabSharedInternal/Source/pch.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "ResultMacros.h" +#include "Memory.h" +#include "RapidJson.h" +#include "Types.h" +#include "Result.h" +#include "Error.h" +#include "PlatformUtils.h" +#include "Trace.h" +#include "RunContext.h" diff --git a/Test/PlayFabCore.UnitTests/Mocks/HttpMock.cpp b/Test/PlayFabCore.UnitTests/Mocks/HttpMock.cpp new file mode 100644 index 0000000..d93f9f9 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Mocks/HttpMock.cpp @@ -0,0 +1,106 @@ +#include "stdafx.h" +#include "HttpMock.h" + +namespace PlayFab +{ +namespace UnitTests +{ + +HttpMock::HttpMock(const char* method, const char* url) noexcept +{ + ASSERT_SUCCEEDED(HCMockCallCreate(&m_handle)); + ASSERT_SUCCEEDED(HCMockAddMock(m_handle, method, url, nullptr, 0)); + // Default mock response of 200 with no response headers or body + ASSERT_SUCCEEDED(HCMockResponseSetStatusCode(m_handle, 200)); + ASSERT_SUCCEEDED(HCMockSetMockMatchedCallback(m_handle, HCMockMatchedCallback, this)); +} + + +HttpMock::~HttpMock() +{ + // avoid race between destruction and callback invocation + std::unique_lock lock{ m_mutex }; + + ASSERT_SUCCEEDED(HCMockRemoveMock(m_handle)); +} + +void HttpMock::SetResponseHttpStatus(uint32_t httpStatus) const noexcept +{ + ASSERT_SUCCEEDED(HCMockResponseSetStatusCode(m_handle, httpStatus)); +} + +void HttpMock::SetResponseBody(const char* responseBodyString) const noexcept +{ + if (responseBodyString) + { + SetResponseBody((uint8_t*)(responseBodyString), std::strlen(responseBodyString) + 1); + } +} + +void HttpMock::SetResponseBody(const rapidjson::Value& responseBodyJson) const noexcept +{ + if (!responseBodyJson.IsNull()) + { + rapidjson::StringBuffer buffer; + rapidjson::Writer writer(buffer); + responseBodyJson.Accept(writer); + SetResponseBody(buffer.GetString()); + } +} + +void HttpMock::SetResponseBody( + const uint8_t* responseBodyBytes, + size_t responseBodySize +) const noexcept +{ + if (responseBodyBytes && responseBodySize) + { + ASSERT_SUCCEEDED(HCMockResponseSetResponseBodyBytes(m_handle, responseBodyBytes, static_cast(responseBodySize))); + } +} + +void HttpMock::ClearReponseBody() const noexcept +{ + // libHttpClient doesn't allow setting body with nullptr, but it does allow size = 0 + uint8_t body{}; + SetResponseBody(&body, 0); +} + +void HttpMock::SetResponseHeaders(const HttpHeaders& responseHeaders) const noexcept +{ + for (const auto& header : responseHeaders) + { + ASSERT_SUCCEEDED(HCMockResponseSetHeader(m_handle, header.first.data(), header.second.data())); + } +} + +void HttpMock::SetCallback(Callback callback) noexcept +{ + std::unique_lock lock{ m_mutex }; + m_callback = std::move(callback); +} + +void CALLBACK HttpMock::HCMockMatchedCallback( + _In_ HCMockCallHandle mockHandle, + _In_ const char* /*method*/, + _In_ const char* url, + _In_ const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize, + _In_ void* context +) noexcept +{ + auto mock = static_cast(context); + assert(mock->m_handle == mockHandle); + UNREFERENCED_PARAMETER(mockHandle); + + // avoid race between destruction and callback invocation + std::unique_lock lock{ mock->m_mutex }; + ++mock->m_hitCount; + if (mock->m_callback) + { + mock->m_callback(*mock, url, std::string{ requestBodyBytes, requestBodyBytes + requestBodySize }, mock->m_hitCount); + } +} + +} +} diff --git a/Test/PlayFabCore.UnitTests/Mocks/HttpMock.h b/Test/PlayFabCore.UnitTests/Mocks/HttpMock.h new file mode 100644 index 0000000..79a776f --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Mocks/HttpMock.h @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#pragma once + +#include +#include + +namespace PlayFab +{ +namespace UnitTests +{ + +using HttpHeaders = std::map; + +// RAII wrapper around HCMockCallHandle +class HttpMock +{ +public: + using Callback = std::function; + + HttpMock(_In_ const char* httpMethod, _In_ const char* url) noexcept; + HttpMock(HttpMock const&) = delete; + HttpMock(HttpMock&&) = delete; + HttpMock& operator=(HttpMock const&) = delete; + HttpMock& operator=(HttpMock&&) = delete; + virtual ~HttpMock(); + + void SetResponseHttpStatus(uint32_t httpStatus) const noexcept; + void SetResponseBody(const char* responseBodyString) const noexcept; + void SetResponseBody(const rapidjson::Value& responseBodyJson) const noexcept; + void SetResponseBody(const uint8_t* responseBodyBytes, size_t responseBodySize) const noexcept; + void ClearReponseBody() const noexcept; + void SetResponseHeaders(const HttpHeaders& responseHeaders) const noexcept; + void SetCallback(Callback callback) noexcept; + +private: + static void CALLBACK HCMockMatchedCallback( + _In_ HCMockCallHandle mockHandle, + _In_ const char* method, + _In_ const char* url, + _In_ const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize, + _In_ void* context + ) noexcept; + + std::mutex m_mutex; + HCMockCallHandle m_handle{ nullptr }; + Callback m_callback; + uint32_t m_hitCount{ 0 }; +}; + +} +} diff --git a/Test/PlayFabCore.UnitTests/Mocks/MockResponses.json b/Test/PlayFabCore.UnitTests/Mocks/MockResponses.json new file mode 100644 index 0000000..19176a4 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Mocks/MockResponses.json @@ -0,0 +1,69 @@ +{ + "calls": { + "LoginWithCustomID": { + "url": "/Client/LoginWithCustomID", + "result": "LoginResult" + }, + "GetEntityToken": { + "url": "/Authentication/GetEntityToken", + "result": "GetEntityTokenResponse" + }, + "WriteEvents": { + "url": "/Event/WriteEvent", + "result": "WriteEventsResponse" + } + }, + "datatypes": { + "GetEntityTokenResponse": { + "default": { + "code": 200, + "status": "OK", + "data": { + "EntityToken": "TitlePlayerMockEntityToken", + "Entity": { + "Id": "TitlePlayerId", + "Type": "title_player_account", + "TypeString": "title_player_account", + "IsTitle": false, + "IsNamespace": false, + "IsService": false, + "IsMasterPlayer": false, + "IsTitlePlayer": true + } + } + } + }, + "LoginResult": { + "default": { + "code": 200, + "status": "OK", + "data": { + "EntityToken": { + "Entity": { + "Id": "TitlePlayerId", + "Type": "title_player_account" + }, + "EntityToken": "TitlePlayerMockEntityToken" + }, + "NewlyCreated": false + } + } + }, + "WriteEventsResponse": { + "default": { + "code": 200, + "status": "OK", + "data": { + "AssignedEventIds": [] + } + } + } + }, + "errors": { + "ExpiredAuthToken": { + "code": 400, + "errorCode": 1153, + "error": "ExpiredAuthToken" + } + } +} diff --git a/Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.cpp b/Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.cpp new file mode 100644 index 0000000..bf7a1ee --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.cpp @@ -0,0 +1,108 @@ +#include "stdafx.h" +#include "PlayFabServiceMock.h" + +namespace PlayFab +{ +namespace UnitTests +{ + +PlayFabServiceMock::~PlayFabServiceMock() +{ + // avoid race between destruction and callback invocation + std::unique_lock lock{ m_mutex }; +} + +rapidjson::Value& PlayFabServiceMock::ResponseBody() noexcept +{ + return m_responseBody; +} + +rapidjson::Value& PlayFabServiceMock::ResponseBodyPayload() noexcept +{ + return m_responseBody["data"]; +} + +void PlayFabServiceMock::SetCallback(Callback callback) noexcept +{ + std::unique_lock lock{ m_mutex }; + m_callback = std::move(callback); +} + +rapidjson::Value const& PlayFabServiceMock::ServiceResponses() const noexcept +{ + return m_responses; +} + +rapidjson::Value const& PlayFabServiceMock::ServiceErrors() noexcept +{ + return s_serviceResponses["errors"]; +} + +PlayFab::JsonAllocator& PlayFabServiceMock::JsonAllocator() noexcept +{ + return s_serviceResponses.GetAllocator(); +} + +void PlayFabServiceMock::HttpMockCallback(HttpMock const& /*mock*/, std::string url, std::string requestBody, uint32_t hitCount) noexcept +{ + std::unique_lock lock{ m_mutex }; + if (m_callback) + { + m_callback(*this, std::move(url), std::move(requestBody), hitCount); + } + HttpMock::SetResponseBody(m_responseBody); +} + +std::string PlayFabServiceMock::GetUrl(const char* apiEndpoint, const char* apiName) noexcept +{ + std::stringstream url; + url << apiEndpoint; + + assert(s_serviceResponses["calls"].HasMember(apiName)); + assert(s_serviceResponses["calls"][apiName].HasMember("url")); + url << s_serviceResponses["calls"][apiName]["url"].GetString(); + + return url.str(); +} + +rapidjson::Value const& PlayFabServiceMock::GetServiceResponses(const char* apiName) noexcept +{ + assert(s_serviceResponses["calls"][apiName].HasMember("result")); + const char* resultTypeName = s_serviceResponses["calls"][apiName]["result"].GetString(); + assert(s_serviceResponses["datatypes"].HasMember(resultTypeName)); + + return s_serviceResponses["datatypes"][resultTypeName]; +} + + +// TODO doc location, schema, etc of MockResponses file +// TODO we could get fancy here and use sample responses from service API specs but I've just manually populated a separate +// MockResponses.json file for the time being. +rapidjson::Document InitServiceResponses() +{ + constexpr char kMockResponseJsonFile[] = "MockResponses.json"; + + rapidjson::Document serviceResponses; + + std::ifstream file{ kMockResponseJsonFile, std::ios::binary | std::ios::ate }; + assert(file.is_open()); + + std::vector data(static_cast(file.tellg())); + file.seekg(0); + file.read(reinterpret_cast(data.data()), static_cast(data.size())); + assert(file.good()); + + serviceResponses.Parse(data.data(), data.size()); + // Basic validation. Additional validation for specific mocks done during PlayFabServiceMock construction + assert(!serviceResponses.HasParseError()); + assert(serviceResponses.HasMember("calls")); + assert(serviceResponses.HasMember("datatypes")); + assert(serviceResponses.HasMember("errors")); + + return serviceResponses; +} + +rapidjson::Document PlayFabServiceMock::s_serviceResponses = InitServiceResponses(); + +} +} diff --git a/Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.h b/Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.h new file mode 100644 index 0000000..2251c1b --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Mocks/PlayFabServiceMock.h @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#pragma once + +#include "HttpMock.h" + +namespace PlayFab +{ +namespace UnitTests +{ + +// Mocks a PlayFab service API +class PlayFabServiceMock : protected HttpMock +{ +public: + using Callback = std::function; + + template typename Alloc> + PlayFabServiceMock(Wrappers::ServiceConfig const& serviceConfig, const char* apiName); + ~PlayFabServiceMock(); + + // Response body that will be used when the mock is matched. Will be initialized to a default value if one is configured + rapidjson::Value& ResponseBody() noexcept; + + // "data" field of a successful service responses. Will cause an assertion if the field isn't present (ex. the response + // represents a service error + rapidjson::Value& ResponseBodyPayload() noexcept; + + void SetCallback(Callback callback) noexcept; + + // All configured service responses for this mock API. See MockResponses.json for details. + rapidjson::Value const& ServiceResponses() const noexcept; + + // General PlayFab Service errors + static rapidjson::Value const& ServiceErrors() noexcept; + + // Global allocator to use for rapidjson allocations + static PlayFab::JsonAllocator& JsonAllocator() noexcept; + +private: + void HttpMockCallback(HttpMock const& mock, std::string url, std::string requestBody, uint32_t hitCount) noexcept; + + static std::string GetUrl(const char* apiEndpoint, const char* apiName) noexcept; + static rapidjson::Value const& GetServiceResponses(const char* apiName) noexcept; + static rapidjson::Document s_serviceResponses; + + std::mutex m_mutex; + Callback m_callback; + rapidjson::Value const& m_responses; + rapidjson::Value m_responseBody; +}; + +// Template implementations +template typename Alloc> +PlayFabServiceMock::PlayFabServiceMock(Wrappers::ServiceConfig const& serviceConfig, const char* apiName) : + HttpMock{ "POST", GetUrl(serviceConfig.APIEndpoint().data(), apiName).data() }, + m_responses{ GetServiceResponses(apiName) } +{ + if (m_responses.HasMember("default")) + { + m_responseBody.CopyFrom(m_responses["default"], JsonAllocator()); + } + + HttpMock::SetCallback(std::bind(&PlayFabServiceMock::HttpMockCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); +} + +} +} diff --git a/Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj b/Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj new file mode 100644 index 0000000..6ecee42 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj @@ -0,0 +1,52 @@ + + + + {2800a769-2da4-42cc-ac27-6ad411bc4349} + DynamicLibrary + NativeUnitTestProject + + + + + + + + + + $(VCInstallDir)UnitTest\include;$(PlayFabRoot)\Test\PlayFabCore.UnitTests\;$(PlayFabRoot)\Test\PlayFabCore.UnitTests\Support;%(AdditionalIncludeDirectories) + stdafx.h + + + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + \ No newline at end of file diff --git a/Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj.filters b/Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj.filters new file mode 100644 index 0000000..b9d2e6e --- /dev/null +++ b/Test/PlayFabCore.UnitTests/PlayFabCore.UnitTests.vcxproj.filters @@ -0,0 +1,83 @@ + + + + + {ffeb2d48-1e6a-46c6-b4fb-1564b845d6df} + + + {1ffb37bc-9f19-48f8-a8f4-65cbc73a37ad} + + + {6689def8-75f2-4b82-b659-6e0ab3740d22} + + + {171fc3ea-251f-4d72-b36b-898b96634fad} + + + + + Source\Tests + + + Source\Tests + + + Source\Tests + + + Source\Tests + + + Source\Tests + + + Source\Tests + + + Source\Support + + + Source\Support + + + Source\Support + + + Source\Mocks + + + Source\Mocks + + + + + Source\Mocks + + + Source\Mocks + + + Source\Support + + + Source\Support + + + Source\Support + + + Source\Support + + + Source\Support + + + Source\Support + + + + + Source\Mocks + + + \ No newline at end of file diff --git a/Test/PlayFabCore.UnitTests/Support/AsyncTestContext.cpp b/Test/PlayFabCore.UnitTests/Support/AsyncTestContext.cpp new file mode 100644 index 0000000..1783927 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/AsyncTestContext.cpp @@ -0,0 +1,57 @@ +#include "stdafx.h" +#include "TestIncludes.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace PlayFab +{ +namespace UnitTests +{ + +AsyncTestContext::~AsyncTestContext() +{ + std::unique_lock lock{ m_mutex }; + Assert::IsTrue(m_result.has_value()); +} + +void AsyncTestContext::Assert(bool condition) +{ + std::unique_lock lock{ m_mutex }; + if (!condition && !m_result.has_value()) + { + m_result.emplace(E_FAIL); + } +} + +void AsyncTestContext::AssertSucceeded(HRESULT hr) +{ + std::unique_lock lock{ m_mutex }; + if (FAILED(hr) && !m_result.has_value()) + { + m_result.emplace(hr); + } +} + +void AsyncTestContext::Complete() +{ + { + std::unique_lock lock{ m_mutex }; + if (!m_result.has_value()) + { + m_result.emplace(S_OK); + } + } + m_complete.Set(); +} + +void AsyncTestContext::AwaitResult() +{ + Assert::IsTrue(m_complete.Wait(INFINITE)); + + std::unique_lock lock{ m_mutex }; + Assert::IsTrue(m_result.has_value()); + Assert::IsTrue(SUCCEEDED(*m_result)); +} + +} +} diff --git a/Test/PlayFabCore.UnitTests/Support/AsyncTestContext.h b/Test/PlayFabCore.UnitTests/Support/AsyncTestContext.h new file mode 100644 index 0000000..3ed70f1 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/AsyncTestContext.h @@ -0,0 +1,40 @@ +#pragma once + +#include "Event.h" + +namespace PlayFab +{ +namespace UnitTests +{ + +// Helper class for marshalling result of multithreaded/asyncronous tests to the correct thread +class AsyncTestContext +{ +public: + AsyncTestContext() = default; + AsyncTestContext(const AsyncTestContext&) = delete; + ~AsyncTestContext(); + + void Assert(bool condition); + void AssertSucceeded(HRESULT hr); + + template + inline void AssertSucceeded(Result result); + + void Complete(); + void AwaitResult(); + +private: + std::mutex m_mutex; + std::optional m_result; + Event m_complete; +}; + +template +void AsyncTestContext::AssertSucceeded(Result result) +{ + AssertSucceeded(result.hr); +} + +} +} diff --git a/Test/PlayFabCore.UnitTests/Support/Event.cpp b/Test/PlayFabCore.UnitTests/Support/Event.cpp new file mode 100644 index 0000000..609ea17 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/Event.cpp @@ -0,0 +1,34 @@ +#include "stdafx.h" +#include "event.h" + +namespace PlayFab +{ +namespace UnitTests +{ + +Event::Event() noexcept +{ + m_handle = CreateEvent(nullptr, false, false, nullptr); + assert(m_handle); +} + +Event::~Event() noexcept +{ + CloseHandle(m_handle); +} + +void Event::Set() noexcept +{ + auto result = SetEvent(m_handle); + assert(result); + UNREFERENCED_PARAMETER(result); +} + +bool Event::Wait(DWORD timeoutMs) const noexcept +{ + DWORD result = WaitForSingleObject(m_handle, timeoutMs); + return result == WAIT_OBJECT_0; +} + +} +} diff --git a/Test/PlayFabCore.UnitTests/Support/Event.h b/Test/PlayFabCore.UnitTests/Support/Event.h new file mode 100644 index 0000000..4d0016e --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/Event.h @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#pragma once + +namespace PlayFab +{ +namespace UnitTests +{ + +// RAII Win32 event wrapper +class Event +{ +public: + Event() noexcept; + ~Event() noexcept; + Event(const Event& other) = delete; + Event& operator=(Event other) = delete; + + void Set() noexcept; + bool Wait(DWORD timeoutMs = INFINITE) const noexcept; + +private: + HANDLE m_handle{ nullptr }; +}; + +} +} diff --git a/Test/PlayFabCore.UnitTests/Support/TaskQueue.cpp b/Test/PlayFabCore.UnitTests/Support/TaskQueue.cpp new file mode 100644 index 0000000..309329e --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/TaskQueue.cpp @@ -0,0 +1,54 @@ +#include "stdafx.h" +#include "TaskQueue.h" +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +TaskQueue::TaskQueue(XTaskQueueHandle handle) : m_handle{ handle } +{ +} + +TaskQueue::TaskQueue(XTaskQueueDispatchMode workDispatchMode, XTaskQueueDispatchMode completionDispatchMode) +{ + THROW_IF_FAILED(XTaskQueueCreate(workDispatchMode, completionDispatchMode, &m_handle)); +} + +TaskQueue::TaskQueue(const TaskQueue& other) +{ + THROW_IF_FAILED(XTaskQueueDuplicateHandle(other.m_handle, &m_handle)); +} + +TaskQueue::TaskQueue(TaskQueue&& other) noexcept +{ + std::swap(m_handle, other.m_handle); +} + +TaskQueue::~TaskQueue() noexcept +{ + if (m_handle) + { + XTaskQueueCloseHandle(m_handle); + } +} + +TaskQueue TaskQueue::DeriveWorkQueue() const +{ + XTaskQueuePortHandle workPort{ nullptr }; + THROW_IF_FAILED(XTaskQueueGetPort(m_handle, XTaskQueuePort::Work, &workPort)); + + XTaskQueueHandle derivedHandle{ nullptr }; + THROW_IF_FAILED(XTaskQueueCreateComposite(workPort, workPort, &derivedHandle)); + + return TaskQueue{ derivedHandle }; +} + +XTaskQueueHandle TaskQueue::Handle() const noexcept +{ + return m_handle; +} + +} +} diff --git a/Test/PlayFabCore.UnitTests/Support/TaskQueue.h b/Test/PlayFabCore.UnitTests/Support/TaskQueue.h new file mode 100644 index 0000000..1f52b96 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/TaskQueue.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +class TaskQueue +{ +public: + TaskQueue(XTaskQueueHandle handle); // Takes ownership of handle + TaskQueue(XTaskQueueDispatchMode workDispatchMode, XTaskQueueDispatchMode completionDispatchMode); + TaskQueue(const TaskQueue& other); + TaskQueue(TaskQueue&& other) noexcept; + TaskQueue& operator=(TaskQueue const& other) noexcept = delete; + TaskQueue& operator=(TaskQueue&& other) noexcept = delete; + ~TaskQueue() noexcept; + + TaskQueue DeriveWorkQueue() const; + XTaskQueueHandle Handle() const noexcept; + +private: + XTaskQueueHandle m_handle{ nullptr }; +}; + +} +} diff --git a/Test/PlayFabCore.UnitTests/Support/TestIncludes.h b/Test/PlayFabCore.UnitTests/Support/TestIncludes.h new file mode 100644 index 0000000..fd32802 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/TestIncludes.h @@ -0,0 +1,17 @@ +#pragma once + +// Public SDK headers +#include + +// Test framework +#include "CppUnitTest.h" +#include "AsyncTestContext.h" +#include "TestMacros.h" + +// Wrappers +#include "Support/TestSession.h" +#include +#include + +// Mocks +#include "Mocks/PlayFabServiceMock.h" diff --git a/Test/PlayFabCore.UnitTests/Support/TestMacros.h b/Test/PlayFabCore.UnitTests/Support/TestMacros.h new file mode 100644 index 0000000..6a756bc --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/TestMacros.h @@ -0,0 +1,4 @@ +#pragma once + +#define VERIFY_SUCCEEDED(x) \ + Assert::IsTrue(SUCCEEDED(x)) diff --git a/Test/PlayFabCore.UnitTests/Support/TestSession.h b/Test/PlayFabCore.UnitTests/Support/TestSession.h new file mode 100644 index 0000000..e9fcaad --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Support/TestSession.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include + +namespace PlayFab +{ +namespace Wrappers +{ + +class TestSession +{ +public: + TestSession(XTaskQueueHandle backgroundQueue = nullptr) + { + HCSettingsSetTraceLevel(HCTraceLevel::Verbose); + HCTraceSetTraceToDebugger(true); + + THROW_IF_FAILED(PFInitialize(backgroundQueue)); + } + + TestSession(TestSession const&) = delete; + TestSession& operator=(TestSession const&) = delete; + + virtual ~TestSession() + { + XAsyncBlock async{}; + HRESULT hr = PFUninitializeAsync(&async); + assert(SUCCEEDED(hr)); + hr = XAsyncGetStatus(&async, true); + assert(SUCCEEDED(hr)); + UNREFERENCED_PARAMETER(hr); + } +}; + +} +} diff --git a/Test/PlayFabCore.UnitTests/Tests/AsyncOpTests.cpp b/Test/PlayFabCore.UnitTests/Tests/AsyncOpTests.cpp new file mode 100644 index 0000000..e595ff9 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Tests/AsyncOpTests.cpp @@ -0,0 +1,98 @@ +#include "stdafx.h" +#include "TestIncludes.h" +#include "AsyncOp.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace PlayFab +{ +namespace UnitTests +{ + +AsyncOp AsyncSleep(uint32_t sleepMs) +{ + auto opContext = std::make_shared>(); + + std::thread asyncOp([opContext, sleepMs]() + { + std::this_thread::sleep_for(std::chrono::milliseconds(sleepMs)); + opContext->Complete(Result{ S_OK }); + }); + + asyncOp.detach(); + + return AsyncOp{ opContext }; +} + +AsyncOp AsyncIncrement(int input) +{ + auto opContext = std::make_shared>(); + + std::thread asyncOp([opContext, input]() + { + opContext->Complete(Result(input + 1)); + }); + + asyncOp.detach(); + return AsyncOp{ opContext }; +} + +TEST_CLASS(AsyncOpTests) +{ +public: + TEST_METHOD(BasicContinuation) + { + AsyncTestContext tc; + const std::chrono::time_point start = std::chrono::system_clock::now(); + + AsyncSleep(100).Finally([start, &tc](Result result) mutable + { + tc.AssertSucceeded(result); + tc.Assert(std::chrono::duration_cast(std::chrono::system_clock::now() - start).count() >= 100); + tc.Complete(); + }); + + tc.AwaitResult(); + } + + TEST_METHOD(ChainedOperation) + { + AsyncTestContext tc; + + AsyncIncrement(0).Then([](Result result) -> AsyncOp + { + if (Failed(result)) + { + return result.hr; + } + return AsyncIncrement(result.Payload()); + }) + .Finally([&tc](Result result) mutable + { + tc.Assert(Succeeded(result) && result.Payload() == 2); + tc.Complete(); + }); + + tc.AwaitResult(); + } + + TEST_METHOD(ContinuationException) + { + AsyncTestContext tc; + + AsyncSleep(0).Then([](Result) -> Result + { + throw std::bad_alloc(); + }) + .Finally([&tc](Result result) mutable + { + tc.Assert(result.hr == E_OUTOFMEMORY); // std::bad_alloc should get translated to E_OUTOFMEMORY + tc.Complete(); + }); + + tc.AwaitResult(); + } +}; + +} // UnitTests +} // PlayFab diff --git a/Test/PlayFabCore.UnitTests/Tests/CancellationTokenTests.cpp b/Test/PlayFabCore.UnitTests/Tests/CancellationTokenTests.cpp new file mode 100644 index 0000000..b64db38 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Tests/CancellationTokenTests.cpp @@ -0,0 +1,128 @@ +#include "stdafx.h" +#include "TestIncludes.h" +#include "AsyncOp.h" +#include "CancellationToken.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace PlayFab +{ +namespace UnitTests +{ + +AsyncOp AwaitCancelAsync(CancellationToken ct) +{ + struct AwaitCancelOperation : ICancellationListener + { + AwaitCancelOperation(CancellationToken _ct) : + ct{ std::move(_ct) }, + opContext{ std::make_shared>() } + { + bool cancelled = ct.RegisterForNotificationAndCheck(*this); + if (cancelled) + { + opContext->Complete(E_ABORT); + } + } + + void OnCancellation() noexcept override + { + std::unique_ptr reclaim{ this }; + opContext->Complete(E_ABORT); + } + + CancellationToken ct; + std::shared_ptr> opContext; + }; + + auto op = std::make_unique(std::move(ct)).release(); + + return op->opContext; +} + +TEST_CLASS(CancellationTokenTests) +{ +public: + TEST_METHOD(BasicCancellation) + { + AsyncTestContext tc; + auto ct = CancellationToken::Root(); + + AwaitCancelAsync(ct).Finally([&tc](Result result) + { + tc.Assert(result.hr == E_ABORT); + tc.Complete(); + }); + + ct.Cancel(); + tc.AwaitResult(); + } + + TEST_METHOD(DerivedTokenCancelledByParent) + { + AsyncTestContext tc; + auto ct = CancellationToken::Root(); + + AwaitCancelAsync(ct.Derive()).Finally([&tc](Result result) + { + tc.Assert(result.hr == E_ABORT); + tc.Complete(); + }); + + ct.Cancel(); + tc.AwaitResult(); + } + + TEST_METHOD(CancelMultipleOperationsWithParentToken) + { + AsyncTestContext tc; + auto rootToken = CancellationToken::Root(); + CancellationToken derivedToken{ rootToken.Derive() }; + + std::atomic opsCompleted{ 0 }; + auto continuation = [&](Result result) + { + tc.Assert(result.hr == E_ABORT); + auto completedCount = ++opsCompleted; + if (completedCount == 3) + { + tc.Complete(); + } + }; + + // Start 3 operations using derived tokens + AwaitCancelAsync(derivedToken).Finally([&](Result result) + { + continuation(std::move(result)); + }); + AwaitCancelAsync(derivedToken.Derive()).Finally([&](Result result) + { + continuation(std::move(result)); + }); + AwaitCancelAsync(derivedToken.Derive().Derive()).Finally([&](Result result) + { + continuation(std::move(result)); + }); + + rootToken.Cancel(); + tc.AwaitResult(); + } + + TEST_METHOD(PreCancelledOperation) + { + AsyncTestContext tc; + auto ct = CancellationToken::Root(); + ct.Cancel(); + + AwaitCancelAsync(ct).Finally([&](Result result) + { + tc.Assert(result.hr == E_ABORT); + tc.Complete(); + }); + + tc.AwaitResult(); + } +}; + +} // UnitTests +} // PlayFab diff --git a/Test/PlayFabCore.UnitTests/Tests/EventPipelineTests.cpp b/Test/PlayFabCore.UnitTests/Tests/EventPipelineTests.cpp new file mode 100644 index 0000000..6e9cba7 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Tests/EventPipelineTests.cpp @@ -0,0 +1,143 @@ +#include "stdafx.h" +#include "TestIncludes.h" +#include + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace PlayFab +{ +namespace UnitTests +{ + +constexpr const char* kTestEventTemplate = +R"({ + "eventId": 0 +})"; + +TEST_CLASS(EventPipelineTests) +{ +public: + TEST_METHOD(TestSingleEventDefaultSettings) + { + // TODO Re-enable when pipeline is fixed + + //Wrappers::TestSession session; + //Wrappers::ServiceConfig<> serviceConfig{ "mockAPIEndpoint", "mockTitleId" }; + + //PlayFabServiceMock loginMock{serviceConfig, "LoginWithCustomID"}; + + //// Synchronously authenticate + //XAsyncBlock async{}; + //PFAuthenticationLoginWithCustomIDRequest request{}; + //VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDAsync(serviceConfig.Handle(), &request, &async)); + //VERIFY_SUCCEEDED(XAsyncGetStatus(&async, true)); + //PFEntityHandle entityHandle{ nullptr }; + //VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDGetResult(&async, &entityHandle, 0, nullptr, nullptr, nullptr)); + //auto entity = Wrappers::Entity<>::Wrap(entityHandle); + + //Wrappers::TelemetryPipeline pipeline{ entity.Handle(), nullptr }; + + //PlayFabServiceMock writeEventsMock{ serviceConfig, "WriteEvents" }; + + //AsyncTestContext tc; + //writeEventsMock.SetCallback([&](PlayFabServiceMock& mock, std::string url, std::string requestBody, uint32_t hitCount) + //{ + // rapidjson::Document requestJson; + // requestJson.Parse(requestBody.data()); + // rapidjson::Document payloadJson; + // payloadJson.Parse(requestJson["Events"][0]["PayloadJSON"].GetString()); + // tc.Assert(payloadJson["eventId"].GetInt() == 0); + // tc.Complete(); + //}); + + //PFTelemetryEvent event + //{ + // nullptr, + // "playfab.core", + // "testEvent", + // nullptr, + // kTestEventTemplate + //}; + + //pipeline.EmitEvent(&event); + + //tc.AwaitResult(); + } + + TEST_METHOD(TestMultipleEvents) + { + // TODO Re-enable when pipeline is fixed + + //Wrappers::TestSession session; + //Wrappers::ServiceConfig<> serviceConfig{ "mockAPIEndpoint", "mockTitleId" }; + + //// Configure Mocks + //PlayFabServiceMock loginMock{ serviceConfig, "LoginWithCustomID" }; + + //// Synchronously authenticate + //XAsyncBlock async{}; + //PFAuthenticationLoginWithCustomIDRequest request{}; + //VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDAsync(serviceConfig.Handle(), &request, &async)); + //VERIFY_SUCCEEDED(XAsyncGetStatus(&async, true)); + //PFEntityHandle entityHandle{ nullptr }; + //VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDGetResult(&async, &entityHandle, 0, nullptr, nullptr, nullptr)); + //auto entity = Wrappers::Entity<>::Wrap(entityHandle); + + //Wrappers::TelemetryPipeline pipeline{ entity.Handle(), nullptr }; + + //PlayFabServiceMock writeEventsMock{ serviceConfig, "WriteEvents" }; + + //std::set eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + //size_t eventsWritten = 0; + + //AsyncTestContext tc; + //writeEventsMock.SetCallback([&](PlayFabServiceMock& mock, std::string url, std::string requestBody, uint32_t hitCount) + //{ + // rapidjson::Document requestJson; + // requestJson.Parse(requestBody.data()); + + // auto& eventsJson = requestJson["Events"]; + // for (auto& eventJson : eventsJson.GetArray()) + // { + // rapidjson::Document payloadJson; + // payloadJson.Parse(eventJson["PayloadJSON"].GetString()); + // tc.Assert(eventIdsToWrite.find(payloadJson["eventId"].GetInt()) != eventIdsToWrite.end()); + // ++eventsWritten; + // } + + // if (eventsWritten == eventIdsToWrite.size()) + // { + // tc.Complete(); + // } + //}); + + //rapidjson::Document eventPayloadJson; + //eventPayloadJson.Parse(kTestEventTemplate); + + //PFTelemetryEvent event + //{ + // nullptr, + // "playfab.core", + // "testEvent", + // nullptr, + // nullptr + //}; + + //for (auto& eventId : eventIdsToWrite) + //{ + // eventPayloadJson["eventId"] = eventId; + + // rapidjson::StringBuffer buffer; + // rapidjson::Writer writer(buffer); + // eventPayloadJson.Accept(writer); + + // event.payloadJson = buffer.GetString(); + // pipeline.EmitEvent(&event); + //} + + //tc.AwaitResult(); + } +}; + +} +} \ No newline at end of file diff --git a/Test/PlayFabCore.UnitTests/Tests/GlobalStateTests.cpp b/Test/PlayFabCore.UnitTests/Tests/GlobalStateTests.cpp new file mode 100644 index 0000000..01d4bbb --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Tests/GlobalStateTests.cpp @@ -0,0 +1,89 @@ +#include "stdafx.h" +#include "TestIncludes.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace PlayFab +{ +namespace UnitTests +{ + +class MemoryManager +{ +public: + MemoryManager() noexcept + { + s_allocCalls = 0; + s_freeCalls = 0; + + PFMemoryHooks hooks{ MemAllocHook, MemFreeHook }; + VERIFY_SUCCEEDED(PFMemSetFunctions(&hooks)); + } + + ~MemoryManager() noexcept + { + PFMemoryHooks hooks{ nullptr, nullptr }; + VERIFY_SUCCEEDED(PFMemSetFunctions(&hooks)); + Assert::AreEqual(s_allocCalls.load(), s_freeCalls.load()); + } + +private: + static _Ret_maybenull_ _Post_writable_byte_size_(dwSize) void* STDAPIVCALLTYPE MemAllocHook( + _In_ size_t dwSize + ) + { + std::lock_guard lock{ s_mutex }; + auto ret = new char[dwSize]; + s_allocMap[ret] = s_allocCalls++; + return ret; + } + + static void STDAPIVCALLTYPE MemFreeHook( + _In_ void* pAddress + ) + { + std::lock_guard lock{ s_mutex }; + s_freeCalls++; + Assert::IsTrue(s_allocMap.erase(pAddress) > 0); + delete[] pAddress; + } + + static std::mutex s_mutex; + static std::atomic s_allocCalls; + static std::atomic s_freeCalls; + static std::map s_allocMap; +}; + +std::mutex MemoryManager::s_mutex{}; +std::atomic MemoryManager::s_allocCalls{ 0 }; +std::atomic MemoryManager::s_freeCalls{ 0 }; +std::map MemoryManager::s_allocMap{}; + +TEST_CLASS(GlobalStateTests) +{ +public: + TEST_METHOD(CustomMemHooks) + { + MemoryManager manager; + VERIFY_SUCCEEDED(PFInitialize(nullptr)); + + XAsyncBlock async{}; + VERIFY_SUCCEEDED(PFUninitializeAsync(&async)); + VERIFY_SUCCEEDED(XAsyncGetStatus(&async, true)); + } + + TEST_METHOD(SetHooksAfterInit) + { + VERIFY_SUCCEEDED(PFInitialize(nullptr)); + + PFMemoryHooks hooks{ nullptr, nullptr }; + Assert::AreEqual(E_PF_CORE_ALREADY_INITIALIZED, PFMemSetFunctions(&hooks)); + + XAsyncBlock async{}; + VERIFY_SUCCEEDED(PFUninitializeAsync(&async)); + VERIFY_SUCCEEDED(XAsyncGetStatus(&async, true)); + } +}; + +} // UnitTests +} // PlayFab \ No newline at end of file diff --git a/Test/PlayFabCore.UnitTests/Tests/RunContextTests.cpp b/Test/PlayFabCore.UnitTests/Tests/RunContextTests.cpp new file mode 100644 index 0000000..c2e316a --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Tests/RunContextTests.cpp @@ -0,0 +1,419 @@ +#include "stdafx.h" +#include "TestIncludes.h" +#include "TaskQueue.h" +#include "RunContext.h" +#include "ApiXAsyncProvider.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace PlayFab +{ +namespace UnitTests +{ + +enum class EventType +{ + TaskQueueWorkComplete, + TaskQueueWorkCancelled, + TaskQueueWorkDestroyed, + XAsyncProviderCompleted, + XAsyncProviderAborted, + XAsyncProviderDestroyed, + XAsyncOperationComplete, + TerminationComplete +}; + +// Simple thread safe list of events that have occurred during a test +class EventList +{ +public: + EventList() : m_state{ std::make_shared() } + { + static const size_t kEventListInitialSize = 10; + m_state->m_events.reserve(kEventListInitialSize); + } + + void PushBack(EventType event) + { + std::lock_guard lock{ m_state->m_mutex }; + m_state->m_events.push_back(event); + } + + size_t Size() const + { + std::lock_guard lock{ m_state->m_mutex }; + return m_state->m_events.size(); + } + + EventType operator[](size_t index) const + { + std::lock_guard lock{ m_state->m_mutex }; + return m_state->m_events[index]; + } + + size_t Find(EventType event) const + { + std::lock_guard lock{ m_state->m_mutex }; + for (size_t i = 0; i < m_state->m_events.size(); ++i) + { + if (m_state->m_events[i] == event) + { + return i; + } + } + return std::numeric_limits::max(); + } + + bool Has(EventType event) const + { + return Find(event) != std::numeric_limits::max(); + } + +private: + struct SharedState + { + mutable std::mutex m_mutex; // consider a fair mutex here + std::vector m_events; + }; + + std::shared_ptr m_state; +}; + +// Default TaskQueue Work timeout if not terminated/cancelled. +// Don't want a number to large so tests don't hang if cancellation/termiantion doesn't work as expected +static constexpr uint32_t kDefaultWorkTimeout{ 10000 }; // 10 seconds in MS + +class CancellableWork : public ITaskQueueWork, public ICancellationListener +{ +public: + static void Run(RunContext&& rc, Event* completionEvent, EventList eventList, uint32_t timeout = kDefaultWorkTimeout) + { + std::shared_ptr work{ new CancellableWork(std::move(rc), completionEvent, eventList) }; + work->m_rc.TaskQueueSubmitWork(work, timeout); + } + + ~CancellableWork() + { + m_rc.CancellationToken().UnregisterForNotificationAndCheck(*this); + m_eventList.PushBack(EventType::TaskQueueWorkDestroyed); + } + +private: + CancellableWork(RunContext&& rc, Event* completionEvent, EventList eventList) : + m_rc{ std::move(rc) }, + m_completionEvent{ completionEvent }, + m_eventList{ std::move(eventList) } + { + bool cancelled = m_rc.CancellationToken().RegisterForNotificationAndCheck(*this); + Assert::IsFalse(cancelled); + } + + void Run() override + { + m_eventList.PushBack(EventType::TaskQueueWorkComplete); + if (m_completionEvent) + { + m_completionEvent->Set(); + } + } + + void WorkCancelled() + { + m_eventList.PushBack(EventType::TaskQueueWorkCancelled); + if (m_completionEvent) + { + m_completionEvent->Set(); + } + } + + void OnCancellation() noexcept override + { + // Cancel submitted work by terminating the TaskQueue + m_rc.TaskQueueTerminate(); + } + + RunContext m_rc; + Event* const m_completionEvent; + EventList m_eventList; +}; + +class UncancellableWork : public ITaskQueueWork +{ +public: + static void Run(RunContext&& rc, Event* completionEvent, EventList eventList, uint32_t timeout = kDefaultWorkTimeout) + { + std::shared_ptr op{ new UncancellableWork(completionEvent, eventList) }; + rc.TaskQueueSubmitWork(op, timeout); + } + + ~UncancellableWork() + { + m_eventList.PushBack(EventType::TaskQueueWorkDestroyed); + } + +private: + UncancellableWork(Event* completionEvent, EventList eventList) : + m_completionEvent{ completionEvent }, + m_eventList{ std::move(eventList) } + { + } + + void Run() override + { + TRACE_VERBOSE(__FUNCTION__); + + m_eventList.PushBack(EventType::TaskQueueWorkComplete); + if (m_completionEvent) + { + m_completionEvent->Set(); + } + } + + void WorkCancelled() + { + TRACE_VERBOSE(__FUNCTION__); + + Sleep(1000); + + m_eventList.PushBack(EventType::TaskQueueWorkComplete); + if (m_completionEvent) + { + m_completionEvent->Set(); + } + } + + Event* const m_completionEvent; + EventList m_eventList; +}; + +class TerminationListener: public ITerminationListener +{ +public: + TerminationListener(EventList eventList) : m_eventList{ std::move(eventList) } + { + } + + Event const& TerminationEvent() const + { + return m_terminationEvent; + } + +private: + void OnTerminated(void* /*context*/) override + { + m_eventList.PushBack(EventType::TerminationComplete); + m_terminationEvent.Set(); + } + + Event m_terminationEvent; + EventList m_eventList; +}; + +class TestProvider : public XAsyncProviderBase +{ +public: + static constexpr uint32_t kOperationResult = 1337; // arbitrary result value for successful operation + + TestProvider(RunContext&& rc, XAsyncBlock* async, EventList* eventList, uint32_t timeout = kDefaultWorkTimeout) : + XAsyncProviderBase{ std::move(rc), async }, + m_eventList{ eventList }, + m_timeout{ timeout } + { + } + + ~TestProvider() + { + if (m_eventList) + { + m_eventList->PushBack(EventType::XAsyncProviderDestroyed); + } + } + + HRESULT Begin(RunContext rc) override + { + rc.TaskQueueSubmitWork(std::shared_ptr{new Work{ *this }}, m_timeout); + return S_OK; + } + + HRESULT GetResult(void* buffer, size_t bufferSize) + { + assert(bufferSize == sizeof(uint32_t)); + UNREFERENCED_PARAMETER(bufferSize); + + uint32_t* resultPtr = static_cast(buffer); + *resultPtr = kOperationResult; + return S_OK; + } + +private: + struct Work : public ITaskQueueWork + { + Work(TestProvider& p) : provider{ p } {} + void Run() override + { + provider.m_eventList->PushBack(EventType::XAsyncProviderCompleted); + provider.Complete(sizeof(uint32_t)); + } + void WorkCancelled() override + { + provider.m_eventList->PushBack(EventType::XAsyncProviderAborted); + provider.Fail(E_ABORT); + } + TestProvider& provider; + }; + + EventList* m_eventList; + uint32_t m_timeout; +}; + + +TEST_CLASS(RunContextTests) +{ +public: + TEST_CLASS_INITIALIZE(Initialize) + { + HCTraceInit(); + HCSettingsSetTraceLevel(HCTraceLevel::Verbose); + HCTraceSetTraceToDebugger(true); + } + + TEST_CLASS_CLEANUP(Cleanup) + { + HCTraceCleanup(); + } + + TEST_METHOD(TerminateSimple) + { + EventList events; + + // Trivially terminate RunContext + RunContext root = RunContext::Root(nullptr); + TerminationListener listener{ events }; + root.Terminate(listener, nullptr); + + Assert::IsTrue(listener.TerminationEvent().Wait()); + Assert::IsTrue(events.Size() == 1); + Assert::IsTrue(events[0] == EventType::TerminationComplete); + } + + TEST_METHOD(TestCancellableWork) + { + Event completionEvent; + EventList events; + RunContext root = RunContext::Root(nullptr); + + // Run work and immediately cancel + CancellableWork::Run(root.Derive(), &completionEvent, events); + root.CancellationToken().Cancel(); + + Assert::IsTrue(completionEvent.Wait()); + Assert::IsTrue(events.Size() >= 1); // TaskQueueWorkDestroyed could also happen, but isn't guaranteed without a terminate + Assert::IsTrue(events[0] == EventType::TaskQueueWorkCancelled); + } + + TEST_METHOD(TestUncancellableWork) + { + Event completionEvent; + EventList events; + RunContext root = RunContext::Root(nullptr); + + // Attempt to cancel uncancellable work + constexpr uint32_t timeout = 1000; // use a short timeout since this should run until timeout + UncancellableWork::Run(root.DeriveOnQueue(nullptr), &completionEvent, events, timeout); + root.CancellationToken().Cancel(); + + Assert::IsTrue(completionEvent.Wait()); + Assert::IsTrue(events.Size() >= 1); // TaskQueueWorkDestroyed could also happen, but isn't guaranteed without a terminate + Assert::IsTrue(events[0] == EventType::TaskQueueWorkComplete); + } + + TEST_METHOD(TestTerminateWithUncancellableWork) + { + EventList events; + RunContext root = RunContext::Root(nullptr); + TerminationListener listener{ events }; + + // Terminate uncancellable work + UncancellableWork::Run(root.DeriveOnQueue(nullptr), nullptr, events); + root.Terminate(listener, nullptr); + + Assert::IsTrue(listener.TerminationEvent().Wait()); + Assert::AreEqual((size_t)3, events.Size()); + // Termination should guarantee everything is destroyed before completing + Assert::IsTrue(events[0] == EventType::TaskQueueWorkComplete); + Assert::IsTrue(events[1] == EventType::TaskQueueWorkDestroyed); + Assert::IsTrue(events[2] == EventType::TerminationComplete); + } + + TEST_METHOD(TestTerminateWithInProgressXAsyncOperation) + { + EventList events; + RunContext rc = RunContext::Root(nullptr); + TerminationListener listener{ events }; + + struct XAsyncContext + { + EventList& events; + Event completionEvent; + HRESULT hr{ E_PENDING }; + uint32_t result{ 0 }; + + static void CALLBACK CompletionCallback(XAsyncBlock* async) + { + auto context = static_cast(async->context); + context->events.PushBack(EventType::XAsyncOperationComplete); + context->hr = XAsyncGetResult(async, nullptr, sizeof(uint32_t), &context->result, nullptr); + context->completionEvent.Set(); + Sleep(1000); + } + } context{ events }; + + XAsyncBlock async{ nullptr, &context, XAsyncContext::CompletionCallback, 0 }; + auto provider = MakeUnique(rc.DeriveOnQueue(nullptr), &async, &events, 1000000); + VERIFY_SUCCEEDED(XAsyncProviderBase::Run(std::move(provider))); + + // Terminate + rc.Terminate(listener, nullptr); + + Assert::IsTrue(listener.TerminationEvent().Wait()); + // SDK only guarantees the clients completion callback is submitted to the TaskQueue before termintaion. If the call is made + // on its on TaskQueue (or a threadpool queue) the callback may not be invoked until after termination. This isn't + // necessarily and issue; its possible we can clean up the provider cleanup can happen before the callback runs. + Assert::IsTrue(context.completionEvent.Wait()); + + Assert::AreEqual((size_t)4, events.Size()); + Assert::IsTrue(context.hr == E_ABORT); + // Provider should always complete the operation first + Assert::IsTrue(events[0] == EventType::XAsyncProviderAborted); + // All cleanup should be done before termination completes + Assert::IsTrue(events.Has(EventType::TerminationComplete) && events.Find(EventType::XAsyncProviderDestroyed) < events.Find(EventType::TerminationComplete)); + Assert::IsTrue(events.Has(EventType::XAsyncOperationComplete)); + } + + TEST_METHOD(TestTerminateWithCompletedXAsyncOperationWithPendingResult) + { + EventList events; + RunContext rc = RunContext::Root(nullptr); + TerminationListener listener{ events }; + + constexpr uint32_t timeout = 2000; // use a short timeout since this should run until timeout + XAsyncBlock async{ nullptr, nullptr, nullptr, 0 }; + auto provider = MakeUnique(rc.DeriveOnQueue(nullptr), &async, &events, timeout); + VERIFY_SUCCEEDED(XAsyncProviderBase::Run(std::move(provider))); + + // Wait for XAsync operation to complete but don't extract result + HRESULT hr = XAsyncGetStatus(&async, true); + VERIFY_SUCCEEDED(hr); + + // Terminate + rc.Terminate(listener, nullptr); + + Assert::IsFalse(listener.TerminationEvent().Wait(1000)); // Terminate shouldn't complete because XAsync result is pending + Assert::IsTrue(events.Size() == 1); + Assert::IsTrue(events[0] == EventType::XAsyncProviderCompleted); + } + +}; + +} // UnitTests +} // PlayFab diff --git a/Test/PlayFabCore.UnitTests/Tests/TokenRefreshTests.cpp b/Test/PlayFabCore.UnitTests/Tests/TokenRefreshTests.cpp new file mode 100644 index 0000000..c619806 --- /dev/null +++ b/Test/PlayFabCore.UnitTests/Tests/TokenRefreshTests.cpp @@ -0,0 +1,193 @@ +#include "stdafx.h" +#include "TestIncludes.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace PlayFab +{ +namespace UnitTests +{ + +TEST_CLASS(TokenRefreshTests) +{ +public: + TEST_METHOD(TokenRefreshSimple) + { + Wrappers::TestSession session; + Wrappers::ServiceConfig<> serviceConfig{ "mockAPIEndpoint", "mockTitleId" }; + + // Mock LoginWithCustomID + PlayFabServiceMock loginMock{ serviceConfig, "LoginWithCustomID" }; + + // Token to assign after refresh + const char refreshedToken[] = "RefreshedToken"; + + loginMock.SetCallback([&](PlayFabServiceMock& mock, std::string, std::string, uint32_t hitCount) + { + if (hitCount == 1) + { + // On the initial Login, set token to expire in 1 minute to trigger a refresh + time_t tokenExpiration = time(nullptr) + 60; + auto tokenExpirationString = TimeTToIso8601String(tokenExpiration); + rapidjson::Value tokenExpirationJson{ tokenExpirationString.data(), PlayFabServiceMock::JsonAllocator() }; + loginMock.ResponseBodyPayload()["EntityToken"].AddMember("TokenExpiration", tokenExpirationJson.Move(), PlayFabServiceMock::JsonAllocator()); + } + else if (hitCount == 2) + { + // On subsequent Login, supply a new, non-expiring token + auto& entityTokenJson = mock.ResponseBodyPayload()["EntityToken"]; + entityTokenJson.RemoveMember("TokenExpiration"); + entityTokenJson["EntityToken"] = rapidjson::Value{ refreshedToken }; + } + else + { + // Login should only be called twice + assert(false); + } + }); + + struct TokenRefreshedHandlerContext + { + Event event; + std::string entityId; + std::string newToken; + } tokenRefreshContext; + + PFRegistrationToken registrationToken{}; + VERIFY_SUCCEEDED(PFEntityRegisterTokenRefreshedEventHandler(nullptr, &tokenRefreshContext, [](void* ctx, const PFEntityKey* entityKey, const PFEntityToken* newToken) + { + auto handlerContext = static_cast(ctx); + handlerContext->entityId = entityKey->id; + handlerContext->newToken = newToken->token; + handlerContext->event.Set(); + }, ®istrationToken)); + + // Synchronously authenticate + PFEntityHandle entityHandle{ nullptr }; + { + XAsyncBlock async{}; + PFAuthenticationLoginWithCustomIDRequest request{}; + VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDAsync(serviceConfig.Handle(), &request, &async)); + VERIFY_SUCCEEDED(XAsyncGetStatus(&async, true)); + VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDGetResult(&async, &entityHandle, 0, nullptr, nullptr, nullptr)); + } + auto entity = Wrappers::Entity<>::Wrap(entityHandle); + + + // Wait for token refreshed event + tokenRefreshContext.event.Wait(); + Assert::AreEqual(tokenRefreshContext.entityId.data(), entity.EntityKey().Model().id); + Assert::AreEqual(tokenRefreshContext.newToken.data(), refreshedToken); + + // Check the new EntityToken cached in the Entity object + { + XAsyncBlock async{}; + VERIFY_SUCCEEDED(PFEntityGetEntityTokenAsync(entity.Handle(), &async)); + + size_t tokenSize; + VERIFY_SUCCEEDED(PFEntityGetEntityTokenResultSize(&async, &tokenSize)); + + std::vector tokenBuffer(tokenSize); + PFEntityToken const* token{}; + VERIFY_SUCCEEDED(PFEntityGetEntityTokenResult(&async, tokenBuffer.size(), tokenBuffer.data(), &token, nullptr)); + + Assert::AreEqual(refreshedToken, token->token); + } + } + + TEST_METHOD(TestTokenExpiredCallback) + { + Wrappers::TestSession session; + Wrappers::ServiceConfig<> serviceConfig{ "mockAPIEndpoint", "mockTitleId" }; + + // Mock LoginWithCustomID + PlayFabServiceMock loginMock{ serviceConfig, "LoginWithCustomID" }; + + // Token to assign after ReLogin + const char newToken[] = "NewEntityToken"; + + loginMock.SetCallback([&](PlayFabServiceMock& mock, std::string, std::string, uint32_t hitCount) + { + if (hitCount == 1) + { + // On the initial Login, set token to expire in 1 minute to trigger a refresh + time_t tokenExpiration = time(nullptr) + 60; + auto tokenExpirationString = TimeTToIso8601String(tokenExpiration); + rapidjson::Value tokenExpirationJson{ tokenExpirationString.data(), PlayFabServiceMock::JsonAllocator() }; + loginMock.ResponseBodyPayload()["EntityToken"].AddMember("TokenExpiration", tokenExpirationJson.Move(), PlayFabServiceMock::JsonAllocator()); + } + else if (hitCount == 2) + { + // On second Login attempt, respond with error + mock.ResponseBody().CopyFrom(PlayFabServiceMock::ServiceErrors()["ExpiredAuthToken"], PlayFabServiceMock::JsonAllocator()); + } + else if (hitCount == 3) + { + // Reset to default response with the new token + mock.ResponseBody().CopyFrom(mock.ServiceResponses()["default"], mock.JsonAllocator()); + mock.ResponseBodyPayload()["EntityToken"]["EntityToken"] = rapidjson::Value{ newToken }; + } + else + { + // Login should only be called 3 times + assert(false); + } + }); + + struct TokenExpiredHandlerContext + { + Event event; + std::string entityId; + } tokenExpiredContext; + + PFRegistrationToken registrationToken{}; + VERIFY_SUCCEEDED(PFEntityRegisterTokenExpiredEventHandler(nullptr, &tokenExpiredContext, [](void* ctx, PFEntityKey const* entityKey) + { + auto handlerContext = static_cast(ctx); + handlerContext->entityId = entityKey->id; + handlerContext->event.Set(); + }, ®istrationToken)); + + // Synchronously authenticate + PFEntityHandle entityHandle{ nullptr }; + { + XAsyncBlock async{}; + PFAuthenticationLoginWithCustomIDRequest request{}; + VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDAsync(serviceConfig.Handle(), &request, &async)); + VERIFY_SUCCEEDED(XAsyncGetStatus(&async, true)); + VERIFY_SUCCEEDED(PFAuthenticationLoginWithCustomIDGetResult(&async, &entityHandle, 0, nullptr, nullptr, nullptr)); + } + auto entity = Wrappers::Entity<>::Wrap(entityHandle); + + // Wait for token expired event + tokenExpiredContext.event.Wait(); + Assert::AreEqual(tokenExpiredContext.entityId.data(), entity.EntityKey().Model().id); + + // Synchronously reauthenticate + { + XAsyncBlock async{}; + PFAuthenticationLoginWithCustomIDRequest request{}; + VERIFY_SUCCEEDED(PFAuthenticationReLoginWithCustomIDAsync(entity.Handle(), &request, &async)); + VERIFY_SUCCEEDED(XAsyncGetStatus(&async, true)); + } + + // Check the new EntityToken + { + XAsyncBlock async{}; + VERIFY_SUCCEEDED(PFEntityGetEntityTokenAsync(entity.Handle(), &async)); + + size_t tokenSize; + VERIFY_SUCCEEDED(PFEntityGetEntityTokenResultSize(&async, &tokenSize)); + + std::vector tokenBuffer(tokenSize); + PFEntityToken const* token{}; + VERIFY_SUCCEEDED(PFEntityGetEntityTokenResult(&async, tokenBuffer.size(), tokenBuffer.data(), &token, nullptr)); + + Assert::AreEqual(newToken, token->token); + } + } + +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.cpp new file mode 100644 index 0000000..521a836 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.cpp @@ -0,0 +1,2225 @@ +#include "TestAppPch.h" +#include "AccountManagementOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + +#if 0 + +ClientAddOrUpdateContactEmailOperation::ClientAddOrUpdateContactEmailOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientAddOrUpdateContactEmailOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientAddOrUpdateContactEmailOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientAddOrUpdateContactEmailAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientAddUsernamePasswordOperation::ClientAddUsernamePasswordOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientAddUsernamePasswordOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientAddUsernamePasswordOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientAddUsernamePasswordAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientAddUsernamePasswordOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientAddUsernamePasswordGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementAddUsernamePasswordResult* result; + RETURN_IF_FAILED(PFAccountManagementClientAddUsernamePasswordGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + + +ClientGetAccountInfoOperation::ClientGetAccountInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetAccountInfoOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetAccountInfoOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetAccountInfoAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetAccountInfoOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetAccountInfoGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetAccountInfoResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetAccountInfoGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetPlayerCombinedInfoOperation::ClientGetPlayerCombinedInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayerCombinedInfoOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayerCombinedInfoOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayerCombinedInfoAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayerCombinedInfoOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayerCombinedInfoGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayerCombinedInfoResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayerCombinedInfoGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetPlayerProfileOperation::ClientGetPlayerProfileOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayerProfileOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayerProfileOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayerProfileAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayerProfileOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayerProfileGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayerProfileResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayerProfileGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if 0 + +ClientGetPlayFabIDsFromFacebookIDsOperation::ClientGetPlayFabIDsFromFacebookIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromFacebookIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromFacebookIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromFacebookIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromFacebookIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromFacebookIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromFacebookIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromFacebookIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetPlayFabIDsFromFacebookInstantGamesIdsOperation::ClientGetPlayFabIDsFromFacebookInstantGamesIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromFacebookInstantGamesIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromFacebookInstantGamesIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromFacebookInstantGamesIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromFacebookInstantGamesIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetPlayFabIDsFromGameCenterIDsOperation::ClientGetPlayFabIDsFromGameCenterIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromGameCenterIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromGameCenterIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromGameCenterIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromGameCenterIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromGameCenterIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetPlayFabIDsFromGoogleIDsOperation::ClientGetPlayFabIDsFromGoogleIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromGoogleIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromGoogleIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromGoogleIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromGoogleIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromGoogleIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromGoogleIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromGoogleIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsOperation::ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetPlayFabIDsFromKongregateIDsOperation::ClientGetPlayFabIDsFromKongregateIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromKongregateIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromKongregateIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromKongregateIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromKongregateIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromKongregateIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromKongregateIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromKongregateIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + +ClientGetPlayFabIDsFromNintendoServiceAccountIdsOperation::ClientGetPlayFabIDsFromNintendoServiceAccountIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromNintendoServiceAccountIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromNintendoServiceAccountIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromNintendoServiceAccountIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromNintendoServiceAccountIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::ClientGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + +ClientGetPlayFabIDsFromPSNAccountIDsOperation::ClientGetPlayFabIDsFromPSNAccountIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromPSNAccountIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromPSNAccountIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromPSNAccountIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromPSNAccountIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 + +ClientGetPlayFabIDsFromSteamIDsOperation::ClientGetPlayFabIDsFromSteamIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromSteamIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromSteamIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromSteamIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromSteamIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromSteamIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromSteamIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromSteamIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetPlayFabIDsFromTwitchIDsOperation::ClientGetPlayFabIDsFromTwitchIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromTwitchIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromTwitchIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromTwitchIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromTwitchIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromTwitchIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromTwitchIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromTwitchIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +ClientGetPlayFabIDsFromXboxLiveIDsOperation::ClientGetPlayFabIDsFromXboxLiveIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayFabIDsFromXboxLiveIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayFabIDsFromXboxLiveIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayFabIDsFromXboxLiveIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementClientGetPlayFabIDsFromXboxLiveIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientLinkAndroidDeviceIDOperation::ClientLinkAndroidDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkAndroidDeviceIDOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkAndroidDeviceIDOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkAndroidDeviceIDAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkAppleOperation::ClientLinkAppleOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkAppleOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkAppleOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkAppleAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +ClientLinkCustomIDOperation::ClientLinkCustomIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkCustomIDOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkCustomIDOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkCustomIDAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if 0 + +ClientLinkFacebookAccountOperation::ClientLinkFacebookAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkFacebookAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkFacebookAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkFacebookAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkFacebookInstantGamesIdOperation::ClientLinkFacebookInstantGamesIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkFacebookInstantGamesIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkFacebookInstantGamesIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkFacebookInstantGamesIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkGameCenterAccountOperation::ClientLinkGameCenterAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkGameCenterAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkGameCenterAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkGameCenterAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkGoogleAccountOperation::ClientLinkGoogleAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkGoogleAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkGoogleAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkGoogleAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkGooglePlayGamesServicesAccountOperation::ClientLinkGooglePlayGamesServicesAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkGooglePlayGamesServicesAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkGooglePlayGamesServicesAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkGooglePlayGamesServicesAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkIOSDeviceIDOperation::ClientLinkIOSDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkIOSDeviceIDOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkIOSDeviceIDOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkIOSDeviceIDAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkKongregateOperation::ClientLinkKongregateOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkKongregateOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkKongregateOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkKongregateAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + +ClientLinkNintendoServiceAccountOperation::ClientLinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkNintendoServiceAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkNintendoServiceAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkNintendoServiceAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkNintendoSwitchDeviceIdOperation::ClientLinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkNintendoSwitchDeviceIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkNintendoSwitchDeviceIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkNintendoSwitchDeviceIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +ClientLinkOpenIdConnectOperation::ClientLinkOpenIdConnectOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkOpenIdConnectOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkOpenIdConnectOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkOpenIdConnectAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + +ClientLinkPSNAccountOperation::ClientLinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkPSNAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkPSNAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkPSNAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 + +ClientLinkSteamAccountOperation::ClientLinkSteamAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkSteamAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkSteamAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkSteamAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientLinkTwitchOperation::ClientLinkTwitchOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkTwitchOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkTwitchOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkTwitchAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +ClientLinkXboxAccountOperation::ClientLinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientLinkXboxAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientLinkXboxAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientLinkXboxAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientRemoveContactEmailOperation::ClientRemoveContactEmailOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientRemoveContactEmailOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientRemoveContactEmailOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientRemoveContactEmailAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +ClientReportPlayerOperation::ClientReportPlayerOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientReportPlayerOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientReportPlayerOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientReportPlayerAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientReportPlayerOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFAccountManagementReportPlayerClientResult result{}; + RETURN_IF_FAILED(PFAccountManagementClientReportPlayerGetResult(async, &result)); + return ResultType{ result }; +} + +#if 0 + +ClientSendAccountRecoveryEmailOperation::ClientSendAccountRecoveryEmailOperation(ServiceConfig serviceConfig, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientSendAccountRecoveryEmailOperation::Run(ServiceConfig serviceConfig, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(serviceConfig), std::move(request), std::move(rc))); +} + +HRESULT ClientSendAccountRecoveryEmailOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientSendAccountRecoveryEmailAsync(m_serviceConfig.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkAndroidDeviceIDOperation::ClientUnlinkAndroidDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkAndroidDeviceIDOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkAndroidDeviceIDOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkAndroidDeviceIDAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkAppleOperation::ClientUnlinkAppleOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkAppleOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkAppleOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkAppleAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +ClientUnlinkCustomIDOperation::ClientUnlinkCustomIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkCustomIDOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkCustomIDOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkCustomIDAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if 0 + +ClientUnlinkFacebookAccountOperation::ClientUnlinkFacebookAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkFacebookAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkFacebookAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkFacebookAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkFacebookInstantGamesIdOperation::ClientUnlinkFacebookInstantGamesIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkFacebookInstantGamesIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkFacebookInstantGamesIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkFacebookInstantGamesIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkGameCenterAccountOperation::ClientUnlinkGameCenterAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkGameCenterAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkGameCenterAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkGameCenterAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkGoogleAccountOperation::ClientUnlinkGoogleAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkGoogleAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkGoogleAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkGoogleAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkGooglePlayGamesServicesAccountOperation::ClientUnlinkGooglePlayGamesServicesAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkGooglePlayGamesServicesAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkGooglePlayGamesServicesAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkGooglePlayGamesServicesAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkIOSDeviceIDOperation::ClientUnlinkIOSDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkIOSDeviceIDOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkIOSDeviceIDOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkIOSDeviceIDAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkKongregateOperation::ClientUnlinkKongregateOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkKongregateOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkKongregateOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkKongregateAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + +ClientUnlinkNintendoServiceAccountOperation::ClientUnlinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkNintendoServiceAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkNintendoServiceAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkNintendoServiceAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkNintendoSwitchDeviceIdOperation::ClientUnlinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkNintendoSwitchDeviceIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkNintendoSwitchDeviceIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkNintendoSwitchDeviceIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +ClientUnlinkOpenIdConnectOperation::ClientUnlinkOpenIdConnectOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkOpenIdConnectOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkOpenIdConnectOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkOpenIdConnectAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + +ClientUnlinkPSNAccountOperation::ClientUnlinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkPSNAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkPSNAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkPSNAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 + +ClientUnlinkSteamAccountOperation::ClientUnlinkSteamAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkSteamAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkSteamAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkSteamAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientUnlinkTwitchOperation::ClientUnlinkTwitchOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkTwitchOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkTwitchOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkTwitchAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +ClientUnlinkXboxAccountOperation::ClientUnlinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUnlinkXboxAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUnlinkXboxAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUnlinkXboxAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +ClientUpdateAvatarUrlOperation::ClientUpdateAvatarUrlOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUpdateAvatarUrlOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUpdateAvatarUrlOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUpdateAvatarUrlAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if 0 + +ClientUpdateUserTitleDisplayNameOperation::ClientUpdateUserTitleDisplayNameOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUpdateUserTitleDisplayNameOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUpdateUserTitleDisplayNameOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementClientUpdateUserTitleDisplayNameAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientUpdateUserTitleDisplayNameOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementClientUpdateUserTitleDisplayNameGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementUpdateUserTitleDisplayNameResult* result; + RETURN_IF_FAILED(PFAccountManagementClientUpdateUserTitleDisplayNameGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerBanUsersOperation::ServerBanUsersOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerBanUsersOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerBanUsersOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerBanUsersAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerBanUsersOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerBanUsersGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementBanUsersResult* result; + RETURN_IF_FAILED(PFAccountManagementServerBanUsersGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerDeletePlayerOperation::ServerDeletePlayerOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerDeletePlayerOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerDeletePlayerOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerDeletePlayerAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerGetPlayerCombinedInfoOperation::ServerGetPlayerCombinedInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayerCombinedInfoOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayerCombinedInfoOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayerCombinedInfoAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayerCombinedInfoOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayerCombinedInfoGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayerCombinedInfoResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayerCombinedInfoGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayerProfileOperation::ServerGetPlayerProfileOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayerProfileOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayerProfileOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayerProfileAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayerProfileOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayerProfileGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayerProfileResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayerProfileGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromFacebookIDsOperation::ServerGetPlayFabIDsFromFacebookIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromFacebookIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromFacebookIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromFacebookIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromFacebookIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromFacebookIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromFacebookIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromFacebookIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromFacebookInstantGamesIdsOperation::ServerGetPlayFabIDsFromFacebookInstantGamesIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromFacebookInstantGamesIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromFacebookInstantGamesIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromFacebookInstantGamesIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromFacebookInstantGamesIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromNintendoServiceAccountIdsOperation::ServerGetPlayFabIDsFromNintendoServiceAccountIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromNintendoServiceAccountIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromNintendoServiceAccountIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromNintendoServiceAccountIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromNintendoServiceAccountIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::ServerGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromNintendoSwitchDeviceIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromPSNAccountIDsOperation::ServerGetPlayFabIDsFromPSNAccountIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromPSNAccountIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromPSNAccountIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromPSNAccountIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromPSNAccountIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromSteamIDsOperation::ServerGetPlayFabIDsFromSteamIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromSteamIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromSteamIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromSteamIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromSteamIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromSteamIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromSteamIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromSteamIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromTwitchIDsOperation::ServerGetPlayFabIDsFromTwitchIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromTwitchIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromTwitchIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromTwitchIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromTwitchIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromTwitchIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromTwitchIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromTwitchIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayFabIDsFromXboxLiveIDsOperation::ServerGetPlayFabIDsFromXboxLiveIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayFabIDsFromXboxLiveIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayFabIDsFromXboxLiveIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayFabIDsFromXboxLiveIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetPlayFabIDsFromXboxLiveIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetServerCustomIDsFromPlayFabIDsOperation::ServerGetServerCustomIDsFromPlayFabIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetServerCustomIDsFromPlayFabIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetServerCustomIDsFromPlayFabIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetServerCustomIDsFromPlayFabIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetServerCustomIDsFromPlayFabIDsResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetServerCustomIDsFromPlayFabIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetUserAccountInfoOperation::ServerGetUserAccountInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserAccountInfoOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserAccountInfoOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetUserAccountInfoAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserAccountInfoOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetUserAccountInfoGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetUserAccountInfoResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetUserAccountInfoGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetUserBansOperation::ServerGetUserBansOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserBansOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserBansOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerGetUserBansAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserBansOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerGetUserBansGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetUserBansResult* result; + RETURN_IF_FAILED(PFAccountManagementServerGetUserBansGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerLinkNintendoServiceAccountOperation::ServerLinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerLinkNintendoServiceAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerLinkNintendoServiceAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerLinkNintendoServiceAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerLinkNintendoSwitchDeviceIdOperation::ServerLinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerLinkNintendoSwitchDeviceIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerLinkNintendoSwitchDeviceIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerLinkNintendoSwitchDeviceIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerLinkPSNAccountOperation::ServerLinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerLinkPSNAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerLinkPSNAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerLinkPSNAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerLinkPSNIdOperation::ServerLinkPSNIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerLinkPSNIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerLinkPSNIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerLinkPSNIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerLinkServerCustomIdOperation::ServerLinkServerCustomIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerLinkServerCustomIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerLinkServerCustomIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerLinkServerCustomIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerLinkSteamIdOperation::ServerLinkSteamIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerLinkSteamIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerLinkSteamIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerLinkSteamIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerLinkXboxAccountOperation::ServerLinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerLinkXboxAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerLinkXboxAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerLinkXboxAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerRevokeAllBansForUserOperation::ServerRevokeAllBansForUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerRevokeAllBansForUserOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerRevokeAllBansForUserOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerRevokeAllBansForUserAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerRevokeAllBansForUserOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerRevokeAllBansForUserGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementRevokeAllBansForUserResult* result; + RETURN_IF_FAILED(PFAccountManagementServerRevokeAllBansForUserGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerRevokeBansOperation::ServerRevokeBansOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerRevokeBansOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerRevokeBansOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerRevokeBansAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerRevokeBansOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerRevokeBansGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementRevokeBansResult* result; + RETURN_IF_FAILED(PFAccountManagementServerRevokeBansGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerSendCustomAccountRecoveryEmailOperation::ServerSendCustomAccountRecoveryEmailOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSendCustomAccountRecoveryEmailOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSendCustomAccountRecoveryEmailOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerSendCustomAccountRecoveryEmailAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerSendEmailFromTemplateOperation::ServerSendEmailFromTemplateOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSendEmailFromTemplateOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSendEmailFromTemplateOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerSendEmailFromTemplateAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUnlinkNintendoServiceAccountOperation::ServerUnlinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUnlinkNintendoServiceAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUnlinkNintendoServiceAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUnlinkNintendoServiceAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUnlinkNintendoSwitchDeviceIdOperation::ServerUnlinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUnlinkNintendoSwitchDeviceIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUnlinkNintendoSwitchDeviceIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUnlinkNintendoSwitchDeviceIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUnlinkPSNAccountOperation::ServerUnlinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUnlinkPSNAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUnlinkPSNAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUnlinkPSNAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUnlinkServerCustomIdOperation::ServerUnlinkServerCustomIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUnlinkServerCustomIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUnlinkServerCustomIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUnlinkServerCustomIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUnlinkSteamIdOperation::ServerUnlinkSteamIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUnlinkSteamIdOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUnlinkSteamIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUnlinkSteamIdAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUnlinkXboxAccountOperation::ServerUnlinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUnlinkXboxAccountOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUnlinkXboxAccountOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUnlinkXboxAccountAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUpdateAvatarUrlOperation::ServerUpdateAvatarUrlOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateAvatarUrlOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateAvatarUrlOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUpdateAvatarUrlAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerUpdateBansOperation::ServerUpdateBansOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateBansOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateBansOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementServerUpdateBansAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateBansOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementServerUpdateBansGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementUpdateBansResult* result; + RETURN_IF_FAILED(PFAccountManagementServerUpdateBansGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +GetTitlePlayersFromXboxLiveIDsOperation::GetTitlePlayersFromXboxLiveIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetTitlePlayersFromXboxLiveIDsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetTitlePlayersFromXboxLiveIDsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAccountManagementGetTitlePlayersFromXboxLiveIDsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetTitlePlayersFromXboxLiveIDsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFAccountManagementGetTitlePlayersFromXboxLiveIDsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFAccountManagementGetTitlePlayersFromProviderIDsResponse* result; + RETURN_IF_FAILED(PFAccountManagementGetTitlePlayersFromXboxLiveIDsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.h new file mode 100644 index 0000000..cf4bb7d --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/AccountManagementOperations.h @@ -0,0 +1,1704 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +#if 0 +class ClientAddOrUpdateContactEmailOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementAddOrUpdateContactEmailRequestWrapper; + + ClientAddOrUpdateContactEmailOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientAddUsernamePasswordOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementAddUsernamePasswordRequestWrapper; + using ResultType = Wrappers::PFAccountManagementAddUsernamePasswordResultWrapper; + + ClientAddUsernamePasswordOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class ClientGetAccountInfoOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetAccountInfoRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetAccountInfoResultWrapper; + + ClientGetAccountInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetPlayerCombinedInfoOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayerCombinedInfoRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayerCombinedInfoResultWrapper; + + ClientGetPlayerCombinedInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetPlayerProfileOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayerProfileRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayerProfileResultWrapper; + + ClientGetPlayerProfileOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ClientGetPlayFabIDsFromFacebookIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper; + + ClientGetPlayFabIDsFromFacebookIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetPlayFabIDsFromFacebookInstantGamesIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper; + + ClientGetPlayFabIDsFromFacebookInstantGamesIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetPlayFabIDsFromGameCenterIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromGameCenterIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromGameCenterIDsResultWrapper; + + ClientGetPlayFabIDsFromGameCenterIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetPlayFabIDsFromGoogleIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromGoogleIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromGoogleIDsResultWrapper; + + ClientGetPlayFabIDsFromGoogleIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultWrapper; + + ClientGetPlayFabIDsFromGooglePlayGamesPlayerIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetPlayFabIDsFromKongregateIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromKongregateIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromKongregateIDsResultWrapper; + + ClientGetPlayFabIDsFromKongregateIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +class ClientGetPlayFabIDsFromNintendoServiceAccountIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper; + + ClientGetPlayFabIDsFromNintendoServiceAccountIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper; + + ClientGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +class ClientGetPlayFabIDsFromPSNAccountIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper; + + ClientGetPlayFabIDsFromPSNAccountIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +class ClientGetPlayFabIDsFromSteamIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper; + + ClientGetPlayFabIDsFromSteamIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetPlayFabIDsFromTwitchIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper; + + ClientGetPlayFabIDsFromTwitchIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +class ClientGetPlayFabIDsFromXboxLiveIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper; + + ClientGetPlayFabIDsFromXboxLiveIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkAndroidDeviceIDOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkAndroidDeviceIDRequestWrapper; + + ClientLinkAndroidDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkAppleOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkAppleRequestWrapper; + + ClientLinkAppleOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class ClientLinkCustomIDOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkCustomIDRequestWrapper; + + ClientLinkCustomIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ClientLinkFacebookAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkFacebookAccountRequestWrapper; + + ClientLinkFacebookAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkFacebookInstantGamesIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkFacebookInstantGamesIdRequestWrapper; + + ClientLinkFacebookInstantGamesIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkGameCenterAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkGameCenterAccountRequestWrapper; + + ClientLinkGameCenterAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkGoogleAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkGoogleAccountRequestWrapper; + + ClientLinkGoogleAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkGooglePlayGamesServicesAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkGooglePlayGamesServicesAccountRequestWrapper; + + ClientLinkGooglePlayGamesServicesAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkIOSDeviceIDOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkIOSDeviceIDRequestWrapper; + + ClientLinkIOSDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkKongregateOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkKongregateAccountRequestWrapper; + + ClientLinkKongregateOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +class ClientLinkNintendoServiceAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientLinkNintendoServiceAccountRequestWrapper; + + ClientLinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkNintendoSwitchDeviceIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientLinkNintendoSwitchDeviceIdRequestWrapper; + + ClientLinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class ClientLinkOpenIdConnectOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkOpenIdConnectRequestWrapper; + + ClientLinkOpenIdConnectOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +class ClientLinkPSNAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientLinkPSNAccountRequestWrapper; + + ClientLinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +class ClientLinkSteamAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkSteamAccountRequestWrapper; + + ClientLinkSteamAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientLinkTwitchOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkTwitchAccountRequestWrapper; + + ClientLinkTwitchOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +class ClientLinkXboxAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientLinkXboxAccountRequestWrapper; + + ClientLinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientRemoveContactEmailOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementRemoveContactEmailRequestWrapper; + + ClientRemoveContactEmailOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class ClientReportPlayerOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementReportPlayerClientRequestWrapper; + using ResultType = Wrappers::PFAccountManagementReportPlayerClientResultWrapper; + + ClientReportPlayerOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ClientSendAccountRecoveryEmailOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementSendAccountRecoveryEmailRequestWrapper; + + ClientSendAccountRecoveryEmailOperation(ServiceConfig serviceConfig, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(ServiceConfig serviceConfig, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkAndroidDeviceIDOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkAndroidDeviceIDRequestWrapper; + + ClientUnlinkAndroidDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkAppleOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkAppleRequestWrapper; + + ClientUnlinkAppleOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class ClientUnlinkCustomIDOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkCustomIDRequestWrapper; + + ClientUnlinkCustomIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ClientUnlinkFacebookAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkFacebookAccountRequestWrapper; + + ClientUnlinkFacebookAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkFacebookInstantGamesIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkFacebookInstantGamesIdRequestWrapper; + + ClientUnlinkFacebookInstantGamesIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkGameCenterAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkGameCenterAccountRequestWrapper; + + ClientUnlinkGameCenterAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkGoogleAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkGoogleAccountRequestWrapper; + + ClientUnlinkGoogleAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkGooglePlayGamesServicesAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkGooglePlayGamesServicesAccountRequestWrapper; + + ClientUnlinkGooglePlayGamesServicesAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkIOSDeviceIDOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkIOSDeviceIDRequestWrapper; + + ClientUnlinkIOSDeviceIDOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkKongregateOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkKongregateAccountRequestWrapper; + + ClientUnlinkKongregateOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +class ClientUnlinkNintendoServiceAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientUnlinkNintendoServiceAccountRequestWrapper; + + ClientUnlinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkNintendoSwitchDeviceIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientUnlinkNintendoSwitchDeviceIdRequestWrapper; + + ClientUnlinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class ClientUnlinkOpenIdConnectOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkOpenIdConnectRequestWrapper; + + ClientUnlinkOpenIdConnectOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +class ClientUnlinkPSNAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientUnlinkPSNAccountRequestWrapper; + + ClientUnlinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +class ClientUnlinkSteamAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkSteamAccountRequestWrapper; + + ClientUnlinkSteamAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUnlinkTwitchOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkTwitchAccountRequestWrapper; + + ClientUnlinkTwitchOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +class ClientUnlinkXboxAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientUnlinkXboxAccountRequestWrapper; + + ClientUnlinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class ClientUpdateAvatarUrlOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementClientUpdateAvatarUrlRequestWrapper; + + ClientUpdateAvatarUrlOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ClientUpdateUserTitleDisplayNameOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementUpdateUserTitleDisplayNameRequestWrapper; + using ResultType = Wrappers::PFAccountManagementUpdateUserTitleDisplayNameResultWrapper; + + ClientUpdateUserTitleDisplayNameOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerBanUsersOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementBanUsersRequestWrapper; + using ResultType = Wrappers::PFAccountManagementBanUsersResultWrapper; + + ServerBanUsersOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerDeletePlayerOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementDeletePlayerRequestWrapper; + + ServerDeletePlayerOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayerCombinedInfoOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayerCombinedInfoRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayerCombinedInfoResultWrapper; + + ServerGetPlayerCombinedInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayerProfileOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayerProfileRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayerProfileResultWrapper; + + ServerGetPlayerProfileOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromFacebookIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookIDsResultWrapper; + + ServerGetPlayFabIDsFromFacebookIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromFacebookInstantGamesIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromFacebookInstantGamesIdsResultWrapper; + + ServerGetPlayFabIDsFromFacebookInstantGamesIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromNintendoServiceAccountIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoServiceAccountIdsResultWrapper; + + ServerGetPlayFabIDsFromNintendoServiceAccountIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromNintendoSwitchDeviceIdsResultWrapper; + + ServerGetPlayFabIDsFromNintendoSwitchDeviceIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromPSNAccountIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromPSNAccountIDsResultWrapper; + + ServerGetPlayFabIDsFromPSNAccountIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromSteamIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromSteamIDsResultWrapper; + + ServerGetPlayFabIDsFromSteamIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromTwitchIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromTwitchIDsResultWrapper; + + ServerGetPlayFabIDsFromTwitchIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayFabIDsFromXboxLiveIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetPlayFabIDsFromXboxLiveIDsResultWrapper; + + ServerGetPlayFabIDsFromXboxLiveIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetServerCustomIDsFromPlayFabIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetServerCustomIDsFromPlayFabIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetServerCustomIDsFromPlayFabIDsResultWrapper; + + ServerGetServerCustomIDsFromPlayFabIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetUserAccountInfoOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetUserAccountInfoRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetUserAccountInfoResultWrapper; + + ServerGetUserAccountInfoOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetUserBansOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetUserBansRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetUserBansResultWrapper; + + ServerGetUserBansOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerLinkNintendoServiceAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerLinkNintendoServiceAccountRequestWrapper; + + ServerLinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerLinkNintendoSwitchDeviceIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerLinkNintendoSwitchDeviceIdRequestWrapper; + + ServerLinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerLinkPSNAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerLinkPSNAccountRequestWrapper; + + ServerLinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerLinkPSNIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkPSNIdRequestWrapper; + + ServerLinkPSNIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerLinkServerCustomIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkServerCustomIdRequestWrapper; + + ServerLinkServerCustomIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerLinkSteamIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementLinkSteamIdRequestWrapper; + + ServerLinkSteamIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerLinkXboxAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerLinkXboxAccountRequestWrapper; + + ServerLinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerRevokeAllBansForUserOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementRevokeAllBansForUserRequestWrapper; + using ResultType = Wrappers::PFAccountManagementRevokeAllBansForUserResultWrapper; + + ServerRevokeAllBansForUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerRevokeBansOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementRevokeBansRequestWrapper; + using ResultType = Wrappers::PFAccountManagementRevokeBansResultWrapper; + + ServerRevokeBansOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerSendCustomAccountRecoveryEmailOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementSendCustomAccountRecoveryEmailRequestWrapper; + + ServerSendCustomAccountRecoveryEmailOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerSendEmailFromTemplateOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementSendEmailFromTemplateRequestWrapper; + + ServerSendEmailFromTemplateOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUnlinkNintendoServiceAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerUnlinkNintendoServiceAccountRequestWrapper; + + ServerUnlinkNintendoServiceAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUnlinkNintendoSwitchDeviceIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerUnlinkNintendoSwitchDeviceIdRequestWrapper; + + ServerUnlinkNintendoSwitchDeviceIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUnlinkPSNAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerUnlinkPSNAccountRequestWrapper; + + ServerUnlinkPSNAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUnlinkServerCustomIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkServerCustomIdRequestWrapper; + + ServerUnlinkServerCustomIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUnlinkSteamIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementUnlinkSteamIdRequestWrapper; + + ServerUnlinkSteamIdOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUnlinkXboxAccountOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerUnlinkXboxAccountRequestWrapper; + + ServerUnlinkXboxAccountOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateAvatarUrlOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAccountManagementServerUpdateAvatarUrlRequestWrapper; + + ServerUpdateAvatarUrlOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateBansOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementUpdateBansRequestWrapper; + using ResultType = Wrappers::PFAccountManagementUpdateBansResultWrapper; + + ServerUpdateBansOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class GetTitlePlayersFromXboxLiveIDsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFAccountManagementGetTitlePlayersFromXboxLiveIDsRequestWrapper; + using ResultType = Wrappers::PFAccountManagementGetTitlePlayersFromProviderIDsResponseWrapper; + + GetTitlePlayersFromXboxLiveIDsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.cpp new file mode 100644 index 0000000..6ac2e73 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.cpp @@ -0,0 +1,661 @@ +#include "TestAppPch.h" +#include "CatalogOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +CreateDraftItemOperation::CreateDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp CreateDraftItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT CreateDraftItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogCreateDraftItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result CreateDraftItemOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogCreateDraftItemGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogCreateDraftItemResponse* result; + RETURN_IF_FAILED(PFCatalogCreateDraftItemGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +CreateUploadUrlsOperation::CreateUploadUrlsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp CreateUploadUrlsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT CreateUploadUrlsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogCreateUploadUrlsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result CreateUploadUrlsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogCreateUploadUrlsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogCreateUploadUrlsResponse* result; + RETURN_IF_FAILED(PFCatalogCreateUploadUrlsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if 0 + +DeleteEntityItemReviewsOperation::DeleteEntityItemReviewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp DeleteEntityItemReviewsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT DeleteEntityItemReviewsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogDeleteEntityItemReviewsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +DeleteItemOperation::DeleteItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp DeleteItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT DeleteItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogDeleteItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if 0 + +GetCatalogConfigOperation::GetCatalogConfigOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetCatalogConfigOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetCatalogConfigOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetCatalogConfigAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetCatalogConfigOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetCatalogConfigGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetCatalogConfigResponse* result; + RETURN_IF_FAILED(PFCatalogGetCatalogConfigGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + + +GetDraftItemOperation::GetDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetDraftItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetDraftItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetDraftItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetDraftItemOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetDraftItemGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetDraftItemResponse* result; + RETURN_IF_FAILED(PFCatalogGetDraftItemGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetDraftItemsOperation::GetDraftItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetDraftItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetDraftItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetDraftItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetDraftItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetDraftItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetDraftItemsResponse* result; + RETURN_IF_FAILED(PFCatalogGetDraftItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetEntityDraftItemsOperation::GetEntityDraftItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetEntityDraftItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetEntityDraftItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetEntityDraftItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetEntityDraftItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetEntityDraftItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetEntityDraftItemsResponse* result; + RETURN_IF_FAILED(PFCatalogGetEntityDraftItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetEntityItemReviewOperation::GetEntityItemReviewOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetEntityItemReviewOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetEntityItemReviewOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetEntityItemReviewAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetEntityItemReviewOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetEntityItemReviewGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetEntityItemReviewResponse* result; + RETURN_IF_FAILED(PFCatalogGetEntityItemReviewGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetItemOperation::GetItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetItemOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetItemGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetItemResponse* result; + RETURN_IF_FAILED(PFCatalogGetItemGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetItemContainersOperation::GetItemContainersOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetItemContainersOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetItemContainersOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetItemContainersAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetItemContainersOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetItemContainersGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetItemContainersResponse* result; + RETURN_IF_FAILED(PFCatalogGetItemContainersGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if 0 + +GetItemModerationStateOperation::GetItemModerationStateOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetItemModerationStateOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetItemModerationStateOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetItemModerationStateAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetItemModerationStateOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetItemModerationStateGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetItemModerationStateResponse* result; + RETURN_IF_FAILED(PFCatalogGetItemModerationStateGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + + +GetItemPublishStatusOperation::GetItemPublishStatusOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetItemPublishStatusOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetItemPublishStatusOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetItemPublishStatusAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetItemPublishStatusOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetItemPublishStatusGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetItemPublishStatusResponse* result; + RETURN_IF_FAILED(PFCatalogGetItemPublishStatusGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetItemReviewsOperation::GetItemReviewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetItemReviewsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetItemReviewsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetItemReviewsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetItemReviewsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetItemReviewsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetItemReviewsResponse* result; + RETURN_IF_FAILED(PFCatalogGetItemReviewsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetItemReviewSummaryOperation::GetItemReviewSummaryOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetItemReviewSummaryOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetItemReviewSummaryOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetItemReviewSummaryAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetItemReviewSummaryOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetItemReviewSummaryGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetItemReviewSummaryResponse* result; + RETURN_IF_FAILED(PFCatalogGetItemReviewSummaryGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetItemsOperation::GetItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogGetItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogGetItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogGetItemsResponse* result; + RETURN_IF_FAILED(PFCatalogGetItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +PublishDraftItemOperation::PublishDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp PublishDraftItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT PublishDraftItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogPublishDraftItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +ReportItemOperation::ReportItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ReportItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ReportItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogReportItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +ReportItemReviewOperation::ReportItemReviewOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ReportItemReviewOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ReportItemReviewOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogReportItemReviewAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +ReviewItemOperation::ReviewItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ReviewItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ReviewItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogReviewItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +SearchItemsOperation::SearchItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp SearchItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT SearchItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogSearchItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result SearchItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogSearchItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogSearchItemsResponse* result; + RETURN_IF_FAILED(PFCatalogSearchItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if 0 + +SetItemModerationStateOperation::SetItemModerationStateOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp SetItemModerationStateOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT SetItemModerationStateOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogSetItemModerationStateAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +SubmitItemReviewVoteOperation::SubmitItemReviewVoteOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp SubmitItemReviewVoteOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT SubmitItemReviewVoteOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogSubmitItemReviewVoteAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if 0 + +TakedownItemReviewsOperation::TakedownItemReviewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp TakedownItemReviewsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT TakedownItemReviewsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogTakedownItemReviewsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +UpdateCatalogConfigOperation::UpdateCatalogConfigOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp UpdateCatalogConfigOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT UpdateCatalogConfigOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogUpdateCatalogConfigAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + + +UpdateDraftItemOperation::UpdateDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp UpdateDraftItemOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT UpdateDraftItemOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCatalogUpdateDraftItemAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result UpdateDraftItemOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCatalogUpdateDraftItemGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCatalogUpdateDraftItemResponse* result; + RETURN_IF_FAILED(PFCatalogUpdateDraftItemGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.h new file mode 100644 index 0000000..b404750 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/CatalogOperations.h @@ -0,0 +1,472 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class CreateDraftItemOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogCreateDraftItemRequestWrapper; + using ResultType = Wrappers::PFCatalogCreateDraftItemResponseWrapper; + + CreateDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class CreateUploadUrlsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogCreateUploadUrlsRequestWrapper; + using ResultType = Wrappers::PFCatalogCreateUploadUrlsResponseWrapper; + + CreateUploadUrlsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class DeleteEntityItemReviewsOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogDeleteEntityItemReviewsRequestWrapper; + + DeleteEntityItemReviewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class DeleteItemOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogDeleteItemRequestWrapper; + + DeleteItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class GetCatalogConfigOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetCatalogConfigRequestWrapper; + using ResultType = Wrappers::PFCatalogGetCatalogConfigResponseWrapper; + + GetCatalogConfigOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class GetDraftItemOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetDraftItemRequestWrapper; + using ResultType = Wrappers::PFCatalogGetDraftItemResponseWrapper; + + GetDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetDraftItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetDraftItemsRequestWrapper; + using ResultType = Wrappers::PFCatalogGetDraftItemsResponseWrapper; + + GetDraftItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetEntityDraftItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetEntityDraftItemsRequestWrapper; + using ResultType = Wrappers::PFCatalogGetEntityDraftItemsResponseWrapper; + + GetEntityDraftItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetEntityItemReviewOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetEntityItemReviewRequestWrapper; + using ResultType = Wrappers::PFCatalogGetEntityItemReviewResponseWrapper; + + GetEntityItemReviewOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetItemOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetItemRequestWrapper; + using ResultType = Wrappers::PFCatalogGetItemResponseWrapper; + + GetItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetItemContainersOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetItemContainersRequestWrapper; + using ResultType = Wrappers::PFCatalogGetItemContainersResponseWrapper; + + GetItemContainersOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class GetItemModerationStateOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetItemModerationStateRequestWrapper; + using ResultType = Wrappers::PFCatalogGetItemModerationStateResponseWrapper; + + GetItemModerationStateOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class GetItemPublishStatusOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetItemPublishStatusRequestWrapper; + using ResultType = Wrappers::PFCatalogGetItemPublishStatusResponseWrapper; + + GetItemPublishStatusOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetItemReviewsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetItemReviewsRequestWrapper; + using ResultType = Wrappers::PFCatalogGetItemReviewsResponseWrapper; + + GetItemReviewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetItemReviewSummaryOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetItemReviewSummaryRequestWrapper; + using ResultType = Wrappers::PFCatalogGetItemReviewSummaryResponseWrapper; + + GetItemReviewSummaryOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogGetItemsRequestWrapper; + using ResultType = Wrappers::PFCatalogGetItemsResponseWrapper; + + GetItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class PublishDraftItemOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogPublishDraftItemRequestWrapper; + + PublishDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ReportItemOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogReportItemRequestWrapper; + + ReportItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ReportItemReviewOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogReportItemReviewRequestWrapper; + + ReportItemReviewOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ReviewItemOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogReviewItemRequestWrapper; + + ReviewItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class SearchItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogSearchItemsRequestWrapper; + using ResultType = Wrappers::PFCatalogSearchItemsResponseWrapper; + + SearchItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class SetItemModerationStateOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogSetItemModerationStateRequestWrapper; + + SetItemModerationStateOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class SubmitItemReviewVoteOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogSubmitItemReviewVoteRequestWrapper; + + SubmitItemReviewVoteOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class TakedownItemReviewsOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogTakedownItemReviewsRequestWrapper; + + TakedownItemReviewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class UpdateCatalogConfigOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCatalogUpdateCatalogConfigRequestWrapper; + + UpdateCatalogConfigOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class UpdateDraftItemOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCatalogUpdateDraftItemRequestWrapper; + using ResultType = Wrappers::PFCatalogUpdateDraftItemResponseWrapper; + + UpdateDraftItemOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.cpp new file mode 100644 index 0000000..56626c6 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.cpp @@ -0,0 +1,410 @@ +#include "TestAppPch.h" +#include "CharacterOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + +#if 0 + +ClientGetAllUsersCharactersOperation::ClientGetAllUsersCharactersOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetAllUsersCharactersOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetAllUsersCharactersOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterClientGetAllUsersCharactersAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetAllUsersCharactersOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterClientGetAllUsersCharactersGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterListUsersCharactersResult* result; + RETURN_IF_FAILED(PFCharacterClientGetAllUsersCharactersGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetCharacterDataOperation::ClientGetCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetCharacterDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetCharacterDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterClientGetCharacterDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetCharacterDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterClientGetCharacterDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterClientGetCharacterDataResult* result; + RETURN_IF_FAILED(PFCharacterClientGetCharacterDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGetCharacterReadOnlyDataOperation::ClientGetCharacterReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetCharacterReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetCharacterReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterClientGetCharacterReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetCharacterReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterClientGetCharacterReadOnlyDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterClientGetCharacterDataResult* result; + RETURN_IF_FAILED(PFCharacterClientGetCharacterReadOnlyDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientGrantCharacterToUserOperation::ClientGrantCharacterToUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGrantCharacterToUserOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGrantCharacterToUserOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterClientGrantCharacterToUserAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGrantCharacterToUserOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterClientGrantCharacterToUserGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterClientGrantCharacterToUserResult* result; + RETURN_IF_FAILED(PFCharacterClientGrantCharacterToUserGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ClientUpdateCharacterDataOperation::ClientUpdateCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUpdateCharacterDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUpdateCharacterDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterClientUpdateCharacterDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientUpdateCharacterDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFCharacterUpdateCharacterDataResult result{}; + RETURN_IF_FAILED(PFCharacterClientUpdateCharacterDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerDeleteCharacterFromUserOperation::ServerDeleteCharacterFromUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerDeleteCharacterFromUserOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerDeleteCharacterFromUserOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerDeleteCharacterFromUserAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerGetAllUsersCharactersOperation::ServerGetAllUsersCharactersOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetAllUsersCharactersOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetAllUsersCharactersOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerGetAllUsersCharactersAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetAllUsersCharactersOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterServerGetAllUsersCharactersGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterListUsersCharactersResult* result; + RETURN_IF_FAILED(PFCharacterServerGetAllUsersCharactersGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetCharacterDataOperation::ServerGetCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetCharacterDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetCharacterDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerGetCharacterDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetCharacterDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterServerGetCharacterDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterServerGetCharacterDataResult* result; + RETURN_IF_FAILED(PFCharacterServerGetCharacterDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetCharacterInternalDataOperation::ServerGetCharacterInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetCharacterInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetCharacterInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerGetCharacterInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetCharacterInternalDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterServerGetCharacterInternalDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterServerGetCharacterDataResult* result; + RETURN_IF_FAILED(PFCharacterServerGetCharacterInternalDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetCharacterReadOnlyDataOperation::ServerGetCharacterReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetCharacterReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetCharacterReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerGetCharacterReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetCharacterReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterServerGetCharacterReadOnlyDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterServerGetCharacterDataResult* result; + RETURN_IF_FAILED(PFCharacterServerGetCharacterReadOnlyDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGrantCharacterToUserOperation::ServerGrantCharacterToUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGrantCharacterToUserOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGrantCharacterToUserOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerGrantCharacterToUserAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGrantCharacterToUserOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCharacterServerGrantCharacterToUserGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCharacterServerGrantCharacterToUserResult* result; + RETURN_IF_FAILED(PFCharacterServerGrantCharacterToUserGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerUpdateCharacterDataOperation::ServerUpdateCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateCharacterDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateCharacterDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerUpdateCharacterDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateCharacterDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFCharacterUpdateCharacterDataResult result{}; + RETURN_IF_FAILED(PFCharacterServerUpdateCharacterDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerUpdateCharacterInternalDataOperation::ServerUpdateCharacterInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateCharacterInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateCharacterInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerUpdateCharacterInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateCharacterInternalDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFCharacterUpdateCharacterDataResult result{}; + RETURN_IF_FAILED(PFCharacterServerUpdateCharacterInternalDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerUpdateCharacterReadOnlyDataOperation::ServerUpdateCharacterReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateCharacterReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateCharacterReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCharacterServerUpdateCharacterReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateCharacterReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFCharacterUpdateCharacterDataResult result{}; + RETURN_IF_FAILED(PFCharacterServerUpdateCharacterReadOnlyDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.h new file mode 100644 index 0000000..415a6c8 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/CharacterOperations.h @@ -0,0 +1,290 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +#if 0 +class ClientGetAllUsersCharactersOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterListUsersCharactersRequestWrapper; + using ResultType = Wrappers::PFCharacterListUsersCharactersResultWrapper; + + ClientGetAllUsersCharactersOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetCharacterDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterGetCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterClientGetCharacterDataResultWrapper; + + ClientGetCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGetCharacterReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterGetCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterClientGetCharacterDataResultWrapper; + + ClientGetCharacterReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientGrantCharacterToUserOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterClientGrantCharacterToUserRequestWrapper; + using ResultType = Wrappers::PFCharacterClientGrantCharacterToUserResultWrapper; + + ClientGrantCharacterToUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientUpdateCharacterDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterClientUpdateCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterUpdateCharacterDataResultWrapper; + + ClientUpdateCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerDeleteCharacterFromUserOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFCharacterDeleteCharacterFromUserRequestWrapper; + + ServerDeleteCharacterFromUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetAllUsersCharactersOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterListUsersCharactersRequestWrapper; + using ResultType = Wrappers::PFCharacterListUsersCharactersResultWrapper; + + ServerGetAllUsersCharactersOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetCharacterDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterGetCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterServerGetCharacterDataResultWrapper; + + ServerGetCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetCharacterInternalDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterGetCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterServerGetCharacterDataResultWrapper; + + ServerGetCharacterInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetCharacterReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterGetCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterServerGetCharacterDataResultWrapper; + + ServerGetCharacterReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGrantCharacterToUserOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterServerGrantCharacterToUserRequestWrapper; + using ResultType = Wrappers::PFCharacterServerGrantCharacterToUserResultWrapper; + + ServerGrantCharacterToUserOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateCharacterDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterServerUpdateCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterUpdateCharacterDataResultWrapper; + + ServerUpdateCharacterDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateCharacterInternalDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterServerUpdateCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterUpdateCharacterDataResultWrapper; + + ServerUpdateCharacterInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateCharacterReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCharacterServerUpdateCharacterDataRequestWrapper; + using ResultType = Wrappers::PFCharacterUpdateCharacterDataResultWrapper; + + ServerUpdateCharacterReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.cpp new file mode 100644 index 0000000..ad0afa0 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.cpp @@ -0,0 +1,39 @@ +#include "TestAppPch.h" +#include "CloudScriptOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +ExecuteFunctionOperation::ExecuteFunctionOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ExecuteFunctionOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ExecuteFunctionOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFCloudScriptExecuteFunctionAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ExecuteFunctionOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFCloudScriptExecuteFunctionGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFCloudScriptExecuteFunctionResult* result; + RETURN_IF_FAILED(PFCloudScriptExecuteFunctionGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.h new file mode 100644 index 0000000..c894059 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/CloudScriptOperations.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class ExecuteFunctionOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFCloudScriptExecuteFunctionRequestWrapper; + using ResultType = Wrappers::PFCloudScriptExecuteFunctionResultWrapper; + + ExecuteFunctionOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/DataOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/DataOperations.cpp new file mode 100644 index 0000000..6176405 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/DataOperations.cpp @@ -0,0 +1,207 @@ +#include "TestAppPch.h" +#include "DataOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +AbortFileUploadsOperation::AbortFileUploadsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp AbortFileUploadsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT AbortFileUploadsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFDataAbortFileUploadsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result AbortFileUploadsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFDataAbortFileUploadsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFDataAbortFileUploadsResponse* result; + RETURN_IF_FAILED(PFDataAbortFileUploadsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +DeleteFilesOperation::DeleteFilesOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp DeleteFilesOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT DeleteFilesOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFDataDeleteFilesAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result DeleteFilesOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFDataDeleteFilesGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFDataDeleteFilesResponse* result; + RETURN_IF_FAILED(PFDataDeleteFilesGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +FinalizeFileUploadsOperation::FinalizeFileUploadsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp FinalizeFileUploadsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT FinalizeFileUploadsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFDataFinalizeFileUploadsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result FinalizeFileUploadsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFDataFinalizeFileUploadsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFDataFinalizeFileUploadsResponse* result; + RETURN_IF_FAILED(PFDataFinalizeFileUploadsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetFilesOperation::GetFilesOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetFilesOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetFilesOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFDataGetFilesAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetFilesOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFDataGetFilesGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFDataGetFilesResponse* result; + RETURN_IF_FAILED(PFDataGetFilesGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetObjectsOperation::GetObjectsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetObjectsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetObjectsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFDataGetObjectsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetObjectsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFDataGetObjectsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFDataGetObjectsResponse* result; + RETURN_IF_FAILED(PFDataGetObjectsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +InitiateFileUploadsOperation::InitiateFileUploadsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp InitiateFileUploadsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT InitiateFileUploadsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFDataInitiateFileUploadsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result InitiateFileUploadsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFDataInitiateFileUploadsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFDataInitiateFileUploadsResponse* result; + RETURN_IF_FAILED(PFDataInitiateFileUploadsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +SetObjectsOperation::SetObjectsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp SetObjectsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT SetObjectsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFDataSetObjectsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result SetObjectsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFDataSetObjectsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFDataSetObjectsResponse* result; + RETURN_IF_FAILED(PFDataSetObjectsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/DataOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/DataOperations.h new file mode 100644 index 0000000..aadf1dc --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/DataOperations.h @@ -0,0 +1,138 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class AbortFileUploadsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFDataAbortFileUploadsRequestWrapper; + using ResultType = Wrappers::PFDataAbortFileUploadsResponseWrapper; + + AbortFileUploadsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class DeleteFilesOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFDataDeleteFilesRequestWrapper; + using ResultType = Wrappers::PFDataDeleteFilesResponseWrapper; + + DeleteFilesOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class FinalizeFileUploadsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFDataFinalizeFileUploadsRequestWrapper; + using ResultType = Wrappers::PFDataFinalizeFileUploadsResponseWrapper; + + FinalizeFileUploadsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetFilesOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFDataGetFilesRequestWrapper; + using ResultType = Wrappers::PFDataGetFilesResponseWrapper; + + GetFilesOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetObjectsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFDataGetObjectsRequestWrapper; + using ResultType = Wrappers::PFDataGetObjectsResponseWrapper; + + GetObjectsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class InitiateFileUploadsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFDataInitiateFileUploadsRequestWrapper; + using ResultType = Wrappers::PFDataInitiateFileUploadsResponseWrapper; + + InitiateFileUploadsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class SetObjectsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFDataSetObjectsRequestWrapper; + using ResultType = Wrappers::PFDataSetObjectsResponseWrapper; + + SetObjectsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.cpp new file mode 100644 index 0000000..0074e50 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.cpp @@ -0,0 +1,39 @@ +#include "TestAppPch.h" +#include "ExperimentationOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +GetTreatmentAssignmentOperation::GetTreatmentAssignmentOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetTreatmentAssignmentOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetTreatmentAssignmentOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFExperimentationGetTreatmentAssignmentAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetTreatmentAssignmentOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFExperimentationGetTreatmentAssignmentGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFExperimentationGetTreatmentAssignmentResult* result; + RETURN_IF_FAILED(PFExperimentationGetTreatmentAssignmentGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.h new file mode 100644 index 0000000..8aa14de --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/ExperimentationOperations.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class GetTreatmentAssignmentOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFExperimentationGetTreatmentAssignmentRequestWrapper; + using ResultType = Wrappers::PFExperimentationGetTreatmentAssignmentResultWrapper; + + GetTreatmentAssignmentOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.cpp new file mode 100644 index 0000000..01a1a81 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.cpp @@ -0,0 +1,195 @@ +#include "TestAppPch.h" +#include "FriendsOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +ClientAddFriendOperation::ClientAddFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientAddFriendOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientAddFriendOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsClientAddFriendAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientAddFriendOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFFriendsAddFriendResult result{}; + RETURN_IF_FAILED(PFFriendsClientAddFriendGetResult(async, &result)); + return ResultType{ result }; +} + + +ClientGetFriendsListOperation::ClientGetFriendsListOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetFriendsListOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetFriendsListOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsClientGetFriendsListAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetFriendsListOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFFriendsClientGetFriendsListGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFFriendsGetFriendsListResult* result; + RETURN_IF_FAILED(PFFriendsClientGetFriendsListGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientRemoveFriendOperation::ClientRemoveFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientRemoveFriendOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientRemoveFriendOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsClientRemoveFriendAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +ClientSetFriendTagsOperation::ClientSetFriendTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientSetFriendTagsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientSetFriendTagsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsClientSetFriendTagsAsync(m_entity.Handle(), &m_request.Model(), async); +} + + +#if 0 + +ServerAddFriendOperation::ServerAddFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerAddFriendOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerAddFriendOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsServerAddFriendAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerGetFriendsListOperation::ServerGetFriendsListOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetFriendsListOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetFriendsListOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsServerGetFriendsListAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetFriendsListOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFFriendsServerGetFriendsListGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFFriendsGetFriendsListResult* result; + RETURN_IF_FAILED(PFFriendsServerGetFriendsListGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerRemoveFriendOperation::ServerRemoveFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerRemoveFriendOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerRemoveFriendOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsServerRemoveFriendAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerSetFriendTagsOperation::ServerSetFriendTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSetFriendTagsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSetFriendTagsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFFriendsServerSetFriendTagsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.h new file mode 100644 index 0000000..f81759c --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/FriendsOperations.h @@ -0,0 +1,154 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class ClientAddFriendOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFFriendsClientAddFriendRequestWrapper; + using ResultType = Wrappers::PFFriendsAddFriendResultWrapper; + + ClientAddFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetFriendsListOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFFriendsClientGetFriendsListRequestWrapper; + using ResultType = Wrappers::PFFriendsGetFriendsListResultWrapper; + + ClientGetFriendsListOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientRemoveFriendOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFFriendsClientRemoveFriendRequestWrapper; + + ClientRemoveFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientSetFriendTagsOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFFriendsClientSetFriendTagsRequestWrapper; + + ClientSetFriendTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ServerAddFriendOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFFriendsServerAddFriendRequestWrapper; + + ServerAddFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetFriendsListOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFFriendsServerGetFriendsListRequestWrapper; + using ResultType = Wrappers::PFFriendsGetFriendsListResultWrapper; + + ServerGetFriendsListOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerRemoveFriendOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFFriendsServerRemoveFriendRequestWrapper; + + ServerRemoveFriendOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerSetFriendTagsOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFFriendsServerSetFriendTagsRequestWrapper; + + ServerSetFriendTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.cpp new file mode 100644 index 0000000..6cd65d5 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.cpp @@ -0,0 +1,609 @@ +#include "TestAppPch.h" +#include "GroupsOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +AcceptGroupApplicationOperation::AcceptGroupApplicationOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp AcceptGroupApplicationOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT AcceptGroupApplicationOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsAcceptGroupApplicationAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +AcceptGroupInvitationOperation::AcceptGroupInvitationOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp AcceptGroupInvitationOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT AcceptGroupInvitationOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsAcceptGroupInvitationAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +AddMembersOperation::AddMembersOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp AddMembersOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT AddMembersOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsAddMembersAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +ApplyToGroupOperation::ApplyToGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ApplyToGroupOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ApplyToGroupOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsApplyToGroupAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ApplyToGroupOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsApplyToGroupGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsApplyToGroupResponse* result; + RETURN_IF_FAILED(PFGroupsApplyToGroupGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +BlockEntityOperation::BlockEntityOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp BlockEntityOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT BlockEntityOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsBlockEntityAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +ChangeMemberRoleOperation::ChangeMemberRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ChangeMemberRoleOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ChangeMemberRoleOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsChangeMemberRoleAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +CreateGroupOperation::CreateGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp CreateGroupOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT CreateGroupOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsCreateGroupAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result CreateGroupOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsCreateGroupGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsCreateGroupResponse* result; + RETURN_IF_FAILED(PFGroupsCreateGroupGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +CreateRoleOperation::CreateRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp CreateRoleOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT CreateRoleOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsCreateRoleAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result CreateRoleOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsCreateRoleGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsCreateGroupRoleResponse* result; + RETURN_IF_FAILED(PFGroupsCreateRoleGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +DeleteGroupOperation::DeleteGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp DeleteGroupOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT DeleteGroupOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsDeleteGroupAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +DeleteRoleOperation::DeleteRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp DeleteRoleOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT DeleteRoleOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsDeleteRoleAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +GetGroupOperation::GetGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetGroupOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetGroupOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsGetGroupAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetGroupOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsGetGroupGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsGetGroupResponse* result; + RETURN_IF_FAILED(PFGroupsGetGroupGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +InviteToGroupOperation::InviteToGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp InviteToGroupOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT InviteToGroupOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsInviteToGroupAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result InviteToGroupOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsInviteToGroupGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsInviteToGroupResponse* result; + RETURN_IF_FAILED(PFGroupsInviteToGroupGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +IsMemberOperation::IsMemberOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp IsMemberOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT IsMemberOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsIsMemberAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result IsMemberOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFGroupsIsMemberResponse result{}; + RETURN_IF_FAILED(PFGroupsIsMemberGetResult(async, &result)); + return ResultType{ result }; +} + + +ListGroupApplicationsOperation::ListGroupApplicationsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListGroupApplicationsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListGroupApplicationsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsListGroupApplicationsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListGroupApplicationsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsListGroupApplicationsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsListGroupApplicationsResponse* result; + RETURN_IF_FAILED(PFGroupsListGroupApplicationsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ListGroupBlocksOperation::ListGroupBlocksOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListGroupBlocksOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListGroupBlocksOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsListGroupBlocksAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListGroupBlocksOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsListGroupBlocksGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsListGroupBlocksResponse* result; + RETURN_IF_FAILED(PFGroupsListGroupBlocksGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ListGroupInvitationsOperation::ListGroupInvitationsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListGroupInvitationsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListGroupInvitationsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsListGroupInvitationsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListGroupInvitationsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsListGroupInvitationsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsListGroupInvitationsResponse* result; + RETURN_IF_FAILED(PFGroupsListGroupInvitationsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ListGroupMembersOperation::ListGroupMembersOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListGroupMembersOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListGroupMembersOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsListGroupMembersAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListGroupMembersOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsListGroupMembersGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsListGroupMembersResponse* result; + RETURN_IF_FAILED(PFGroupsListGroupMembersGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ListMembershipOperation::ListMembershipOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListMembershipOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListMembershipOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsListMembershipAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListMembershipOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsListMembershipGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsListMembershipResponse* result; + RETURN_IF_FAILED(PFGroupsListMembershipGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ListMembershipOpportunitiesOperation::ListMembershipOpportunitiesOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListMembershipOpportunitiesOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListMembershipOpportunitiesOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsListMembershipOpportunitiesAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListMembershipOpportunitiesOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsListMembershipOpportunitiesGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsListMembershipOpportunitiesResponse* result; + RETURN_IF_FAILED(PFGroupsListMembershipOpportunitiesGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +RemoveGroupApplicationOperation::RemoveGroupApplicationOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RemoveGroupApplicationOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RemoveGroupApplicationOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsRemoveGroupApplicationAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +RemoveGroupInvitationOperation::RemoveGroupInvitationOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RemoveGroupInvitationOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RemoveGroupInvitationOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsRemoveGroupInvitationAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +RemoveMembersOperation::RemoveMembersOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RemoveMembersOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RemoveMembersOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsRemoveMembersAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +UnblockEntityOperation::UnblockEntityOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp UnblockEntityOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT UnblockEntityOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsUnblockEntityAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +UpdateGroupOperation::UpdateGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp UpdateGroupOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT UpdateGroupOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsUpdateGroupAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result UpdateGroupOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsUpdateGroupGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsUpdateGroupResponse* result; + RETURN_IF_FAILED(PFGroupsUpdateGroupGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +UpdateRoleOperation::UpdateRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp UpdateRoleOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT UpdateRoleOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFGroupsUpdateRoleAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result UpdateRoleOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFGroupsUpdateRoleGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFGroupsUpdateGroupRoleResponse* result; + RETURN_IF_FAILED(PFGroupsUpdateRoleGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.h new file mode 100644 index 0000000..8ad3a79 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/GroupsOperations.h @@ -0,0 +1,440 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class AcceptGroupApplicationOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsAcceptGroupApplicationRequestWrapper; + + AcceptGroupApplicationOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class AcceptGroupInvitationOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsAcceptGroupInvitationRequestWrapper; + + AcceptGroupInvitationOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class AddMembersOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsAddMembersRequestWrapper; + + AddMembersOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ApplyToGroupOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsApplyToGroupRequestWrapper; + using ResultType = Wrappers::PFGroupsApplyToGroupResponseWrapper; + + ApplyToGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class BlockEntityOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsBlockEntityRequestWrapper; + + BlockEntityOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ChangeMemberRoleOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsChangeMemberRoleRequestWrapper; + + ChangeMemberRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class CreateGroupOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsCreateGroupRequestWrapper; + using ResultType = Wrappers::PFGroupsCreateGroupResponseWrapper; + + CreateGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class CreateRoleOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsCreateGroupRoleRequestWrapper; + using ResultType = Wrappers::PFGroupsCreateGroupRoleResponseWrapper; + + CreateRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class DeleteGroupOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsDeleteGroupRequestWrapper; + + DeleteGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class DeleteRoleOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsDeleteRoleRequestWrapper; + + DeleteRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetGroupOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsGetGroupRequestWrapper; + using ResultType = Wrappers::PFGroupsGetGroupResponseWrapper; + + GetGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class InviteToGroupOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsInviteToGroupRequestWrapper; + using ResultType = Wrappers::PFGroupsInviteToGroupResponseWrapper; + + InviteToGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class IsMemberOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsIsMemberRequestWrapper; + using ResultType = Wrappers::PFGroupsIsMemberResponseWrapper; + + IsMemberOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListGroupApplicationsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsListGroupApplicationsRequestWrapper; + using ResultType = Wrappers::PFGroupsListGroupApplicationsResponseWrapper; + + ListGroupApplicationsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListGroupBlocksOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsListGroupBlocksRequestWrapper; + using ResultType = Wrappers::PFGroupsListGroupBlocksResponseWrapper; + + ListGroupBlocksOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListGroupInvitationsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsListGroupInvitationsRequestWrapper; + using ResultType = Wrappers::PFGroupsListGroupInvitationsResponseWrapper; + + ListGroupInvitationsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListGroupMembersOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsListGroupMembersRequestWrapper; + using ResultType = Wrappers::PFGroupsListGroupMembersResponseWrapper; + + ListGroupMembersOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListMembershipOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsListMembershipRequestWrapper; + using ResultType = Wrappers::PFGroupsListMembershipResponseWrapper; + + ListMembershipOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListMembershipOpportunitiesOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsListMembershipOpportunitiesRequestWrapper; + using ResultType = Wrappers::PFGroupsListMembershipOpportunitiesResponseWrapper; + + ListMembershipOpportunitiesOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class RemoveGroupApplicationOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsRemoveGroupApplicationRequestWrapper; + + RemoveGroupApplicationOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class RemoveGroupInvitationOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsRemoveGroupInvitationRequestWrapper; + + RemoveGroupInvitationOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class RemoveMembersOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsRemoveMembersRequestWrapper; + + RemoveMembersOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class UnblockEntityOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFGroupsUnblockEntityRequestWrapper; + + UnblockEntityOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class UpdateGroupOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsUpdateGroupRequestWrapper; + using ResultType = Wrappers::PFGroupsUpdateGroupResponseWrapper; + + UpdateGroupOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class UpdateRoleOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFGroupsUpdateGroupRoleRequestWrapper; + using ResultType = Wrappers::PFGroupsUpdateGroupRoleResponseWrapper; + + UpdateRoleOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.cpp new file mode 100644 index 0000000..6d0c68e --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.cpp @@ -0,0 +1,522 @@ +#include "TestAppPch.h" +#include "InventoryOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +AddInventoryItemsOperation::AddInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp AddInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT AddInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryAddInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result AddInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryAddInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryAddInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryAddInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +DeleteInventoryCollectionOperation::DeleteInventoryCollectionOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp DeleteInventoryCollectionOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT DeleteInventoryCollectionOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryDeleteInventoryCollectionAsync(m_entity.Handle(), &m_request.Model(), async); +} + + + +DeleteInventoryItemsOperation::DeleteInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp DeleteInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT DeleteInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryDeleteInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result DeleteInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryDeleteInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryDeleteInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryDeleteInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ExecuteInventoryOperationsOperation::ExecuteInventoryOperationsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ExecuteInventoryOperationsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ExecuteInventoryOperationsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryExecuteInventoryOperationsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ExecuteInventoryOperationsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryExecuteInventoryOperationsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryExecuteInventoryOperationsResponse* result; + RETURN_IF_FAILED(PFInventoryExecuteInventoryOperationsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetInventoryCollectionIdsOperation::GetInventoryCollectionIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetInventoryCollectionIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetInventoryCollectionIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryGetInventoryCollectionIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetInventoryCollectionIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryGetInventoryCollectionIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryGetInventoryCollectionIdsResponse* result; + RETURN_IF_FAILED(PFInventoryGetInventoryCollectionIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetInventoryItemsOperation::GetInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryGetInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryGetInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryGetInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryGetInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +GetMicrosoftStoreAccessTokensOperation::GetMicrosoftStoreAccessTokensOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetMicrosoftStoreAccessTokensOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetMicrosoftStoreAccessTokensOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryGetMicrosoftStoreAccessTokensAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetMicrosoftStoreAccessTokensOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryGetMicrosoftStoreAccessTokensGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryGetMicrosoftStoreAccessTokensResponse* result; + RETURN_IF_FAILED(PFInventoryGetMicrosoftStoreAccessTokensGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +GetTransactionHistoryOperation::GetTransactionHistoryOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetTransactionHistoryOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetTransactionHistoryOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryGetTransactionHistoryAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetTransactionHistoryOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryGetTransactionHistoryGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryGetTransactionHistoryResponse* result; + RETURN_IF_FAILED(PFInventoryGetTransactionHistoryGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + + +PurchaseInventoryItemsOperation::PurchaseInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp PurchaseInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT PurchaseInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryPurchaseInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result PurchaseInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryPurchaseInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryPurchaseInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryPurchaseInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if 0 + +RedeemAppleAppStoreInventoryItemsOperation::RedeemAppleAppStoreInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RedeemAppleAppStoreInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RedeemAppleAppStoreInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryRedeemAppleAppStoreInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result RedeemAppleAppStoreInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryRedeemAppleAppStoreInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryRedeemAppleAppStoreInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryRedeemAppleAppStoreInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +RedeemGooglePlayInventoryItemsOperation::RedeemGooglePlayInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RedeemGooglePlayInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RedeemGooglePlayInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryRedeemGooglePlayInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result RedeemGooglePlayInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryRedeemGooglePlayInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryRedeemGooglePlayInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryRedeemGooglePlayInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + +RedeemMicrosoftStoreInventoryItemsOperation::RedeemMicrosoftStoreInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RedeemMicrosoftStoreInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RedeemMicrosoftStoreInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryRedeemMicrosoftStoreInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result RedeemMicrosoftStoreInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryRedeemMicrosoftStoreInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryRedeemMicrosoftStoreInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryRedeemMicrosoftStoreInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + +RedeemNintendoEShopInventoryItemsOperation::RedeemNintendoEShopInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RedeemNintendoEShopInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RedeemNintendoEShopInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryRedeemNintendoEShopInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result RedeemNintendoEShopInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryRedeemNintendoEShopInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryRedeemNintendoEShopInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryRedeemNintendoEShopInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + +RedeemPlayStationStoreInventoryItemsOperation::RedeemPlayStationStoreInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RedeemPlayStationStoreInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RedeemPlayStationStoreInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryRedeemPlayStationStoreInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result RedeemPlayStationStoreInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryRedeemPlayStationStoreInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryRedeemPlayStationStoreInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryRedeemPlayStationStoreInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 + +RedeemSteamInventoryItemsOperation::RedeemSteamInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RedeemSteamInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RedeemSteamInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryRedeemSteamInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result RedeemSteamInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryRedeemSteamInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryRedeemSteamInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryRedeemSteamInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + + +SubtractInventoryItemsOperation::SubtractInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp SubtractInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT SubtractInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventorySubtractInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result SubtractInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventorySubtractInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventorySubtractInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventorySubtractInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +TransferInventoryItemsOperation::TransferInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp TransferInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT TransferInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryTransferInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result TransferInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryTransferInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryTransferInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryTransferInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +UpdateInventoryItemsOperation::UpdateInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp UpdateInventoryItemsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT UpdateInventoryItemsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFInventoryUpdateInventoryItemsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result UpdateInventoryItemsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFInventoryUpdateInventoryItemsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFInventoryUpdateInventoryItemsResponse* result; + RETURN_IF_FAILED(PFInventoryUpdateInventoryItemsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.h new file mode 100644 index 0000000..a98843c --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/InventoryOperations.h @@ -0,0 +1,350 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class AddInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryAddInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryAddInventoryItemsResponseWrapper; + + AddInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class DeleteInventoryCollectionOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFInventoryDeleteInventoryCollectionRequestWrapper; + + DeleteInventoryCollectionOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class DeleteInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryDeleteInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryDeleteInventoryItemsResponseWrapper; + + DeleteInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ExecuteInventoryOperationsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryExecuteInventoryOperationsRequestWrapper; + using ResultType = Wrappers::PFInventoryExecuteInventoryOperationsResponseWrapper; + + ExecuteInventoryOperationsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetInventoryCollectionIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryGetInventoryCollectionIdsRequestWrapper; + using ResultType = Wrappers::PFInventoryGetInventoryCollectionIdsResponseWrapper; + + GetInventoryCollectionIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryGetInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryGetInventoryItemsResponseWrapper; + + GetInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +class GetMicrosoftStoreAccessTokensOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryGetMicrosoftStoreAccessTokensRequestWrapper; + using ResultType = Wrappers::PFInventoryGetMicrosoftStoreAccessTokensResponseWrapper; + + GetMicrosoftStoreAccessTokensOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class GetTransactionHistoryOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryGetTransactionHistoryRequestWrapper; + using ResultType = Wrappers::PFInventoryGetTransactionHistoryResponseWrapper; + + GetTransactionHistoryOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class PurchaseInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryPurchaseInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryPurchaseInventoryItemsResponseWrapper; + + PurchaseInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class RedeemAppleAppStoreInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryRedeemAppleAppStoreInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryRedeemAppleAppStoreInventoryItemsResponseWrapper; + + RedeemAppleAppStoreInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class RedeemGooglePlayInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryRedeemGooglePlayInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryRedeemGooglePlayInventoryItemsResponseWrapper; + + RedeemGooglePlayInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +class RedeemMicrosoftStoreInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryRedeemMicrosoftStoreInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryRedeemMicrosoftStoreInventoryItemsResponseWrapper; + + RedeemMicrosoftStoreInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +class RedeemNintendoEShopInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryRedeemNintendoEShopInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryRedeemNintendoEShopInventoryItemsResponseWrapper; + + RedeemNintendoEShopInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +class RedeemPlayStationStoreInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryRedeemPlayStationStoreInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryRedeemPlayStationStoreInventoryItemsResponseWrapper; + + RedeemPlayStationStoreInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +class RedeemSteamInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryRedeemSteamInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryRedeemSteamInventoryItemsResponseWrapper; + + RedeemSteamInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +class SubtractInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventorySubtractInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventorySubtractInventoryItemsResponseWrapper; + + SubtractInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class TransferInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryTransferInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryTransferInventoryItemsResponseWrapper; + + TransferInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class UpdateInventoryItemsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFInventoryUpdateInventoryItemsRequestWrapper; + using ResultType = Wrappers::PFInventoryUpdateInventoryItemsResponseWrapper; + + UpdateInventoryItemsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.cpp new file mode 100644 index 0000000..7085c3b --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.cpp @@ -0,0 +1,41 @@ +#include "TestAppPch.h" +#include "LocalizationOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + +#if 0 + +GetLanguageListOperation::GetLanguageListOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetLanguageListOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetLanguageListOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFLocalizationGetLanguageListAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetLanguageListOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFLocalizationGetLanguageListGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFLocalizationGetLanguageListResponse* result; + RETURN_IF_FAILED(PFLocalizationGetLanguageListGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.h new file mode 100644 index 0000000..791d327 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/LocalizationOperations.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +#if 0 +class GetLanguageListOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFLocalizationGetLanguageListRequestWrapper; + using ResultType = Wrappers::PFLocalizationGetLanguageListResponseWrapper; + + GetLanguageListOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.cpp new file mode 100644 index 0000000..c2b2928 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.cpp @@ -0,0 +1,123 @@ +#include "TestAppPch.h" +#include "MultiplayerServerOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +ListBuildAliasesOperation::ListBuildAliasesOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListBuildAliasesOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListBuildAliasesOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFMultiplayerServerListBuildAliasesAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListBuildAliasesOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFMultiplayerServerListBuildAliasesGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFMultiplayerServerListBuildAliasesResponse* result; + RETURN_IF_FAILED(PFMultiplayerServerListBuildAliasesGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ListBuildSummariesV2Operation::ListBuildSummariesV2Operation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListBuildSummariesV2Operation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListBuildSummariesV2Operation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFMultiplayerServerListBuildSummariesV2Async(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListBuildSummariesV2Operation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFMultiplayerServerListBuildSummariesV2GetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFMultiplayerServerListBuildSummariesResponse* result; + RETURN_IF_FAILED(PFMultiplayerServerListBuildSummariesV2GetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ListQosServersForTitleOperation::ListQosServersForTitleOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ListQosServersForTitleOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ListQosServersForTitleOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFMultiplayerServerListQosServersForTitleAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ListQosServersForTitleOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFMultiplayerServerListQosServersForTitleGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFMultiplayerServerListQosServersForTitleResponse* result; + RETURN_IF_FAILED(PFMultiplayerServerListQosServersForTitleGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +RequestMultiplayerServerOperation::RequestMultiplayerServerOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp RequestMultiplayerServerOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT RequestMultiplayerServerOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFMultiplayerServerRequestMultiplayerServerAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result RequestMultiplayerServerOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFMultiplayerServerRequestMultiplayerServerGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFMultiplayerServerRequestMultiplayerServerResponse* result; + RETURN_IF_FAILED(PFMultiplayerServerRequestMultiplayerServerGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.h new file mode 100644 index 0000000..4cab465 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/MultiplayerServerOperations.h @@ -0,0 +1,84 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class ListBuildAliasesOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFMultiplayerServerListBuildAliasesRequestWrapper; + using ResultType = Wrappers::PFMultiplayerServerListBuildAliasesResponseWrapper; + + ListBuildAliasesOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListBuildSummariesV2Operation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFMultiplayerServerListBuildSummariesRequestWrapper; + using ResultType = Wrappers::PFMultiplayerServerListBuildSummariesResponseWrapper; + + ListBuildSummariesV2Operation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ListQosServersForTitleOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFMultiplayerServerListQosServersForTitleRequestWrapper; + using ResultType = Wrappers::PFMultiplayerServerListQosServersForTitleResponseWrapper; + + ListQosServersForTitleOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class RequestMultiplayerServerOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFMultiplayerServerRequestMultiplayerServerRequestWrapper; + using ResultType = Wrappers::PFMultiplayerServerRequestMultiplayerServerResponseWrapper; + + RequestMultiplayerServerOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.cpp new file mode 100644 index 0000000..19da0e2 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.cpp @@ -0,0 +1,104 @@ +#include "TestAppPch.h" +#include "PlatformSpecificOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + +#if 0 + +ClientAndroidDevicePushNotificationRegistrationOperation::ClientAndroidDevicePushNotificationRegistrationOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientAndroidDevicePushNotificationRegistrationOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientAndroidDevicePushNotificationRegistrationOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlatformSpecificClientAndroidDevicePushNotificationRegistrationAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientRefreshPSNAuthTokenOperation::ClientRefreshPSNAuthTokenOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientRefreshPSNAuthTokenOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientRefreshPSNAuthTokenOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlatformSpecificClientRefreshPSNAuthTokenAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ClientRegisterForIOSPushNotificationOperation::ClientRegisterForIOSPushNotificationOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientRegisterForIOSPushNotificationOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientRegisterForIOSPushNotificationOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlatformSpecificClientRegisterForIOSPushNotificationAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerAwardSteamAchievementOperation::ServerAwardSteamAchievementOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerAwardSteamAchievementOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerAwardSteamAchievementOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlatformSpecificServerAwardSteamAchievementAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerAwardSteamAchievementOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlatformSpecificServerAwardSteamAchievementGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlatformSpecificAwardSteamAchievementResult* result; + RETURN_IF_FAILED(PFPlatformSpecificServerAwardSteamAchievementGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.h new file mode 100644 index 0000000..04ad8e7 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PlatformSpecificOperations.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +#if 0 +class ClientAndroidDevicePushNotificationRegistrationOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFPlatformSpecificAndroidDevicePushNotificationRegistrationRequestWrapper; + + ClientAndroidDevicePushNotificationRegistrationOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientRefreshPSNAuthTokenOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFPlatformSpecificRefreshPSNAuthTokenRequestWrapper; + + ClientRefreshPSNAuthTokenOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ClientRegisterForIOSPushNotificationOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFPlatformSpecificRegisterForIOSPushNotificationRequestWrapper; + + ClientRegisterForIOSPushNotificationOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerAwardSteamAchievementOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlatformSpecificAwardSteamAchievementRequestWrapper; + using ResultType = Wrappers::PFPlatformSpecificAwardSteamAchievementResultWrapper; + + ServerAwardSteamAchievementOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems b/Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems new file mode 100644 index 0000000..a032110 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems @@ -0,0 +1,52 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {893D9F15-D625-483B-969F-0E54DED9960D} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems.filters b/Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems.filters new file mode 100644 index 0000000..2b733b0 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PlayFabServices.GeneratedApiWrappers.vcxitems.filters @@ -0,0 +1,113 @@ + + + + + + + + + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + Include + + + Source + + + \ No newline at end of file diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.cpp new file mode 100644 index 0000000..5ca8060 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.cpp @@ -0,0 +1,515 @@ +#include "TestAppPch.h" +#include "PlayerDataManagementOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +ClientGetUserDataOperation::ClientGetUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetUserDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetUserDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementClientGetUserDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetUserDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementClientGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetUserPublisherDataOperation::ClientGetUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetUserPublisherDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetUserPublisherDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementClientGetUserPublisherDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetUserPublisherDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserPublisherDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementClientGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserPublisherDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetUserPublisherReadOnlyDataOperation::ClientGetUserPublisherReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetUserPublisherReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetUserPublisherReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementClientGetUserPublisherReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetUserPublisherReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserPublisherReadOnlyDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementClientGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserPublisherReadOnlyDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetUserReadOnlyDataOperation::ClientGetUserReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetUserReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetUserReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementClientGetUserReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetUserReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserReadOnlyDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementClientGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementClientGetUserReadOnlyDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientUpdateUserDataOperation::ClientUpdateUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUpdateUserDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUpdateUserDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementClientUpdateUserDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientUpdateUserDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementClientUpdateUserDataGetResult(async, &result)); + return ResultType{ result }; +} + + +ClientUpdateUserPublisherDataOperation::ClientUpdateUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientUpdateUserPublisherDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientUpdateUserPublisherDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementClientUpdateUserPublisherDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientUpdateUserPublisherDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementClientUpdateUserPublisherDataGetResult(async, &result)); + return ResultType{ result }; +} + +#if 0 + +ServerGetUserDataOperation::ServerGetUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerGetUserDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementServerGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetUserInternalDataOperation::ServerGetUserInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerGetUserInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserInternalDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserInternalDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementServerGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserInternalDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetUserPublisherDataOperation::ServerGetUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserPublisherDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserPublisherDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerGetUserPublisherDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserPublisherDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserPublisherDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementServerGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserPublisherDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetUserPublisherInternalDataOperation::ServerGetUserPublisherInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserPublisherInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserPublisherInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerGetUserPublisherInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserPublisherInternalDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserPublisherInternalDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementServerGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserPublisherInternalDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetUserPublisherReadOnlyDataOperation::ServerGetUserPublisherReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserPublisherReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserPublisherReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerGetUserPublisherReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserPublisherReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserPublisherReadOnlyDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementServerGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserPublisherReadOnlyDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetUserReadOnlyDataOperation::ServerGetUserReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetUserReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetUserReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerGetUserReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetUserReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserReadOnlyDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFPlayerDataManagementServerGetUserDataResult* result; + RETURN_IF_FAILED(PFPlayerDataManagementServerGetUserReadOnlyDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerUpdateUserDataOperation::ServerUpdateUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateUserDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateUserDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerUpdateUserDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateUserDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementServerUpdateUserDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerUpdateUserInternalDataOperation::ServerUpdateUserInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateUserInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateUserInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerUpdateUserInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateUserInternalDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementServerUpdateUserInternalDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerUpdateUserPublisherDataOperation::ServerUpdateUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateUserPublisherDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateUserPublisherDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerUpdateUserPublisherDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateUserPublisherDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementServerUpdateUserPublisherDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerUpdateUserPublisherInternalDataOperation::ServerUpdateUserPublisherInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateUserPublisherInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateUserPublisherInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerUpdateUserPublisherInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateUserPublisherInternalDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementServerUpdateUserPublisherInternalDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerUpdateUserPublisherReadOnlyDataOperation::ServerUpdateUserPublisherReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateUserPublisherReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateUserPublisherReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateUserPublisherReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementServerUpdateUserPublisherReadOnlyDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerUpdateUserReadOnlyDataOperation::ServerUpdateUserReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerUpdateUserReadOnlyDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerUpdateUserReadOnlyDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPlayerDataManagementServerUpdateUserReadOnlyDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerUpdateUserReadOnlyDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFPlayerDataManagementUpdateUserDataResult result{}; + RETURN_IF_FAILED(PFPlayerDataManagementServerUpdateUserReadOnlyDataGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.h new file mode 100644 index 0000000..75e7538 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PlayerDataManagementOperations.h @@ -0,0 +1,360 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class ClientGetUserDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementClientGetUserDataResultWrapper; + + ClientGetUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetUserPublisherDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementClientGetUserDataResultWrapper; + + ClientGetUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetUserPublisherReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementClientGetUserDataResultWrapper; + + ClientGetUserPublisherReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetUserReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementClientGetUserDataResultWrapper; + + ClientGetUserReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientUpdateUserDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementClientUpdateUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ClientUpdateUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientUpdateUserPublisherDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementClientUpdateUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ClientUpdateUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ServerGetUserDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper; + + ServerGetUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetUserInternalDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper; + + ServerGetUserInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetUserPublisherDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper; + + ServerGetUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetUserPublisherInternalDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper; + + ServerGetUserPublisherInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetUserPublisherReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper; + + ServerGetUserPublisherReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetUserReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementGetUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementServerGetUserDataResultWrapper; + + ServerGetUserReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateUserDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementServerUpdateUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ServerUpdateUserDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateUserInternalDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementUpdateUserInternalDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ServerUpdateUserInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateUserPublisherDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementServerUpdateUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ServerUpdateUserPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateUserPublisherInternalDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementUpdateUserInternalDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ServerUpdateUserPublisherInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateUserPublisherReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementServerUpdateUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ServerUpdateUserPublisherReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerUpdateUserReadOnlyDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFPlayerDataManagementServerUpdateUserDataRequestWrapper; + using ResultType = Wrappers::PFPlayerDataManagementUpdateUserDataResultWrapper; + + ServerUpdateUserReadOnlyDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.cpp new file mode 100644 index 0000000..b08a57b --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.cpp @@ -0,0 +1,151 @@ +#include "TestAppPch.h" +#include "ProfilesOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +GetProfileOperation::GetProfileOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetProfileOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetProfileOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFProfilesGetProfileAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetProfileOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFProfilesGetProfileGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFProfilesGetEntityProfileResponse* result; + RETURN_IF_FAILED(PFProfilesGetProfileGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetProfilesOperation::GetProfilesOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetProfilesOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetProfilesOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFProfilesGetProfilesAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetProfilesOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFProfilesGetProfilesGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFProfilesGetEntityProfilesResponse* result; + RETURN_IF_FAILED(PFProfilesGetProfilesGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +GetTitlePlayersFromMasterPlayerAccountIdsOperation::GetTitlePlayersFromMasterPlayerAccountIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp GetTitlePlayersFromMasterPlayerAccountIdsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT GetTitlePlayersFromMasterPlayerAccountIdsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result GetTitlePlayersFromMasterPlayerAccountIdsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponse* result; + RETURN_IF_FAILED(PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +SetProfileLanguageOperation::SetProfileLanguageOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp SetProfileLanguageOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT SetProfileLanguageOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFProfilesSetProfileLanguageAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result SetProfileLanguageOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFProfilesSetProfileLanguageGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFProfilesSetProfileLanguageResponse* result; + RETURN_IF_FAILED(PFProfilesSetProfileLanguageGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +SetProfilePolicyOperation::SetProfilePolicyOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp SetProfilePolicyOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT SetProfilePolicyOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFProfilesSetProfilePolicyAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result SetProfilePolicyOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFProfilesSetProfilePolicyGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFProfilesSetEntityProfilePolicyResponse* result; + RETURN_IF_FAILED(PFProfilesSetProfilePolicyGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.h new file mode 100644 index 0000000..71711c3 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/ProfilesOperations.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class GetProfileOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFProfilesGetEntityProfileRequestWrapper; + using ResultType = Wrappers::PFProfilesGetEntityProfileResponseWrapper; + + GetProfileOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetProfilesOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFProfilesGetEntityProfilesRequestWrapper; + using ResultType = Wrappers::PFProfilesGetEntityProfilesResponseWrapper; + + GetProfilesOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class GetTitlePlayersFromMasterPlayerAccountIdsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestWrapper; + using ResultType = Wrappers::PFProfilesGetTitlePlayersFromMasterPlayerAccountIdsResponseWrapper; + + GetTitlePlayersFromMasterPlayerAccountIdsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class SetProfileLanguageOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFProfilesSetProfileLanguageRequestWrapper; + using ResultType = Wrappers::PFProfilesSetProfileLanguageResponseWrapper; + + SetProfileLanguageOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class SetProfilePolicyOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFProfilesSetEntityProfilePolicyRequestWrapper; + using ResultType = Wrappers::PFProfilesSetEntityProfilePolicyResponseWrapper; + + SetProfilePolicyOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.cpp new file mode 100644 index 0000000..c00ef71 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.cpp @@ -0,0 +1,53 @@ +#include "TestAppPch.h" +#include "PushNotificationsOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + +#if 0 + +ServerSendPushNotificationOperation::ServerSendPushNotificationOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSendPushNotificationOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSendPushNotificationOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPushNotificationsServerSendPushNotificationAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerSendPushNotificationFromTemplateOperation::ServerSendPushNotificationFromTemplateOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSendPushNotificationFromTemplateOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSendPushNotificationFromTemplateOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFPushNotificationsServerSendPushNotificationFromTemplateAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.h new file mode 100644 index 0000000..6ca1dfe --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/PushNotificationsOperations.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +#if 0 +class ServerSendPushNotificationOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFPushNotificationsSendPushNotificationRequestWrapper; + + ServerSendPushNotificationOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerSendPushNotificationFromTemplateOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFPushNotificationsSendPushNotificationFromTemplateRequestWrapper; + + ServerSendPushNotificationFromTemplateOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.cpp new file mode 100644 index 0000000..e012d02 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.cpp @@ -0,0 +1,227 @@ +#include "TestAppPch.h" +#include "SegmentsOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +ClientGetPlayerSegmentsOperation::ClientGetPlayerSegmentsOperation(Entity entity, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) } +{ +} + +AsyncOp ClientGetPlayerSegmentsOperation::Run(Entity entity, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(rc))); +} + +HRESULT ClientGetPlayerSegmentsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsClientGetPlayerSegmentsAsync(m_entity.Handle(), async); +} + +Result ClientGetPlayerSegmentsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFSegmentsClientGetPlayerSegmentsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFSegmentsGetPlayerSegmentsResult* result; + RETURN_IF_FAILED(PFSegmentsClientGetPlayerSegmentsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetPlayerTagsOperation::ClientGetPlayerTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPlayerTagsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPlayerTagsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsClientGetPlayerTagsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPlayerTagsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFSegmentsClientGetPlayerTagsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFSegmentsGetPlayerTagsResult* result; + RETURN_IF_FAILED(PFSegmentsClientGetPlayerTagsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if 0 + +ServerAddPlayerTagOperation::ServerAddPlayerTagOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerAddPlayerTagOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerAddPlayerTagOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsServerAddPlayerTagAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerGetAllSegmentsOperation::ServerGetAllSegmentsOperation(Entity entity, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) } +{ +} + +AsyncOp ServerGetAllSegmentsOperation::Run(Entity entity, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(rc))); +} + +HRESULT ServerGetAllSegmentsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsServerGetAllSegmentsAsync(m_entity.Handle(), async); +} + +Result ServerGetAllSegmentsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFSegmentsServerGetAllSegmentsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFSegmentsGetAllSegmentsResult* result; + RETURN_IF_FAILED(PFSegmentsServerGetAllSegmentsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayerSegmentsOperation::ServerGetPlayerSegmentsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayerSegmentsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayerSegmentsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsServerGetPlayerSegmentsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayerSegmentsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFSegmentsServerGetPlayerSegmentsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFSegmentsGetPlayerSegmentsResult* result; + RETURN_IF_FAILED(PFSegmentsServerGetPlayerSegmentsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayersInSegmentOperation::ServerGetPlayersInSegmentOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayersInSegmentOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayersInSegmentOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsServerGetPlayersInSegmentAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayersInSegmentOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFSegmentsServerGetPlayersInSegmentGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFSegmentsGetPlayersInSegmentResult* result; + RETURN_IF_FAILED(PFSegmentsServerGetPlayersInSegmentGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetPlayerTagsOperation::ServerGetPlayerTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPlayerTagsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPlayerTagsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsServerGetPlayerTagsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPlayerTagsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFSegmentsServerGetPlayerTagsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFSegmentsGetPlayerTagsResult* result; + RETURN_IF_FAILED(PFSegmentsServerGetPlayerTagsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerRemovePlayerTagOperation::ServerRemovePlayerTagOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerRemovePlayerTagOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerRemovePlayerTagOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFSegmentsServerRemovePlayerTagAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.h new file mode 100644 index 0000000..f749299 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/SegmentsOperations.h @@ -0,0 +1,160 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class ClientGetPlayerSegmentsOperation : public XAsyncOperation> +{ +public: + using ResultType = Wrappers::PFSegmentsGetPlayerSegmentsResultWrapper; + + ClientGetPlayerSegmentsOperation(Entity entity, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; +}; + +class ClientGetPlayerTagsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFSegmentsGetPlayerTagsRequestWrapper; + using ResultType = Wrappers::PFSegmentsGetPlayerTagsResultWrapper; + + ClientGetPlayerTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ServerAddPlayerTagOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFSegmentsAddPlayerTagRequestWrapper; + + ServerAddPlayerTagOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetAllSegmentsOperation : public XAsyncOperation> +{ +public: + using ResultType = Wrappers::PFSegmentsGetAllSegmentsResultWrapper; + + ServerGetAllSegmentsOperation(Entity entity, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; +}; +#endif + +#if 0 +class ServerGetPlayerSegmentsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFSegmentsGetPlayersSegmentsRequestWrapper; + using ResultType = Wrappers::PFSegmentsGetPlayerSegmentsResultWrapper; + + ServerGetPlayerSegmentsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayersInSegmentOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFSegmentsGetPlayersInSegmentRequestWrapper; + using ResultType = Wrappers::PFSegmentsGetPlayersInSegmentResultWrapper; + + ServerGetPlayersInSegmentOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetPlayerTagsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFSegmentsGetPlayerTagsRequestWrapper; + using ResultType = Wrappers::PFSegmentsGetPlayerTagsResultWrapper; + + ServerGetPlayerTagsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerRemovePlayerTagOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFSegmentsRemovePlayerTagRequestWrapper; + + ServerRemovePlayerTagOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.cpp b/Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.cpp new file mode 100644 index 0000000..c1bc440 --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.cpp @@ -0,0 +1,328 @@ +#include "TestAppPch.h" +#include "TitleDataManagementOperations.h" +#include + +namespace PlayFab +{ +namespace Test +{ + + +ClientGetPublisherDataOperation::ClientGetPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetPublisherDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetPublisherDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementClientGetPublisherDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetPublisherDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFTitleDataManagementClientGetPublisherDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFTitleDataManagementGetPublisherDataResult* result; + RETURN_IF_FAILED(PFTitleDataManagementClientGetPublisherDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetTimeOperation::ClientGetTimeOperation(Entity entity, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) } +{ +} + +AsyncOp ClientGetTimeOperation::Run(Entity entity, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(rc))); +} + +HRESULT ClientGetTimeOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementClientGetTimeAsync(m_entity.Handle(), async); +} + +Result ClientGetTimeOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFTitleDataManagementGetTimeResult result{}; + RETURN_IF_FAILED(PFTitleDataManagementClientGetTimeGetResult(async, &result)); + return ResultType{ result }; +} + + +ClientGetTitleDataOperation::ClientGetTitleDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetTitleDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetTitleDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementClientGetTitleDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetTitleDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFTitleDataManagementClientGetTitleDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFTitleDataManagementGetTitleDataResult* result; + RETURN_IF_FAILED(PFTitleDataManagementClientGetTitleDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + + +ClientGetTitleNewsOperation::ClientGetTitleNewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ClientGetTitleNewsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ClientGetTitleNewsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementClientGetTitleNewsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ClientGetTitleNewsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFTitleDataManagementClientGetTitleNewsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFTitleDataManagementGetTitleNewsResult* result; + RETURN_IF_FAILED(PFTitleDataManagementClientGetTitleNewsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} + +#if 0 + +ServerGetPublisherDataOperation::ServerGetPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetPublisherDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetPublisherDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerGetPublisherDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetPublisherDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFTitleDataManagementServerGetPublisherDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFTitleDataManagementGetPublisherDataResult* result; + RETURN_IF_FAILED(PFTitleDataManagementServerGetPublisherDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetTimeOperation::ServerGetTimeOperation(Entity entity, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) } +{ +} + +AsyncOp ServerGetTimeOperation::Run(Entity entity, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(rc))); +} + +HRESULT ServerGetTimeOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerGetTimeAsync(m_entity.Handle(), async); +} + +Result ServerGetTimeOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFTitleDataManagementGetTimeResult result{}; + RETURN_IF_FAILED(PFTitleDataManagementServerGetTimeGetResult(async, &result)); + return ResultType{ result }; +} +#endif + +#if 0 + +ServerGetTitleDataOperation::ServerGetTitleDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetTitleDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetTitleDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerGetTitleDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetTitleDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFTitleDataManagementServerGetTitleDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFTitleDataManagementGetTitleDataResult* result; + RETURN_IF_FAILED(PFTitleDataManagementServerGetTitleDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetTitleInternalDataOperation::ServerGetTitleInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetTitleInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetTitleInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerGetTitleInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetTitleInternalDataOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFTitleDataManagementServerGetTitleInternalDataGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFTitleDataManagementGetTitleDataResult* result; + RETURN_IF_FAILED(PFTitleDataManagementServerGetTitleInternalDataGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerGetTitleNewsOperation::ServerGetTitleNewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerGetTitleNewsOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerGetTitleNewsOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerGetTitleNewsAsync(m_entity.Handle(), &m_request.Model(), async); +} + +Result ServerGetTitleNewsOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t resultSize; + RETURN_IF_FAILED(PFTitleDataManagementServerGetTitleNewsGetResultSize(async, &resultSize)); + Vector resultBuffer(resultSize); + PFTitleDataManagementGetTitleNewsResult* result; + RETURN_IF_FAILED(PFTitleDataManagementServerGetTitleNewsGetResult(async, resultBuffer.size(), resultBuffer.data(), &result, nullptr)); + return ResultType{ *result }; +} +#endif + +#if 0 + +ServerSetPublisherDataOperation::ServerSetPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSetPublisherDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSetPublisherDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerSetPublisherDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerSetTitleDataOperation::ServerSetTitleDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSetTitleDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSetTitleDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerSetTitleDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +#if 0 + +ServerSetTitleInternalDataOperation::ServerSetTitleInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc) : + XAsyncOperation{ std::move(rc) }, + m_entity{ std::move(entity) }, + m_request{ std::move(request) } +{ +} + +AsyncOp ServerSetTitleInternalDataOperation::Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept +{ + return RunOperation(MakeUnique(std::move(entity), std::move(request), std::move(rc))); +} + +HRESULT ServerSetTitleInternalDataOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFTitleDataManagementServerSetTitleInternalDataAsync(m_entity.Handle(), &m_request.Model(), async); +} + +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.h b/Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.h new file mode 100644 index 0000000..e68cc8e --- /dev/null +++ b/Test/PlayFabServices.GeneratedApiWrappers/TitleDataManagementOperations.h @@ -0,0 +1,234 @@ +#pragma once + +#include +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +class ClientGetPublisherDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFTitleDataManagementGetPublisherDataRequestWrapper; + using ResultType = Wrappers::PFTitleDataManagementGetPublisherDataResultWrapper; + + ClientGetPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetTimeOperation : public XAsyncOperation> +{ +public: + using ResultType = Wrappers::PFTitleDataManagementGetTimeResultWrapper; + + ClientGetTimeOperation(Entity entity, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; +}; + +class ClientGetTitleDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFTitleDataManagementGetTitleDataRequestWrapper; + using ResultType = Wrappers::PFTitleDataManagementGetTitleDataResultWrapper; + + ClientGetTitleDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +class ClientGetTitleNewsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFTitleDataManagementGetTitleNewsRequestWrapper; + using ResultType = Wrappers::PFTitleDataManagementGetTitleNewsResultWrapper; + + ClientGetTitleNewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; + +#if 0 +class ServerGetPublisherDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFTitleDataManagementGetPublisherDataRequestWrapper; + using ResultType = Wrappers::PFTitleDataManagementGetPublisherDataResultWrapper; + + ServerGetPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetTimeOperation : public XAsyncOperation> +{ +public: + using ResultType = Wrappers::PFTitleDataManagementGetTimeResultWrapper; + + ServerGetTimeOperation(Entity entity, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; +}; +#endif + +#if 0 +class ServerGetTitleDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFTitleDataManagementGetTitleDataRequestWrapper; + using ResultType = Wrappers::PFTitleDataManagementGetTitleDataResultWrapper; + + ServerGetTitleDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetTitleInternalDataOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFTitleDataManagementGetTitleDataRequestWrapper; + using ResultType = Wrappers::PFTitleDataManagementGetTitleDataResultWrapper; + + ServerGetTitleInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerGetTitleNewsOperation : public XAsyncOperation> +{ +public: + using RequestType = Wrappers::PFTitleDataManagementGetTitleNewsRequestWrapper; + using ResultType = Wrappers::PFTitleDataManagementGetTitleNewsResultWrapper; + + ServerGetTitleNewsOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp> Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerSetPublisherDataOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFTitleDataManagementSetPublisherDataRequestWrapper; + + ServerSetPublisherDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerSetTitleDataOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFTitleDataManagementSetTitleDataRequestWrapper; + + ServerSetTitleDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +#if 0 +class ServerSetTitleInternalDataOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFTitleDataManagementSetTitleDataRequestWrapper; + + ServerSetTitleInternalDataOperation(Entity entity, RequestType request, PlayFab::RunContext rc); + + static AsyncOp Run(Entity entity, RequestType request, PlayFab::RunContext rc) noexcept; + +private: + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + + Entity m_entity; + RequestType m_request; +}; +#endif + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/AccountManagementTests.cpp b/Test/PlayFabServices.GeneratedTests/AccountManagementTests.cpp new file mode 100644 index 0000000..cfdd9d8 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/AccountManagementTests.cpp @@ -0,0 +1,270 @@ +#include "TestAppPch.h" +#include "AccountManagementTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void AccountManagementTests::AddTests() +{ +#if 0 + AddTest("TestClientAddOrUpdateContactEmail", &AccountManagementTests::TestClientAddOrUpdateContactEmail); +#endif +#if 0 + AddTest("TestClientAddUsernamePassword", &AccountManagementTests::TestClientAddUsernamePassword); +#endif + AddTest("TestClientGetAccountInfo", &AccountManagementTests::TestClientGetAccountInfo); + AddTest("TestClientGetPlayerCombinedInfo", &AccountManagementTests::TestClientGetPlayerCombinedInfo); + AddTest("TestClientGetPlayerProfile", &AccountManagementTests::TestClientGetPlayerProfile); +#if 0 + AddTest("TestClientGetPlayFabIDsFromFacebookIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromFacebookIDs); +#endif +#if 0 + AddTest("TestClientGetPlayFabIDsFromFacebookInstantGamesIds", &AccountManagementTests::TestClientGetPlayFabIDsFromFacebookInstantGamesIds); +#endif +#if 0 + AddTest("TestClientGetPlayFabIDsFromGameCenterIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromGameCenterIDs); +#endif +#if 0 + AddTest("TestClientGetPlayFabIDsFromGoogleIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromGoogleIDs); +#endif +#if 0 + AddTest("TestClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs); +#endif +#if 0 + AddTest("TestClientGetPlayFabIDsFromKongregateIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromKongregateIDs); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + AddTest("TestClientGetPlayFabIDsFromNintendoServiceAccountIds", &AccountManagementTests::TestClientGetPlayFabIDsFromNintendoServiceAccountIds); +#endif +#if 0 + AddTest("TestClientGetPlayFabIDsFromNintendoSwitchDeviceIds", &AccountManagementTests::TestClientGetPlayFabIDsFromNintendoSwitchDeviceIds); +#endif +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + AddTest("TestClientGetPlayFabIDsFromPSNAccountIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromPSNAccountIDs); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + AddTest("TestClientGetPlayFabIDsFromSteamIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromSteamIDs); +#endif +#if 0 + AddTest("TestClientGetPlayFabIDsFromTwitchIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromTwitchIDs); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + AddTest("TestClientGetPlayFabIDsFromXboxLiveIDs", &AccountManagementTests::TestClientGetPlayFabIDsFromXboxLiveIDs); +#endif +#if 0 + AddTest("TestClientLinkAndroidDeviceID", &AccountManagementTests::TestClientLinkAndroidDeviceID); +#endif +#if 0 + AddTest("TestClientLinkApple", &AccountManagementTests::TestClientLinkApple); +#endif + AddTest("TestClientLinkCustomID", &AccountManagementTests::TestClientLinkCustomID); +#if 0 + AddTest("TestClientLinkFacebookAccount", &AccountManagementTests::TestClientLinkFacebookAccount); +#endif +#if 0 + AddTest("TestClientLinkFacebookInstantGamesId", &AccountManagementTests::TestClientLinkFacebookInstantGamesId); +#endif +#if 0 + AddTest("TestClientLinkGameCenterAccount", &AccountManagementTests::TestClientLinkGameCenterAccount); +#endif +#if 0 + AddTest("TestClientLinkGoogleAccount", &AccountManagementTests::TestClientLinkGoogleAccount); +#endif +#if 0 + AddTest("TestClientLinkGooglePlayGamesServicesAccount", &AccountManagementTests::TestClientLinkGooglePlayGamesServicesAccount); +#endif +#if 0 + AddTest("TestClientLinkIOSDeviceID", &AccountManagementTests::TestClientLinkIOSDeviceID); +#endif +#if 0 + AddTest("TestClientLinkKongregate", &AccountManagementTests::TestClientLinkKongregate); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + AddTest("TestClientLinkNintendoServiceAccount", &AccountManagementTests::TestClientLinkNintendoServiceAccount); +#endif +#if 0 + AddTest("TestClientLinkNintendoSwitchDeviceId", &AccountManagementTests::TestClientLinkNintendoSwitchDeviceId); +#endif + AddTest("TestClientLinkOpenIdConnect", &AccountManagementTests::TestClientLinkOpenIdConnect); +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + AddTest("TestClientLinkPSNAccount", &AccountManagementTests::TestClientLinkPSNAccount); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + AddTest("TestClientLinkSteamAccount", &AccountManagementTests::TestClientLinkSteamAccount); +#endif +#if 0 + AddTest("TestClientLinkTwitch", &AccountManagementTests::TestClientLinkTwitch); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + AddTest("TestClientLinkXboxAccount", &AccountManagementTests::TestClientLinkXboxAccount); +#endif +#if 0 + AddTest("TestClientRemoveContactEmail", &AccountManagementTests::TestClientRemoveContactEmail); +#endif + AddTest("TestClientReportPlayer", &AccountManagementTests::TestClientReportPlayer); +#if 0 + AddTest("TestClientSendAccountRecoveryEmail", &AccountManagementTests::TestClientSendAccountRecoveryEmail); +#endif +#if 0 + AddTest("TestClientUnlinkAndroidDeviceID", &AccountManagementTests::TestClientUnlinkAndroidDeviceID); +#endif +#if 0 + AddTest("TestClientUnlinkApple", &AccountManagementTests::TestClientUnlinkApple); +#endif + AddTest("TestClientUnlinkCustomID", &AccountManagementTests::TestClientUnlinkCustomID); +#if 0 + AddTest("TestClientUnlinkFacebookAccount", &AccountManagementTests::TestClientUnlinkFacebookAccount); +#endif +#if 0 + AddTest("TestClientUnlinkFacebookInstantGamesId", &AccountManagementTests::TestClientUnlinkFacebookInstantGamesId); +#endif +#if 0 + AddTest("TestClientUnlinkGameCenterAccount", &AccountManagementTests::TestClientUnlinkGameCenterAccount); +#endif +#if 0 + AddTest("TestClientUnlinkGoogleAccount", &AccountManagementTests::TestClientUnlinkGoogleAccount); +#endif +#if 0 + AddTest("TestClientUnlinkGooglePlayGamesServicesAccount", &AccountManagementTests::TestClientUnlinkGooglePlayGamesServicesAccount); +#endif +#if 0 + AddTest("TestClientUnlinkIOSDeviceID", &AccountManagementTests::TestClientUnlinkIOSDeviceID); +#endif +#if 0 + AddTest("TestClientUnlinkKongregate", &AccountManagementTests::TestClientUnlinkKongregate); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + AddTest("TestClientUnlinkNintendoServiceAccount", &AccountManagementTests::TestClientUnlinkNintendoServiceAccount); +#endif +#if 0 + AddTest("TestClientUnlinkNintendoSwitchDeviceId", &AccountManagementTests::TestClientUnlinkNintendoSwitchDeviceId); +#endif + AddTest("TestClientUnlinkOpenIdConnect", &AccountManagementTests::TestClientUnlinkOpenIdConnect); +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + AddTest("TestClientUnlinkPSNAccount", &AccountManagementTests::TestClientUnlinkPSNAccount); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + AddTest("TestClientUnlinkSteamAccount", &AccountManagementTests::TestClientUnlinkSteamAccount); +#endif +#if 0 + AddTest("TestClientUnlinkTwitch", &AccountManagementTests::TestClientUnlinkTwitch); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + AddTest("TestClientUnlinkXboxAccount", &AccountManagementTests::TestClientUnlinkXboxAccount); +#endif + AddTest("TestClientUpdateAvatarUrl", &AccountManagementTests::TestClientUpdateAvatarUrl); +#if 0 + AddTest("TestClientUpdateUserTitleDisplayName", &AccountManagementTests::TestClientUpdateUserTitleDisplayName); +#endif +#if 0 + AddTest("TestServerBanUsers", &AccountManagementTests::TestServerBanUsers); +#endif +#if 0 + AddTest("TestServerDeletePlayer", &AccountManagementTests::TestServerDeletePlayer); +#endif +#if 0 + AddTest("TestServerGetPlayerCombinedInfo", &AccountManagementTests::TestServerGetPlayerCombinedInfo); +#endif +#if 0 + AddTest("TestServerGetPlayerProfile", &AccountManagementTests::TestServerGetPlayerProfile); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromFacebookIDs", &AccountManagementTests::TestServerGetPlayFabIDsFromFacebookIDs); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromFacebookInstantGamesIds", &AccountManagementTests::TestServerGetPlayFabIDsFromFacebookInstantGamesIds); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromNintendoServiceAccountIds", &AccountManagementTests::TestServerGetPlayFabIDsFromNintendoServiceAccountIds); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromNintendoSwitchDeviceIds", &AccountManagementTests::TestServerGetPlayFabIDsFromNintendoSwitchDeviceIds); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromPSNAccountIDs", &AccountManagementTests::TestServerGetPlayFabIDsFromPSNAccountIDs); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromSteamIDs", &AccountManagementTests::TestServerGetPlayFabIDsFromSteamIDs); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromTwitchIDs", &AccountManagementTests::TestServerGetPlayFabIDsFromTwitchIDs); +#endif +#if 0 + AddTest("TestServerGetPlayFabIDsFromXboxLiveIDs", &AccountManagementTests::TestServerGetPlayFabIDsFromXboxLiveIDs); +#endif +#if 0 + AddTest("TestServerGetServerCustomIDsFromPlayFabIDs", &AccountManagementTests::TestServerGetServerCustomIDsFromPlayFabIDs); +#endif +#if 0 + AddTest("TestServerGetUserAccountInfo", &AccountManagementTests::TestServerGetUserAccountInfo); +#endif +#if 0 + AddTest("TestServerGetUserBans", &AccountManagementTests::TestServerGetUserBans); +#endif +#if 0 + AddTest("TestServerLinkNintendoServiceAccount", &AccountManagementTests::TestServerLinkNintendoServiceAccount); +#endif +#if 0 + AddTest("TestServerLinkNintendoSwitchDeviceId", &AccountManagementTests::TestServerLinkNintendoSwitchDeviceId); +#endif +#if 0 + AddTest("TestServerLinkPSNAccount", &AccountManagementTests::TestServerLinkPSNAccount); +#endif +#if 0 + AddTest("TestServerLinkPSNId", &AccountManagementTests::TestServerLinkPSNId); +#endif +#if 0 + AddTest("TestServerLinkServerCustomId", &AccountManagementTests::TestServerLinkServerCustomId); +#endif +#if 0 + AddTest("TestServerLinkSteamId", &AccountManagementTests::TestServerLinkSteamId); +#endif +#if 0 + AddTest("TestServerLinkXboxAccount", &AccountManagementTests::TestServerLinkXboxAccount); +#endif +#if 0 + AddTest("TestServerRevokeAllBansForUser", &AccountManagementTests::TestServerRevokeAllBansForUser); +#endif +#if 0 + AddTest("TestServerRevokeBans", &AccountManagementTests::TestServerRevokeBans); +#endif +#if 0 + AddTest("TestServerSendCustomAccountRecoveryEmail", &AccountManagementTests::TestServerSendCustomAccountRecoveryEmail); +#endif +#if 0 + AddTest("TestServerSendEmailFromTemplate", &AccountManagementTests::TestServerSendEmailFromTemplate); +#endif +#if 0 + AddTest("TestServerUnlinkNintendoServiceAccount", &AccountManagementTests::TestServerUnlinkNintendoServiceAccount); +#endif +#if 0 + AddTest("TestServerUnlinkNintendoSwitchDeviceId", &AccountManagementTests::TestServerUnlinkNintendoSwitchDeviceId); +#endif +#if 0 + AddTest("TestServerUnlinkPSNAccount", &AccountManagementTests::TestServerUnlinkPSNAccount); +#endif +#if 0 + AddTest("TestServerUnlinkServerCustomId", &AccountManagementTests::TestServerUnlinkServerCustomId); +#endif +#if 0 + AddTest("TestServerUnlinkSteamId", &AccountManagementTests::TestServerUnlinkSteamId); +#endif +#if 0 + AddTest("TestServerUnlinkXboxAccount", &AccountManagementTests::TestServerUnlinkXboxAccount); +#endif +#if 0 + AddTest("TestServerUpdateAvatarUrl", &AccountManagementTests::TestServerUpdateAvatarUrl); +#endif +#if 0 + AddTest("TestServerUpdateBans", &AccountManagementTests::TestServerUpdateBans); +#endif +#if 0 + AddTest("TestGetTitlePlayersFromXboxLiveIDs", &AccountManagementTests::TestGetTitlePlayersFromXboxLiveIDs); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/AccountManagementTests.h b/Test/PlayFabServices.GeneratedTests/AccountManagementTests.h new file mode 100644 index 0000000..fe592b3 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/AccountManagementTests.h @@ -0,0 +1,284 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class AccountManagementTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests +#if 0 + void TestClientAddOrUpdateContactEmail(TestContext& testContext); +#endif +#if 0 + void TestClientAddUsernamePassword(TestContext& testContext); +#endif + void TestClientGetAccountInfo(TestContext& testContext); + void TestClientGetPlayerCombinedInfo(TestContext& testContext); + void TestClientGetPlayerProfile(TestContext& testContext); +#if 0 + void TestClientGetPlayFabIDsFromFacebookIDs(TestContext& testContext); +#endif +#if 0 + void TestClientGetPlayFabIDsFromFacebookInstantGamesIds(TestContext& testContext); +#endif +#if 0 + void TestClientGetPlayFabIDsFromGameCenterIDs(TestContext& testContext); +#endif +#if 0 + void TestClientGetPlayFabIDsFromGoogleIDs(TestContext& testContext); +#endif +#if 0 + void TestClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs(TestContext& testContext); +#endif +#if 0 + void TestClientGetPlayFabIDsFromKongregateIDs(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + void TestClientGetPlayFabIDsFromNintendoServiceAccountIds(TestContext& testContext); +#endif +#if 0 + void TestClientGetPlayFabIDsFromNintendoSwitchDeviceIds(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + void TestClientGetPlayFabIDsFromPSNAccountIDs(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + void TestClientGetPlayFabIDsFromSteamIDs(TestContext& testContext); +#endif +#if 0 + void TestClientGetPlayFabIDsFromTwitchIDs(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + void TestClientGetPlayFabIDsFromXboxLiveIDs(TestContext& testContext); +#endif +#if 0 + void TestClientLinkAndroidDeviceID(TestContext& testContext); +#endif +#if 0 + void TestClientLinkApple(TestContext& testContext); +#endif + void TestClientLinkCustomID(TestContext& testContext); +#if 0 + void TestClientLinkFacebookAccount(TestContext& testContext); +#endif +#if 0 + void TestClientLinkFacebookInstantGamesId(TestContext& testContext); +#endif +#if 0 + void TestClientLinkGameCenterAccount(TestContext& testContext); +#endif +#if 0 + void TestClientLinkGoogleAccount(TestContext& testContext); +#endif +#if 0 + void TestClientLinkGooglePlayGamesServicesAccount(TestContext& testContext); +#endif +#if 0 + void TestClientLinkIOSDeviceID(TestContext& testContext); +#endif +#if 0 + void TestClientLinkKongregate(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + void TestClientLinkNintendoServiceAccount(TestContext& testContext); +#endif +#if 0 + void TestClientLinkNintendoSwitchDeviceId(TestContext& testContext); +#endif + void TestClientLinkOpenIdConnect(TestContext& testContext); +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + void TestClientLinkPSNAccount(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + void TestClientLinkSteamAccount(TestContext& testContext); +#endif +#if 0 + void TestClientLinkTwitch(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + void TestClientLinkXboxAccount(TestContext& testContext); +#endif +#if 0 + void TestClientRemoveContactEmail(TestContext& testContext); +#endif + void TestClientReportPlayer(TestContext& testContext); +#if 0 + void TestClientSendAccountRecoveryEmail(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkAndroidDeviceID(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkApple(TestContext& testContext); +#endif + void TestClientUnlinkCustomID(TestContext& testContext); +#if 0 + void TestClientUnlinkFacebookAccount(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkFacebookInstantGamesId(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkGameCenterAccount(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkGoogleAccount(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkGooglePlayGamesServicesAccount(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkIOSDeviceID(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkKongregate(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + void TestClientUnlinkNintendoServiceAccount(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkNintendoSwitchDeviceId(TestContext& testContext); +#endif + void TestClientUnlinkOpenIdConnect(TestContext& testContext); +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + void TestClientUnlinkPSNAccount(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + void TestClientUnlinkSteamAccount(TestContext& testContext); +#endif +#if 0 + void TestClientUnlinkTwitch(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + void TestClientUnlinkXboxAccount(TestContext& testContext); +#endif + void TestClientUpdateAvatarUrl(TestContext& testContext); +#if 0 + void TestClientUpdateUserTitleDisplayName(TestContext& testContext); +#endif +#if 0 + void TestServerBanUsers(TestContext& testContext); +#endif +#if 0 + void TestServerDeletePlayer(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayerCombinedInfo(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayerProfile(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromFacebookIDs(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromFacebookInstantGamesIds(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromNintendoServiceAccountIds(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromNintendoSwitchDeviceIds(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromPSNAccountIDs(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromSteamIDs(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromTwitchIDs(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayFabIDsFromXboxLiveIDs(TestContext& testContext); +#endif +#if 0 + void TestServerGetServerCustomIDsFromPlayFabIDs(TestContext& testContext); +#endif +#if 0 + void TestServerGetUserAccountInfo(TestContext& testContext); +#endif +#if 0 + void TestServerGetUserBans(TestContext& testContext); +#endif +#if 0 + void TestServerLinkNintendoServiceAccount(TestContext& testContext); +#endif +#if 0 + void TestServerLinkNintendoSwitchDeviceId(TestContext& testContext); +#endif +#if 0 + void TestServerLinkPSNAccount(TestContext& testContext); +#endif +#if 0 + void TestServerLinkPSNId(TestContext& testContext); +#endif +#if 0 + void TestServerLinkServerCustomId(TestContext& testContext); +#endif +#if 0 + void TestServerLinkSteamId(TestContext& testContext); +#endif +#if 0 + void TestServerLinkXboxAccount(TestContext& testContext); +#endif +#if 0 + void TestServerRevokeAllBansForUser(TestContext& testContext); +#endif +#if 0 + void TestServerRevokeBans(TestContext& testContext); +#endif +#if 0 + void TestServerSendCustomAccountRecoveryEmail(TestContext& testContext); +#endif +#if 0 + void TestServerSendEmailFromTemplate(TestContext& testContext); +#endif +#if 0 + void TestServerUnlinkNintendoServiceAccount(TestContext& testContext); +#endif +#if 0 + void TestServerUnlinkNintendoSwitchDeviceId(TestContext& testContext); +#endif +#if 0 + void TestServerUnlinkPSNAccount(TestContext& testContext); +#endif +#if 0 + void TestServerUnlinkServerCustomId(TestContext& testContext); +#endif +#if 0 + void TestServerUnlinkSteamId(TestContext& testContext); +#endif +#if 0 + void TestServerUnlinkXboxAccount(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateAvatarUrl(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateBans(TestContext& testContext); +#endif +#if 0 + void TestGetTitlePlayersFromXboxLiveIDs(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/AccountManagementTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/AccountManagementTestsImpl.stubs new file mode 100644 index 0000000..4aef180 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/AccountManagementTestsImpl.stubs @@ -0,0 +1,641 @@ +#include "TestAppPch.h" +#include "AccountManagementTests.h" +#include "AccountManagementOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp AccountManagementTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp AccountManagementTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if 0 +void AccountManagementTests::TestClientAddOrUpdateContactEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientAddUsernamePassword(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientGetAccountInfo(TestContext& tc) +{ + tc.Skip(); +} + +void AccountManagementTests::TestClientGetPlayerCombinedInfo(TestContext& tc) +{ + tc.Skip(); +} + +void AccountManagementTests::TestClientGetPlayerProfile(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromFacebookIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromFacebookInstantGamesIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromGameCenterIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromGoogleIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromKongregateIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientGetPlayFabIDsFromNintendoServiceAccountIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromNintendoSwitchDeviceIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +void AccountManagementTests::TestClientGetPlayFabIDsFromPSNAccountIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +void AccountManagementTests::TestClientGetPlayFabIDsFromSteamIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientGetPlayFabIDsFromTwitchIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromXboxLiveIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkAndroidDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkApple(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientLinkCustomID(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void AccountManagementTests::TestClientLinkFacebookAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkFacebookInstantGamesId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkGameCenterAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkGoogleAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkGooglePlayGamesServicesAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkIOSDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkKongregate(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientLinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientLinkOpenIdConnect(TestContext& tc) +{ + tc.Skip(); +} + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +void AccountManagementTests::TestClientLinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +void AccountManagementTests::TestClientLinkSteamAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientLinkTwitch(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkXboxAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientRemoveContactEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientReportPlayer(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void AccountManagementTests::TestClientSendAccountRecoveryEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkAndroidDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkApple(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientUnlinkCustomID(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void AccountManagementTests::TestClientUnlinkFacebookAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkFacebookInstantGamesId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkGameCenterAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkGoogleAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkGooglePlayGamesServicesAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkIOSDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkKongregate(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientUnlinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientUnlinkOpenIdConnect(TestContext& tc) +{ + tc.Skip(); +} + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +void AccountManagementTests::TestClientUnlinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +void AccountManagementTests::TestClientUnlinkSteamAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestClientUnlinkTwitch(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkXboxAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientUpdateAvatarUrl(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void AccountManagementTests::TestClientUpdateUserTitleDisplayName(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerBanUsers(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerDeletePlayer(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayerCombinedInfo(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayerProfile(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromFacebookIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromFacebookInstantGamesIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromNintendoServiceAccountIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromNintendoSwitchDeviceIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromPSNAccountIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromSteamIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromTwitchIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetPlayFabIDsFromXboxLiveIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetServerCustomIDsFromPlayFabIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetUserAccountInfo(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerGetUserBans(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerLinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerLinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerLinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerLinkPSNId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerLinkServerCustomId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerLinkSteamId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerLinkXboxAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerRevokeAllBansForUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerRevokeBans(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerSendCustomAccountRecoveryEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerSendEmailFromTemplate(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUnlinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUnlinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUnlinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUnlinkServerCustomId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUnlinkSteamId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUnlinkXboxAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUpdateAvatarUrl(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestServerUpdateBans(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void AccountManagementTests::TestGetTitlePlayersFromXboxLiveIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/CatalogTests.cpp b/Test/PlayFabServices.GeneratedTests/CatalogTests.cpp new file mode 100644 index 0000000..52432ae --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CatalogTests.cpp @@ -0,0 +1,53 @@ +#include "TestAppPch.h" +#include "CatalogTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void CatalogTests::AddTests() +{ + AddTest("TestCreateDraftItem", &CatalogTests::TestCreateDraftItem); + AddTest("TestCreateUploadUrls", &CatalogTests::TestCreateUploadUrls); +#if 0 + AddTest("TestDeleteEntityItemReviews", &CatalogTests::TestDeleteEntityItemReviews); +#endif + AddTest("TestDeleteItem", &CatalogTests::TestDeleteItem); +#if 0 + AddTest("TestGetCatalogConfig", &CatalogTests::TestGetCatalogConfig); +#endif + AddTest("TestGetDraftItem", &CatalogTests::TestGetDraftItem); + AddTest("TestGetDraftItems", &CatalogTests::TestGetDraftItems); + AddTest("TestGetEntityDraftItems", &CatalogTests::TestGetEntityDraftItems); + AddTest("TestGetEntityItemReview", &CatalogTests::TestGetEntityItemReview); + AddTest("TestGetItem", &CatalogTests::TestGetItem); + AddTest("TestGetItemContainers", &CatalogTests::TestGetItemContainers); +#if 0 + AddTest("TestGetItemModerationState", &CatalogTests::TestGetItemModerationState); +#endif + AddTest("TestGetItemPublishStatus", &CatalogTests::TestGetItemPublishStatus); + AddTest("TestGetItemReviews", &CatalogTests::TestGetItemReviews); + AddTest("TestGetItemReviewSummary", &CatalogTests::TestGetItemReviewSummary); + AddTest("TestGetItems", &CatalogTests::TestGetItems); + AddTest("TestPublishDraftItem", &CatalogTests::TestPublishDraftItem); + AddTest("TestReportItem", &CatalogTests::TestReportItem); + AddTest("TestReportItemReview", &CatalogTests::TestReportItemReview); + AddTest("TestReviewItem", &CatalogTests::TestReviewItem); + AddTest("TestSearchItems", &CatalogTests::TestSearchItems); +#if 0 + AddTest("TestSetItemModerationState", &CatalogTests::TestSetItemModerationState); +#endif + AddTest("TestSubmitItemReviewVote", &CatalogTests::TestSubmitItemReviewVote); +#if 0 + AddTest("TestTakedownItemReviews", &CatalogTests::TestTakedownItemReviews); +#endif +#if 0 + AddTest("TestUpdateCatalogConfig", &CatalogTests::TestUpdateCatalogConfig); +#endif + AddTest("TestUpdateDraftItem", &CatalogTests::TestUpdateDraftItem); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/CatalogTests.h b/Test/PlayFabServices.GeneratedTests/CatalogTests.h new file mode 100644 index 0000000..f7df550 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CatalogTests.h @@ -0,0 +1,67 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class CatalogTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestCreateDraftItem(TestContext& testContext); + void TestCreateUploadUrls(TestContext& testContext); +#if 0 + void TestDeleteEntityItemReviews(TestContext& testContext); +#endif + void TestDeleteItem(TestContext& testContext); +#if 0 + void TestGetCatalogConfig(TestContext& testContext); +#endif + void TestGetDraftItem(TestContext& testContext); + void TestGetDraftItems(TestContext& testContext); + void TestGetEntityDraftItems(TestContext& testContext); + void TestGetEntityItemReview(TestContext& testContext); + void TestGetItem(TestContext& testContext); + void TestGetItemContainers(TestContext& testContext); +#if 0 + void TestGetItemModerationState(TestContext& testContext); +#endif + void TestGetItemPublishStatus(TestContext& testContext); + void TestGetItemReviews(TestContext& testContext); + void TestGetItemReviewSummary(TestContext& testContext); + void TestGetItems(TestContext& testContext); + void TestPublishDraftItem(TestContext& testContext); + void TestReportItem(TestContext& testContext); + void TestReportItemReview(TestContext& testContext); + void TestReviewItem(TestContext& testContext); + void TestSearchItems(TestContext& testContext); +#if 0 + void TestSetItemModerationState(TestContext& testContext); +#endif + void TestSubmitItemReviewVote(TestContext& testContext); +#if 0 + void TestTakedownItemReviews(TestContext& testContext); +#endif +#if 0 + void TestUpdateCatalogConfig(TestContext& testContext); +#endif + void TestUpdateDraftItem(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/CatalogTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/CatalogTestsImpl.stubs new file mode 100644 index 0000000..0310dc0 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CatalogTestsImpl.stubs @@ -0,0 +1,164 @@ +#include "TestAppPch.h" +#include "CatalogTests.h" +#include "CatalogOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp CatalogTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp CatalogTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void CatalogTests::TestCreateDraftItem(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestCreateUploadUrls(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void CatalogTests::TestDeleteEntityItemReviews(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestDeleteItem(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void CatalogTests::TestGetCatalogConfig(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestGetDraftItem(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetDraftItems(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetEntityDraftItems(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetEntityItemReview(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetItem(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetItemContainers(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void CatalogTests::TestGetItemModerationState(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestGetItemPublishStatus(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetItemReviews(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetItemReviewSummary(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestGetItems(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestPublishDraftItem(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestReportItem(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestReportItemReview(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestReviewItem(TestContext& tc) +{ + tc.Skip(); +} + +void CatalogTests::TestSearchItems(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void CatalogTests::TestSetItemModerationState(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestSubmitItemReviewVote(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void CatalogTests::TestTakedownItemReviews(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CatalogTests::TestUpdateCatalogConfig(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestUpdateDraftItem(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/CharacterTests.cpp b/Test/PlayFabServices.GeneratedTests/CharacterTests.cpp new file mode 100644 index 0000000..dcdf325 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CharacterTests.cpp @@ -0,0 +1,57 @@ +#include "TestAppPch.h" +#include "CharacterTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void CharacterTests::AddTests() +{ +#if 0 + AddTest("TestClientGetAllUsersCharacters", &CharacterTests::TestClientGetAllUsersCharacters); +#endif +#if 0 + AddTest("TestClientGetCharacterData", &CharacterTests::TestClientGetCharacterData); +#endif +#if 0 + AddTest("TestClientGetCharacterReadOnlyData", &CharacterTests::TestClientGetCharacterReadOnlyData); +#endif +#if 0 + AddTest("TestClientGrantCharacterToUser", &CharacterTests::TestClientGrantCharacterToUser); +#endif +#if 0 + AddTest("TestClientUpdateCharacterData", &CharacterTests::TestClientUpdateCharacterData); +#endif +#if 0 + AddTest("TestServerDeleteCharacterFromUser", &CharacterTests::TestServerDeleteCharacterFromUser); +#endif +#if 0 + AddTest("TestServerGetAllUsersCharacters", &CharacterTests::TestServerGetAllUsersCharacters); +#endif +#if 0 + AddTest("TestServerGetCharacterData", &CharacterTests::TestServerGetCharacterData); +#endif +#if 0 + AddTest("TestServerGetCharacterInternalData", &CharacterTests::TestServerGetCharacterInternalData); +#endif +#if 0 + AddTest("TestServerGetCharacterReadOnlyData", &CharacterTests::TestServerGetCharacterReadOnlyData); +#endif +#if 0 + AddTest("TestServerGrantCharacterToUser", &CharacterTests::TestServerGrantCharacterToUser); +#endif +#if 0 + AddTest("TestServerUpdateCharacterData", &CharacterTests::TestServerUpdateCharacterData); +#endif +#if 0 + AddTest("TestServerUpdateCharacterInternalData", &CharacterTests::TestServerUpdateCharacterInternalData); +#endif +#if 0 + AddTest("TestServerUpdateCharacterReadOnlyData", &CharacterTests::TestServerUpdateCharacterReadOnlyData); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/CharacterTests.h b/Test/PlayFabServices.GeneratedTests/CharacterTests.h new file mode 100644 index 0000000..c321977 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CharacterTests.h @@ -0,0 +1,71 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class CharacterTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests +#if 0 + void TestClientGetAllUsersCharacters(TestContext& testContext); +#endif +#if 0 + void TestClientGetCharacterData(TestContext& testContext); +#endif +#if 0 + void TestClientGetCharacterReadOnlyData(TestContext& testContext); +#endif +#if 0 + void TestClientGrantCharacterToUser(TestContext& testContext); +#endif +#if 0 + void TestClientUpdateCharacterData(TestContext& testContext); +#endif +#if 0 + void TestServerDeleteCharacterFromUser(TestContext& testContext); +#endif +#if 0 + void TestServerGetAllUsersCharacters(TestContext& testContext); +#endif +#if 0 + void TestServerGetCharacterData(TestContext& testContext); +#endif +#if 0 + void TestServerGetCharacterInternalData(TestContext& testContext); +#endif +#if 0 + void TestServerGetCharacterReadOnlyData(TestContext& testContext); +#endif +#if 0 + void TestServerGrantCharacterToUser(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateCharacterData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateCharacterInternalData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateCharacterReadOnlyData(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/CharacterTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/CharacterTestsImpl.stubs new file mode 100644 index 0000000..150f5cb --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CharacterTestsImpl.stubs @@ -0,0 +1,120 @@ +#include "TestAppPch.h" +#include "CharacterTests.h" +#include "CharacterOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp CharacterTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp CharacterTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if 0 +void CharacterTests::TestClientGetAllUsersCharacters(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestClientGetCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestClientGetCharacterReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestClientGrantCharacterToUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestClientUpdateCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerDeleteCharacterFromUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerGetAllUsersCharacters(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerGetCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerGetCharacterInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerGetCharacterReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerGrantCharacterToUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerUpdateCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerUpdateCharacterInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void CharacterTests::TestServerUpdateCharacterReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/CloudScriptTests.cpp b/Test/PlayFabServices.GeneratedTests/CloudScriptTests.cpp new file mode 100644 index 0000000..a316531 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CloudScriptTests.cpp @@ -0,0 +1,16 @@ +#include "TestAppPch.h" +#include "CloudScriptTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void CloudScriptTests::AddTests() +{ + AddTest("TestExecuteFunction", &CloudScriptTests::TestExecuteFunction); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/CloudScriptTests.h b/Test/PlayFabServices.GeneratedTests/CloudScriptTests.h new file mode 100644 index 0000000..e8582d3 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CloudScriptTests.h @@ -0,0 +1,30 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class CloudScriptTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestExecuteFunction(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/CloudScriptTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/CloudScriptTestsImpl.stubs new file mode 100644 index 0000000..49f695d --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/CloudScriptTestsImpl.stubs @@ -0,0 +1,27 @@ +#include "TestAppPch.h" +#include "CloudScriptTests.h" +#include "CloudScriptOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp CloudScriptTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp CloudScriptTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void CloudScriptTests::TestExecuteFunction(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/DataTests.cpp b/Test/PlayFabServices.GeneratedTests/DataTests.cpp new file mode 100644 index 0000000..1a500ba --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/DataTests.cpp @@ -0,0 +1,22 @@ +#include "TestAppPch.h" +#include "DataTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void DataTests::AddTests() +{ + AddTest("TestAbortFileUploads", &DataTests::TestAbortFileUploads); + AddTest("TestDeleteFiles", &DataTests::TestDeleteFiles); + AddTest("TestFinalizeFileUploads", &DataTests::TestFinalizeFileUploads); + AddTest("TestGetFiles", &DataTests::TestGetFiles); + AddTest("TestGetObjects", &DataTests::TestGetObjects); + AddTest("TestInitiateFileUploads", &DataTests::TestInitiateFileUploads); + AddTest("TestSetObjects", &DataTests::TestSetObjects); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/DataTests.h b/Test/PlayFabServices.GeneratedTests/DataTests.h new file mode 100644 index 0000000..1939cd0 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/DataTests.h @@ -0,0 +1,36 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class DataTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestAbortFileUploads(TestContext& testContext); + void TestDeleteFiles(TestContext& testContext); + void TestFinalizeFileUploads(TestContext& testContext); + void TestGetFiles(TestContext& testContext); + void TestGetObjects(TestContext& testContext); + void TestInitiateFileUploads(TestContext& testContext); + void TestSetObjects(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/DataTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/DataTestsImpl.stubs new file mode 100644 index 0000000..84abb18 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/DataTestsImpl.stubs @@ -0,0 +1,57 @@ +#include "TestAppPch.h" +#include "DataTests.h" +#include "DataOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp DataTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp DataTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void DataTests::TestAbortFileUploads(TestContext& tc) +{ + tc.Skip(); +} + +void DataTests::TestDeleteFiles(TestContext& tc) +{ + tc.Skip(); +} + +void DataTests::TestFinalizeFileUploads(TestContext& tc) +{ + tc.Skip(); +} + +void DataTests::TestGetFiles(TestContext& tc) +{ + tc.Skip(); +} + +void DataTests::TestGetObjects(TestContext& tc) +{ + tc.Skip(); +} + +void DataTests::TestInitiateFileUploads(TestContext& tc) +{ + tc.Skip(); +} + +void DataTests::TestSetObjects(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/ExperimentationTests.cpp b/Test/PlayFabServices.GeneratedTests/ExperimentationTests.cpp new file mode 100644 index 0000000..43300b9 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/ExperimentationTests.cpp @@ -0,0 +1,16 @@ +#include "TestAppPch.h" +#include "ExperimentationTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void ExperimentationTests::AddTests() +{ + AddTest("TestGetTreatmentAssignment", &ExperimentationTests::TestGetTreatmentAssignment); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/ExperimentationTests.h b/Test/PlayFabServices.GeneratedTests/ExperimentationTests.h new file mode 100644 index 0000000..c433fca --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/ExperimentationTests.h @@ -0,0 +1,30 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class ExperimentationTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestGetTreatmentAssignment(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/ExperimentationTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/ExperimentationTestsImpl.stubs new file mode 100644 index 0000000..5ea68b0 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/ExperimentationTestsImpl.stubs @@ -0,0 +1,27 @@ +#include "TestAppPch.h" +#include "ExperimentationTests.h" +#include "ExperimentationOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp ExperimentationTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp ExperimentationTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void ExperimentationTests::TestGetTreatmentAssignment(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/FriendsTests.cpp b/Test/PlayFabServices.GeneratedTests/FriendsTests.cpp new file mode 100644 index 0000000..6e812ef --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/FriendsTests.cpp @@ -0,0 +1,31 @@ +#include "TestAppPch.h" +#include "FriendsTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void FriendsTests::AddTests() +{ + AddTest("TestClientAddFriend", &FriendsTests::TestClientAddFriend); + AddTest("TestClientGetFriendsList", &FriendsTests::TestClientGetFriendsList); + AddTest("TestClientRemoveFriend", &FriendsTests::TestClientRemoveFriend); + AddTest("TestClientSetFriendTags", &FriendsTests::TestClientSetFriendTags); +#if 0 + AddTest("TestServerAddFriend", &FriendsTests::TestServerAddFriend); +#endif +#if 0 + AddTest("TestServerGetFriendsList", &FriendsTests::TestServerGetFriendsList); +#endif +#if 0 + AddTest("TestServerRemoveFriend", &FriendsTests::TestServerRemoveFriend); +#endif +#if 0 + AddTest("TestServerSetFriendTags", &FriendsTests::TestServerSetFriendTags); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/FriendsTests.h b/Test/PlayFabServices.GeneratedTests/FriendsTests.h new file mode 100644 index 0000000..d766a15 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/FriendsTests.h @@ -0,0 +1,45 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class FriendsTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestClientAddFriend(TestContext& testContext); + void TestClientGetFriendsList(TestContext& testContext); + void TestClientRemoveFriend(TestContext& testContext); + void TestClientSetFriendTags(TestContext& testContext); +#if 0 + void TestServerAddFriend(TestContext& testContext); +#endif +#if 0 + void TestServerGetFriendsList(TestContext& testContext); +#endif +#if 0 + void TestServerRemoveFriend(TestContext& testContext); +#endif +#if 0 + void TestServerSetFriendTags(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/FriendsTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/FriendsTestsImpl.stubs new file mode 100644 index 0000000..6e42d8f --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/FriendsTestsImpl.stubs @@ -0,0 +1,70 @@ +#include "TestAppPch.h" +#include "FriendsTests.h" +#include "FriendsOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp FriendsTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp FriendsTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void FriendsTests::TestClientAddFriend(TestContext& tc) +{ + tc.Skip(); +} + +void FriendsTests::TestClientGetFriendsList(TestContext& tc) +{ + tc.Skip(); +} + +void FriendsTests::TestClientRemoveFriend(TestContext& tc) +{ + tc.Skip(); +} + +void FriendsTests::TestClientSetFriendTags(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void FriendsTests::TestServerAddFriend(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void FriendsTests::TestServerGetFriendsList(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void FriendsTests::TestServerRemoveFriend(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void FriendsTests::TestServerSetFriendTags(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/GroupsTests.cpp b/Test/PlayFabServices.GeneratedTests/GroupsTests.cpp new file mode 100644 index 0000000..eeaf4b2 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/GroupsTests.cpp @@ -0,0 +1,40 @@ +#include "TestAppPch.h" +#include "GroupsTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void GroupsTests::AddTests() +{ + AddTest("TestAcceptGroupApplication", &GroupsTests::TestAcceptGroupApplication); + AddTest("TestAcceptGroupInvitation", &GroupsTests::TestAcceptGroupInvitation); + AddTest("TestAddMembers", &GroupsTests::TestAddMembers); + AddTest("TestApplyToGroup", &GroupsTests::TestApplyToGroup); + AddTest("TestBlockEntity", &GroupsTests::TestBlockEntity); + AddTest("TestChangeMemberRole", &GroupsTests::TestChangeMemberRole); + AddTest("TestCreateGroup", &GroupsTests::TestCreateGroup); + AddTest("TestCreateRole", &GroupsTests::TestCreateRole); + AddTest("TestDeleteGroup", &GroupsTests::TestDeleteGroup); + AddTest("TestDeleteRole", &GroupsTests::TestDeleteRole); + AddTest("TestGetGroup", &GroupsTests::TestGetGroup); + AddTest("TestInviteToGroup", &GroupsTests::TestInviteToGroup); + AddTest("TestIsMember", &GroupsTests::TestIsMember); + AddTest("TestListGroupApplications", &GroupsTests::TestListGroupApplications); + AddTest("TestListGroupBlocks", &GroupsTests::TestListGroupBlocks); + AddTest("TestListGroupInvitations", &GroupsTests::TestListGroupInvitations); + AddTest("TestListGroupMembers", &GroupsTests::TestListGroupMembers); + AddTest("TestListMembership", &GroupsTests::TestListMembership); + AddTest("TestListMembershipOpportunities", &GroupsTests::TestListMembershipOpportunities); + AddTest("TestRemoveGroupApplication", &GroupsTests::TestRemoveGroupApplication); + AddTest("TestRemoveGroupInvitation", &GroupsTests::TestRemoveGroupInvitation); + AddTest("TestRemoveMembers", &GroupsTests::TestRemoveMembers); + AddTest("TestUnblockEntity", &GroupsTests::TestUnblockEntity); + AddTest("TestUpdateGroup", &GroupsTests::TestUpdateGroup); + AddTest("TestUpdateRole", &GroupsTests::TestUpdateRole); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/GroupsTests.h b/Test/PlayFabServices.GeneratedTests/GroupsTests.h new file mode 100644 index 0000000..3d41f4e --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/GroupsTests.h @@ -0,0 +1,54 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class GroupsTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestAcceptGroupApplication(TestContext& testContext); + void TestAcceptGroupInvitation(TestContext& testContext); + void TestAddMembers(TestContext& testContext); + void TestApplyToGroup(TestContext& testContext); + void TestBlockEntity(TestContext& testContext); + void TestChangeMemberRole(TestContext& testContext); + void TestCreateGroup(TestContext& testContext); + void TestCreateRole(TestContext& testContext); + void TestDeleteGroup(TestContext& testContext); + void TestDeleteRole(TestContext& testContext); + void TestGetGroup(TestContext& testContext); + void TestInviteToGroup(TestContext& testContext); + void TestIsMember(TestContext& testContext); + void TestListGroupApplications(TestContext& testContext); + void TestListGroupBlocks(TestContext& testContext); + void TestListGroupInvitations(TestContext& testContext); + void TestListGroupMembers(TestContext& testContext); + void TestListMembership(TestContext& testContext); + void TestListMembershipOpportunities(TestContext& testContext); + void TestRemoveGroupApplication(TestContext& testContext); + void TestRemoveGroupInvitation(TestContext& testContext); + void TestRemoveMembers(TestContext& testContext); + void TestUnblockEntity(TestContext& testContext); + void TestUpdateGroup(TestContext& testContext); + void TestUpdateRole(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/GroupsTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/GroupsTestsImpl.stubs new file mode 100644 index 0000000..f6d2249 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/GroupsTestsImpl.stubs @@ -0,0 +1,147 @@ +#include "TestAppPch.h" +#include "GroupsTests.h" +#include "GroupsOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp GroupsTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp GroupsTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void GroupsTests::TestAcceptGroupApplication(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestAcceptGroupInvitation(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestAddMembers(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestApplyToGroup(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestBlockEntity(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestChangeMemberRole(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestCreateGroup(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestCreateRole(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestDeleteGroup(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestDeleteRole(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestGetGroup(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestInviteToGroup(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestIsMember(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestListGroupApplications(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestListGroupBlocks(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestListGroupInvitations(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestListGroupMembers(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestListMembership(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestListMembershipOpportunities(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestRemoveGroupApplication(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestRemoveGroupInvitation(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestRemoveMembers(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestUnblockEntity(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestUpdateGroup(TestContext& tc) +{ + tc.Skip(); +} + +void GroupsTests::TestUpdateRole(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/InventoryTests.cpp b/Test/PlayFabServices.GeneratedTests/InventoryTests.cpp new file mode 100644 index 0000000..f538bac --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/InventoryTests.cpp @@ -0,0 +1,49 @@ +#include "TestAppPch.h" +#include "InventoryTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void InventoryTests::AddTests() +{ + AddTest("TestAddInventoryItems", &InventoryTests::TestAddInventoryItems); + AddTest("TestDeleteInventoryCollection", &InventoryTests::TestDeleteInventoryCollection); + AddTest("TestDeleteInventoryItems", &InventoryTests::TestDeleteInventoryItems); + AddTest("TestExecuteInventoryOperations", &InventoryTests::TestExecuteInventoryOperations); + AddTest("TestGetInventoryCollectionIds", &InventoryTests::TestGetInventoryCollectionIds); + AddTest("TestGetInventoryItems", &InventoryTests::TestGetInventoryItems); +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + AddTest("TestGetMicrosoftStoreAccessTokens", &InventoryTests::TestGetMicrosoftStoreAccessTokens); +#endif +#if 0 + AddTest("TestGetTransactionHistory", &InventoryTests::TestGetTransactionHistory); +#endif + AddTest("TestPurchaseInventoryItems", &InventoryTests::TestPurchaseInventoryItems); +#if 0 + AddTest("TestRedeemAppleAppStoreInventoryItems", &InventoryTests::TestRedeemAppleAppStoreInventoryItems); +#endif +#if 0 + AddTest("TestRedeemGooglePlayInventoryItems", &InventoryTests::TestRedeemGooglePlayInventoryItems); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + AddTest("TestRedeemMicrosoftStoreInventoryItems", &InventoryTests::TestRedeemMicrosoftStoreInventoryItems); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + AddTest("TestRedeemNintendoEShopInventoryItems", &InventoryTests::TestRedeemNintendoEShopInventoryItems); +#endif +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + AddTest("TestRedeemPlayStationStoreInventoryItems", &InventoryTests::TestRedeemPlayStationStoreInventoryItems); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + AddTest("TestRedeemSteamInventoryItems", &InventoryTests::TestRedeemSteamInventoryItems); +#endif + AddTest("TestSubtractInventoryItems", &InventoryTests::TestSubtractInventoryItems); + AddTest("TestTransferInventoryItems", &InventoryTests::TestTransferInventoryItems); + AddTest("TestUpdateInventoryItems", &InventoryTests::TestUpdateInventoryItems); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/InventoryTests.h b/Test/PlayFabServices.GeneratedTests/InventoryTests.h new file mode 100644 index 0000000..ccaa19e --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/InventoryTests.h @@ -0,0 +1,63 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class InventoryTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestAddInventoryItems(TestContext& testContext); + void TestDeleteInventoryCollection(TestContext& testContext); + void TestDeleteInventoryItems(TestContext& testContext); + void TestExecuteInventoryOperations(TestContext& testContext); + void TestGetInventoryCollectionIds(TestContext& testContext); + void TestGetInventoryItems(TestContext& testContext); +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + void TestGetMicrosoftStoreAccessTokens(TestContext& testContext); +#endif +#if 0 + void TestGetTransactionHistory(TestContext& testContext); +#endif + void TestPurchaseInventoryItems(TestContext& testContext); +#if 0 + void TestRedeemAppleAppStoreInventoryItems(TestContext& testContext); +#endif +#if 0 + void TestRedeemGooglePlayInventoryItems(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK + void TestRedeemMicrosoftStoreInventoryItems(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH + void TestRedeemNintendoEShopInventoryItems(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 + void TestRedeemPlayStationStoreInventoryItems(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + void TestRedeemSteamInventoryItems(TestContext& testContext); +#endif + void TestSubtractInventoryItems(TestContext& testContext); + void TestTransferInventoryItems(TestContext& testContext); + void TestUpdateInventoryItems(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/InventoryTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/InventoryTestsImpl.stubs new file mode 100644 index 0000000..b97c894 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/InventoryTestsImpl.stubs @@ -0,0 +1,128 @@ +#include "TestAppPch.h" +#include "InventoryTests.h" +#include "InventoryOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp InventoryTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp InventoryTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void InventoryTests::TestAddInventoryItems(TestContext& tc) +{ + tc.Skip(); +} + +void InventoryTests::TestDeleteInventoryCollection(TestContext& tc) +{ + tc.Skip(); +} + +void InventoryTests::TestDeleteInventoryItems(TestContext& tc) +{ + tc.Skip(); +} + +void InventoryTests::TestExecuteInventoryOperations(TestContext& tc) +{ + tc.Skip(); +} + +void InventoryTests::TestGetInventoryCollectionIds(TestContext& tc) +{ + tc.Skip(); +} + +void InventoryTests::TestGetInventoryItems(TestContext& tc) +{ + tc.Skip(); +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +void InventoryTests::TestGetMicrosoftStoreAccessTokens(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void InventoryTests::TestGetTransactionHistory(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void InventoryTests::TestPurchaseInventoryItems(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void InventoryTests::TestRedeemAppleAppStoreInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void InventoryTests::TestRedeemGooglePlayInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM == HC_PLATFORM_GDK +void InventoryTests::TestRedeemMicrosoftStoreInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_NINTENDO_SWITCH +void InventoryTests::TestRedeemNintendoEShopInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_4 || HC_PLATFORM == HC_PLATFORM_SONY_PLAYSTATION_5 +void InventoryTests::TestRedeemPlayStationStoreInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +void InventoryTests::TestRedeemSteamInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void InventoryTests::TestSubtractInventoryItems(TestContext& tc) +{ + tc.Skip(); +} + +void InventoryTests::TestTransferInventoryItems(TestContext& tc) +{ + tc.Skip(); +} + +void InventoryTests::TestUpdateInventoryItems(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/LocalizationTests.cpp b/Test/PlayFabServices.GeneratedTests/LocalizationTests.cpp new file mode 100644 index 0000000..1681b6f --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/LocalizationTests.cpp @@ -0,0 +1,18 @@ +#include "TestAppPch.h" +#include "LocalizationTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void LocalizationTests::AddTests() +{ +#if 0 + AddTest("TestGetLanguageList", &LocalizationTests::TestGetLanguageList); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/LocalizationTests.h b/Test/PlayFabServices.GeneratedTests/LocalizationTests.h new file mode 100644 index 0000000..f876cc1 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/LocalizationTests.h @@ -0,0 +1,32 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class LocalizationTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests +#if 0 + void TestGetLanguageList(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/LocalizationTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/LocalizationTestsImpl.stubs new file mode 100644 index 0000000..467edab --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/LocalizationTestsImpl.stubs @@ -0,0 +1,29 @@ +#include "TestAppPch.h" +#include "LocalizationTests.h" +#include "LocalizationOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp LocalizationTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp LocalizationTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if 0 +void LocalizationTests::TestGetLanguageList(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.cpp b/Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.cpp new file mode 100644 index 0000000..9771258 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.cpp @@ -0,0 +1,19 @@ +#include "TestAppPch.h" +#include "MultiplayerServerTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void MultiplayerServerTests::AddTests() +{ + AddTest("TestListBuildAliases", &MultiplayerServerTests::TestListBuildAliases); + AddTest("TestListBuildSummariesV2", &MultiplayerServerTests::TestListBuildSummariesV2); + AddTest("TestListQosServersForTitle", &MultiplayerServerTests::TestListQosServersForTitle); + AddTest("TestRequestMultiplayerServer", &MultiplayerServerTests::TestRequestMultiplayerServer); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.h b/Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.h new file mode 100644 index 0000000..cbf6aed --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/MultiplayerServerTests.h @@ -0,0 +1,33 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class MultiplayerServerTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestListBuildAliases(TestContext& testContext); + void TestListBuildSummariesV2(TestContext& testContext); + void TestListQosServersForTitle(TestContext& testContext); + void TestRequestMultiplayerServer(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/MultiplayerServerTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/MultiplayerServerTestsImpl.stubs new file mode 100644 index 0000000..444b4b1 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/MultiplayerServerTestsImpl.stubs @@ -0,0 +1,42 @@ +#include "TestAppPch.h" +#include "MultiplayerServerTests.h" +#include "MultiplayerServerOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp MultiplayerServerTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp MultiplayerServerTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void MultiplayerServerTests::TestListBuildAliases(TestContext& tc) +{ + tc.Skip(); +} + +void MultiplayerServerTests::TestListBuildSummariesV2(TestContext& tc) +{ + tc.Skip(); +} + +void MultiplayerServerTests::TestListQosServersForTitle(TestContext& tc) +{ + tc.Skip(); +} + +void MultiplayerServerTests::TestRequestMultiplayerServer(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.cpp b/Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.cpp new file mode 100644 index 0000000..4c4b315 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.cpp @@ -0,0 +1,27 @@ +#include "TestAppPch.h" +#include "PlatformSpecificTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void PlatformSpecificTests::AddTests() +{ +#if 0 + AddTest("TestClientAndroidDevicePushNotificationRegistration", &PlatformSpecificTests::TestClientAndroidDevicePushNotificationRegistration); +#endif +#if 0 + AddTest("TestClientRefreshPSNAuthToken", &PlatformSpecificTests::TestClientRefreshPSNAuthToken); +#endif +#if 0 + AddTest("TestClientRegisterForIOSPushNotification", &PlatformSpecificTests::TestClientRegisterForIOSPushNotification); +#endif +#if 0 + AddTest("TestServerAwardSteamAchievement", &PlatformSpecificTests::TestServerAwardSteamAchievement); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.h b/Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.h new file mode 100644 index 0000000..cc1603c --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlatformSpecificTests.h @@ -0,0 +1,41 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class PlatformSpecificTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests +#if 0 + void TestClientAndroidDevicePushNotificationRegistration(TestContext& testContext); +#endif +#if 0 + void TestClientRefreshPSNAuthToken(TestContext& testContext); +#endif +#if 0 + void TestClientRegisterForIOSPushNotification(TestContext& testContext); +#endif +#if 0 + void TestServerAwardSteamAchievement(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/PlatformSpecificTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/PlatformSpecificTestsImpl.stubs new file mode 100644 index 0000000..ce08620 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlatformSpecificTestsImpl.stubs @@ -0,0 +1,50 @@ +#include "TestAppPch.h" +#include "PlatformSpecificTests.h" +#include "PlatformSpecificOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp PlatformSpecificTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp PlatformSpecificTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if 0 +void PlatformSpecificTests::TestClientAndroidDevicePushNotificationRegistration(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlatformSpecificTests::TestClientRefreshPSNAuthToken(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlatformSpecificTests::TestClientRegisterForIOSPushNotification(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlatformSpecificTests::TestServerAwardSteamAchievement(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems b/Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems new file mode 100644 index 0000000..e33516f --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems @@ -0,0 +1,69 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {ED91BB24-B033-4DEE-984F-1B4609C0811A} + + + + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems.filters b/Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems.filters new file mode 100644 index 0000000..f7e51f7 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlayFabServices.GeneratedTests.vcxitems.filters @@ -0,0 +1,165 @@ + + + + + + + + + + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + Include + + + Source + + + Source\Stubs + + + \ No newline at end of file diff --git a/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.cpp b/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.cpp new file mode 100644 index 0000000..063c9ee --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.cpp @@ -0,0 +1,57 @@ +#include "TestAppPch.h" +#include "PlayerDataManagementTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void PlayerDataManagementTests::AddTests() +{ + AddTest("TestClientGetUserData", &PlayerDataManagementTests::TestClientGetUserData); + AddTest("TestClientGetUserPublisherData", &PlayerDataManagementTests::TestClientGetUserPublisherData); + AddTest("TestClientGetUserPublisherReadOnlyData", &PlayerDataManagementTests::TestClientGetUserPublisherReadOnlyData); + AddTest("TestClientGetUserReadOnlyData", &PlayerDataManagementTests::TestClientGetUserReadOnlyData); + AddTest("TestClientUpdateUserData", &PlayerDataManagementTests::TestClientUpdateUserData); + AddTest("TestClientUpdateUserPublisherData", &PlayerDataManagementTests::TestClientUpdateUserPublisherData); +#if 0 + AddTest("TestServerGetUserData", &PlayerDataManagementTests::TestServerGetUserData); +#endif +#if 0 + AddTest("TestServerGetUserInternalData", &PlayerDataManagementTests::TestServerGetUserInternalData); +#endif +#if 0 + AddTest("TestServerGetUserPublisherData", &PlayerDataManagementTests::TestServerGetUserPublisherData); +#endif +#if 0 + AddTest("TestServerGetUserPublisherInternalData", &PlayerDataManagementTests::TestServerGetUserPublisherInternalData); +#endif +#if 0 + AddTest("TestServerGetUserPublisherReadOnlyData", &PlayerDataManagementTests::TestServerGetUserPublisherReadOnlyData); +#endif +#if 0 + AddTest("TestServerGetUserReadOnlyData", &PlayerDataManagementTests::TestServerGetUserReadOnlyData); +#endif +#if 0 + AddTest("TestServerUpdateUserData", &PlayerDataManagementTests::TestServerUpdateUserData); +#endif +#if 0 + AddTest("TestServerUpdateUserInternalData", &PlayerDataManagementTests::TestServerUpdateUserInternalData); +#endif +#if 0 + AddTest("TestServerUpdateUserPublisherData", &PlayerDataManagementTests::TestServerUpdateUserPublisherData); +#endif +#if 0 + AddTest("TestServerUpdateUserPublisherInternalData", &PlayerDataManagementTests::TestServerUpdateUserPublisherInternalData); +#endif +#if 0 + AddTest("TestServerUpdateUserPublisherReadOnlyData", &PlayerDataManagementTests::TestServerUpdateUserPublisherReadOnlyData); +#endif +#if 0 + AddTest("TestServerUpdateUserReadOnlyData", &PlayerDataManagementTests::TestServerUpdateUserReadOnlyData); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.h b/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.h new file mode 100644 index 0000000..659713f --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTests.h @@ -0,0 +1,71 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class PlayerDataManagementTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestClientGetUserData(TestContext& testContext); + void TestClientGetUserPublisherData(TestContext& testContext); + void TestClientGetUserPublisherReadOnlyData(TestContext& testContext); + void TestClientGetUserReadOnlyData(TestContext& testContext); + void TestClientUpdateUserData(TestContext& testContext); + void TestClientUpdateUserPublisherData(TestContext& testContext); +#if 0 + void TestServerGetUserData(TestContext& testContext); +#endif +#if 0 + void TestServerGetUserInternalData(TestContext& testContext); +#endif +#if 0 + void TestServerGetUserPublisherData(TestContext& testContext); +#endif +#if 0 + void TestServerGetUserPublisherInternalData(TestContext& testContext); +#endif +#if 0 + void TestServerGetUserPublisherReadOnlyData(TestContext& testContext); +#endif +#if 0 + void TestServerGetUserReadOnlyData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateUserData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateUserInternalData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateUserPublisherData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateUserPublisherInternalData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateUserPublisherReadOnlyData(TestContext& testContext); +#endif +#if 0 + void TestServerUpdateUserReadOnlyData(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTestsImpl.stubs new file mode 100644 index 0000000..b454893 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PlayerDataManagementTestsImpl.stubs @@ -0,0 +1,136 @@ +#include "TestAppPch.h" +#include "PlayerDataManagementTests.h" +#include "PlayerDataManagementOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp PlayerDataManagementTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp PlayerDataManagementTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void PlayerDataManagementTests::TestClientGetUserData(TestContext& tc) +{ + tc.Skip(); +} + +void PlayerDataManagementTests::TestClientGetUserPublisherData(TestContext& tc) +{ + tc.Skip(); +} + +void PlayerDataManagementTests::TestClientGetUserPublisherReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} + +void PlayerDataManagementTests::TestClientGetUserReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} + +void PlayerDataManagementTests::TestClientUpdateUserData(TestContext& tc) +{ + tc.Skip(); +} + +void PlayerDataManagementTests::TestClientUpdateUserPublisherData(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void PlayerDataManagementTests::TestServerGetUserData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerGetUserInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerGetUserPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerGetUserPublisherInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerGetUserPublisherReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerGetUserReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerUpdateUserData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerUpdateUserInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerUpdateUserPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerUpdateUserPublisherInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerUpdateUserPublisherReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PlayerDataManagementTests::TestServerUpdateUserReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/ProfilesTests.cpp b/Test/PlayFabServices.GeneratedTests/ProfilesTests.cpp new file mode 100644 index 0000000..f4bd3a6 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/ProfilesTests.cpp @@ -0,0 +1,20 @@ +#include "TestAppPch.h" +#include "ProfilesTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void ProfilesTests::AddTests() +{ + AddTest("TestGetProfile", &ProfilesTests::TestGetProfile); + AddTest("TestGetProfiles", &ProfilesTests::TestGetProfiles); + AddTest("TestGetTitlePlayersFromMasterPlayerAccountIds", &ProfilesTests::TestGetTitlePlayersFromMasterPlayerAccountIds); + AddTest("TestSetProfileLanguage", &ProfilesTests::TestSetProfileLanguage); + AddTest("TestSetProfilePolicy", &ProfilesTests::TestSetProfilePolicy); + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/ProfilesTests.h b/Test/PlayFabServices.GeneratedTests/ProfilesTests.h new file mode 100644 index 0000000..f75775a --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/ProfilesTests.h @@ -0,0 +1,34 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class ProfilesTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestGetProfile(TestContext& testContext); + void TestGetProfiles(TestContext& testContext); + void TestGetTitlePlayersFromMasterPlayerAccountIds(TestContext& testContext); + void TestSetProfileLanguage(TestContext& testContext); + void TestSetProfilePolicy(TestContext& testContext); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/ProfilesTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/ProfilesTestsImpl.stubs new file mode 100644 index 0000000..049b251 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/ProfilesTestsImpl.stubs @@ -0,0 +1,47 @@ +#include "TestAppPch.h" +#include "ProfilesTests.h" +#include "ProfilesOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp ProfilesTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp ProfilesTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void ProfilesTests::TestGetProfile(TestContext& tc) +{ + tc.Skip(); +} + +void ProfilesTests::TestGetProfiles(TestContext& tc) +{ + tc.Skip(); +} + +void ProfilesTests::TestGetTitlePlayersFromMasterPlayerAccountIds(TestContext& tc) +{ + tc.Skip(); +} + +void ProfilesTests::TestSetProfileLanguage(TestContext& tc) +{ + tc.Skip(); +} + +void ProfilesTests::TestSetProfilePolicy(TestContext& tc) +{ + tc.Skip(); +} + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/PushNotificationsTests.cpp b/Test/PlayFabServices.GeneratedTests/PushNotificationsTests.cpp new file mode 100644 index 0000000..004baff --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PushNotificationsTests.cpp @@ -0,0 +1,21 @@ +#include "TestAppPch.h" +#include "PushNotificationsTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void PushNotificationsTests::AddTests() +{ +#if 0 + AddTest("TestServerSendPushNotification", &PushNotificationsTests::TestServerSendPushNotification); +#endif +#if 0 + AddTest("TestServerSendPushNotificationFromTemplate", &PushNotificationsTests::TestServerSendPushNotificationFromTemplate); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/PushNotificationsTests.h b/Test/PlayFabServices.GeneratedTests/PushNotificationsTests.h new file mode 100644 index 0000000..7500735 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PushNotificationsTests.h @@ -0,0 +1,35 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class PushNotificationsTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests +#if 0 + void TestServerSendPushNotification(TestContext& testContext); +#endif +#if 0 + void TestServerSendPushNotificationFromTemplate(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/PushNotificationsTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/PushNotificationsTestsImpl.stubs new file mode 100644 index 0000000..6d0fa23 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/PushNotificationsTestsImpl.stubs @@ -0,0 +1,36 @@ +#include "TestAppPch.h" +#include "PushNotificationsTests.h" +#include "PushNotificationsOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp PushNotificationsTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp PushNotificationsTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if 0 +void PushNotificationsTests::TestServerSendPushNotification(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void PushNotificationsTests::TestServerSendPushNotificationFromTemplate(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/SegmentsTests.cpp b/Test/PlayFabServices.GeneratedTests/SegmentsTests.cpp new file mode 100644 index 0000000..608477c --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/SegmentsTests.cpp @@ -0,0 +1,35 @@ +#include "TestAppPch.h" +#include "SegmentsTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void SegmentsTests::AddTests() +{ + AddTest("TestClientGetPlayerSegments", &SegmentsTests::TestClientGetPlayerSegments); + AddTest("TestClientGetPlayerTags", &SegmentsTests::TestClientGetPlayerTags); +#if 0 + AddTest("TestServerAddPlayerTag", &SegmentsTests::TestServerAddPlayerTag); +#endif +#if 0 + AddTest("TestServerGetAllSegments", &SegmentsTests::TestServerGetAllSegments); +#endif +#if 0 + AddTest("TestServerGetPlayerSegments", &SegmentsTests::TestServerGetPlayerSegments); +#endif +#if 0 + AddTest("TestServerGetPlayersInSegment", &SegmentsTests::TestServerGetPlayersInSegment); +#endif +#if 0 + AddTest("TestServerGetPlayerTags", &SegmentsTests::TestServerGetPlayerTags); +#endif +#if 0 + AddTest("TestServerRemovePlayerTag", &SegmentsTests::TestServerRemovePlayerTag); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/SegmentsTests.h b/Test/PlayFabServices.GeneratedTests/SegmentsTests.h new file mode 100644 index 0000000..50cc877 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/SegmentsTests.h @@ -0,0 +1,49 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class SegmentsTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestClientGetPlayerSegments(TestContext& testContext); + void TestClientGetPlayerTags(TestContext& testContext); +#if 0 + void TestServerAddPlayerTag(TestContext& testContext); +#endif +#if 0 + void TestServerGetAllSegments(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayerSegments(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayersInSegment(TestContext& testContext); +#endif +#if 0 + void TestServerGetPlayerTags(TestContext& testContext); +#endif +#if 0 + void TestServerRemovePlayerTag(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/SegmentsTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/SegmentsTestsImpl.stubs new file mode 100644 index 0000000..5c59aba --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/SegmentsTestsImpl.stubs @@ -0,0 +1,74 @@ +#include "TestAppPch.h" +#include "SegmentsTests.h" +#include "SegmentsOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp SegmentsTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp SegmentsTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void SegmentsTests::TestClientGetPlayerSegments(TestContext& tc) +{ + tc.Skip(); +} + +void SegmentsTests::TestClientGetPlayerTags(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void SegmentsTests::TestServerAddPlayerTag(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void SegmentsTests::TestServerGetAllSegments(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void SegmentsTests::TestServerGetPlayerSegments(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void SegmentsTests::TestServerGetPlayersInSegment(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void SegmentsTests::TestServerGetPlayerTags(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void SegmentsTests::TestServerRemovePlayerTag(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.cpp b/Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.cpp new file mode 100644 index 0000000..2db034d --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.cpp @@ -0,0 +1,43 @@ +#include "TestAppPch.h" +#include "TitleDataManagementTests.h" + +namespace PlayFab +{ +namespace Test +{ + +void TitleDataManagementTests::AddTests() +{ + AddTest("TestClientGetPublisherData", &TitleDataManagementTests::TestClientGetPublisherData); + AddTest("TestClientGetTime", &TitleDataManagementTests::TestClientGetTime); + AddTest("TestClientGetTitleData", &TitleDataManagementTests::TestClientGetTitleData); + AddTest("TestClientGetTitleNews", &TitleDataManagementTests::TestClientGetTitleNews); +#if 0 + AddTest("TestServerGetPublisherData", &TitleDataManagementTests::TestServerGetPublisherData); +#endif +#if 0 + AddTest("TestServerGetTime", &TitleDataManagementTests::TestServerGetTime); +#endif +#if 0 + AddTest("TestServerGetTitleData", &TitleDataManagementTests::TestServerGetTitleData); +#endif +#if 0 + AddTest("TestServerGetTitleInternalData", &TitleDataManagementTests::TestServerGetTitleInternalData); +#endif +#if 0 + AddTest("TestServerGetTitleNews", &TitleDataManagementTests::TestServerGetTitleNews); +#endif +#if 0 + AddTest("TestServerSetPublisherData", &TitleDataManagementTests::TestServerSetPublisherData); +#endif +#if 0 + AddTest("TestServerSetTitleData", &TitleDataManagementTests::TestServerSetTitleData); +#endif +#if 0 + AddTest("TestServerSetTitleInternalData", &TitleDataManagementTests::TestServerSetTitleInternalData); +#endif + +} + +} +} diff --git a/Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.h b/Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.h new file mode 100644 index 0000000..40db612 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/TitleDataManagementTests.h @@ -0,0 +1,57 @@ +#pragma once + +#include "ServicesTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class TitleDataManagementTests : public ServicesTestClass +{ +public: + using ServicesTestClass::ServicesTestClass; + +private: + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + SharedPtr m_state; + +private: + // Autogenerated tests + void TestClientGetPublisherData(TestContext& testContext); + void TestClientGetTime(TestContext& testContext); + void TestClientGetTitleData(TestContext& testContext); + void TestClientGetTitleNews(TestContext& testContext); +#if 0 + void TestServerGetPublisherData(TestContext& testContext); +#endif +#if 0 + void TestServerGetTime(TestContext& testContext); +#endif +#if 0 + void TestServerGetTitleData(TestContext& testContext); +#endif +#if 0 + void TestServerGetTitleInternalData(TestContext& testContext); +#endif +#if 0 + void TestServerGetTitleNews(TestContext& testContext); +#endif +#if 0 + void TestServerSetPublisherData(TestContext& testContext); +#endif +#if 0 + void TestServerSetTitleData(TestContext& testContext); +#endif +#if 0 + void TestServerSetTitleInternalData(TestContext& testContext); +#endif + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServices.GeneratedTests/TitleDataManagementTestsImpl.stubs b/Test/PlayFabServices.GeneratedTests/TitleDataManagementTestsImpl.stubs new file mode 100644 index 0000000..6deaaa9 --- /dev/null +++ b/Test/PlayFabServices.GeneratedTests/TitleDataManagementTestsImpl.stubs @@ -0,0 +1,98 @@ +#include "TestAppPch.h" +#include "TitleDataManagementTests.h" +#include "TitleDataManagementOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp TitleDataManagementTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp TitleDataManagementTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void TitleDataManagementTests::TestClientGetPublisherData(TestContext& tc) +{ + tc.Skip(); +} + +void TitleDataManagementTests::TestClientGetTime(TestContext& tc) +{ + tc.Skip(); +} + +void TitleDataManagementTests::TestClientGetTitleData(TestContext& tc) +{ + tc.Skip(); +} + +void TitleDataManagementTests::TestClientGetTitleNews(TestContext& tc) +{ + tc.Skip(); +} + +#if 0 +void TitleDataManagementTests::TestServerGetPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void TitleDataManagementTests::TestServerGetTime(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void TitleDataManagementTests::TestServerGetTitleData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void TitleDataManagementTests::TestServerGetTitleInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void TitleDataManagementTests::TestServerGetTitleNews(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void TitleDataManagementTests::TestServerSetPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void TitleDataManagementTests::TestServerSetTitleData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if 0 +void TitleDataManagementTests::TestServerSetTitleInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesManualTestApp/GDK/Assets/ATGConsoleBlack.DDS b/Test/PlayFabServicesManualTestApp/GDK/Assets/ATGConsoleBlack.DDS new file mode 100644 index 0000000000000000000000000000000000000000..59dab27d0cbf1c789bb8fcb0371ba4fc1408d2e8 GIT binary patch literal 8294528 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%0D>wl+yc3e=E3(?VcHYW!JiR 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 z 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 Bj^@4WMSHQ*B??9FlP(Tc6DkeEQqX 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%0A;~eewnm6P6|3IJnoZTyJweF|vcPf!l$_ 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

-lh_$)WSV8v6`zxnX$R<$)C&J~n#W;fuMP&$;3^ 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%0D+aBKOEJlx*LLl_uiQhh@4Zfr=E^<1?S38E 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

ly~)j2c%L52q|K9jwf+bw_ToA-^6)@a>uwZ((N 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≠yYDhWCcoCN7M&=D8fJ?8I(iy3KXtJL~A+z`n#};j+KH ze5ThNH{bU>qZn|p*NJ5g8^)^!kyw{_dueh&l ziZ0_^=Nr!DQQ~CHzul(29-JJimjbq>64c-35UgtcoVw%_b z-~27VFk%=j*I#(>eeSpHVZNLDiuHCZ&I(Is8_xQ|Ud4jNS9`8A#cBL(XBfc4L@1eb(w!Kb_HRgQp#e_=_ za}BH2ILsGL+pJe(*|lzXaX4@@UHjwrd1lxw*nIb9#=m5~aN2d5`@&_zfUS?*V|cJf z|2x02D~{T{_l(4X;WiHz&t(sD;jwGIdj&dA8cd?^-@lcuY5>8mB%saojbpSH|xlo0bAa=T)(47j+nep z^PL;+Ir-#sjZAs$$tACxlROnYc`G?@^4`v4o$HbVPbBkT3C zbv-5hs-du@#ya&^*J{XfUA5b($x@p=N7s)Xr+iP{*ma_Kt@X0K;#1G2{xlcP`QKBQ z+6MXPR7)d2S88cwuCEze4+G}vwdJXw&3f}aU9P*S+o{p<^Jr$=^VILsA^W_}d*e^t z>LGhh&+Agx#dhOn^eWy>XzH$53e0XuseTK-rYo9@Co9=zP zmu&s?uv_5do=4UpRDWW8vk(0{H$$b-pHQ5hr|?HMYivu_tkykuNe08y>ovn4tvE; zqvPfLZ}{-sqkQ{k)ZW>nS#sZdem?Qo>=9l0q^>EEAV|=J%p~9n1H!=PTye|3ZfC{{MW>pSoIKe^=a% z94B&eAee2|Jtl8*PURfM44M4RYwJ3n3-|3DZFq0RQ?8eB@!zr8dEMlS{r;eImDax zuld8rT$mg`zOdbz%Lm^xPu-AO!gk*{uj7c>E~XoXJ9SURpL4#lTQyPMqn!~x>^ds< zkn_T-y{Ml$2J2nBvG1D}b}oRRB2e)V$P7dqef)_oxQ zI_RgzRQvWkoLGG$^_9{u+V+n*eXYdm{+HIP7nbk7L#{qpk2yc#9@?Xiwt8>wpLGvT zy|kWV^S3KKy)~*ISZjKU=gcr1m|kbaRA140^&`c8*=y^W|8(8GQQKOU`R2nuFGCNt zVyah5Z1-Jdk4)>+XZ={ikLkV2zx%Y0`LNoN_t~LZOV^|N&CJtxP7j*?a`&g_-y3Y1 z&MPgSW0(FlV`3he&-R-0dcS78wU7QiVC`pCj9zDb;j3`pVX$yk%eH*J4?4QB4�&&`}T;q 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 z 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

`x& zZf?rgV2;bawr3umYI5m%&7&!{`7`l&%zKS(bX=dfuIvp@wsp+gUq1`iV|%#HkFxV* zuV2UgHvfObuejffXI)%y^pV$o%Ww4m8qQZd?c2D;3;(Ng#INN~9Pdx|kN+OJPW~+) z|9<*+dg$|S7fDRdhfke6>+>->{FAfo$`KvcQ1i+;pXY67ul_$WpFi1&^KhJV$XB_D z!){(PIl}MSuVa+Qe&&t)|A77ua!?ZYfY@;or65tPxJl`|8DNHzw5rk zJ*wiQ?|UHkH10j&ft7FFfjEp^N{AEf_lt48cZK?^Vtj_TzYUML`9o+S` zYV22=pPxKFrv^`5?wHi*BUg>@T0YN&x)<3!z&Y1jITeR*_b#<|?@~7PF4k*~Pd{sF zP8pkfl=L&^e9?8j?q|;WL%*aRtZdVZIeyOdl23gevih>-c+>Bh+uc1Ky&L(QGd-ZC zd%RoszQ+{T`&Z?vJ{W&`)9HihWzo|kmmZGT@3K0+!yA)B-0$v{Gq+87KJ?qOC)hxI z((kK}Cs$zr-OGn3zIk2a3WFC^9&mwI{+B(R>mv>^m<1SzaS3y|ezrXvux;_N#823Y zo{oAprv(%85N5P6A@Rg;x!BQb?s&y+Oi4JEF{R;f zg-xORFyLb0c(Lb<1-MzQ2Tv1rhEMC;S3bmw&vhPh83QCfHgsMOKKQau+>yo~vo5@` z@)0i%Se!3dVvWKgg*}2v;v)$@xwu{7munsTGE(-&H2*hkZ<8cBlVe-%rh3vMJW!tr!TC&^6n`YTUCFUvE;>3)r&5fMwYII;Z8P7GIkwWhaN>&tSG<=sdx6b*&3E_S zVClqz(V5K-|7|`j`Iq-S|IUDGZ*Fnoyc1gQf)4j>eth=%vX2)Yj6KX4CfjS6D{-{W z9$@s5_nh_Pczp-7Sa7(neZ~&fTbxyVS7Yov#!h@#JQg-wjFs~apAENVbi7v%TwL~+ zANG4#Z`%~3)%&1_<(_@OdH=Ka28RdBesSTEANHH~MStbM!-dUcZ#!g%5o>>NvtBb_ z*l#mh?G0WrWLLW0D;&0Kd$Zp0RgC|D|FVY{-;6!q>)F!_`xOgr4%{plrfVh(`_0_8 zukvm4GB=l9amq$A?eB%7qN@=(yjC&HeUXb9$0i(D_V&e3j5z+p2%jB0Z2#^MV~uSy z-0)s8;ILus+3lFf#C+koVZYH8L%o#7>=BI_^D+0muYB1y(RqwSdcGPgAr*y87n5sht@;Pn~|- zQ8TZDe!#U(zo6t|!OM2++)Gezg5CnXhx8cmnI41rubx#eU)%RMeU9>dneQIT=(~@? zTKjtGkw`{Ardcp+STAeI(yO5_WBaS8v->~z<(U4?@{g^0P?lePrqU1VWgffkh3UNX zz=(q`^0C7wJu&OUfYY1%9PRTdr{Cq{?9*V~JwNGS!yN7j?tb6+R8LQRNc^zto}^>D zCm30JiD%tCL&Z40Tkm=ILU+IO(H9Np-5glGQu?&hzwMr9_g~L`9W&q95sUfh@jAxz zcJU|f-yG^oW83{^dfxQDyRSVluxnd%(+gj7`~3Ix$ko?Q550V|#@GG!Iv4%$wT?~n zS^J#W{?h{{5Vp_^A>5#1!8MK^HbML&8;&5xfPd-B#ysSV@CV7tH>_l@<%90h$N%B; z5&x-vhWGh!mo8OrdyAXWwMbU_9g3B z;!+($adRH@ecbW!ZU46A=ZUSa%h##v9oyT__II3#@p27Y_dlHvFAZnS&-&o4W7qn< zp7}FIVqK%T?)a3>^TUj{?(pZMzur^5uJiKaoTdAaUDvYyul`zo{-56d?eqH~UH@K= z-TvKpIiG(=_`T0{y`8In$IC``*vkI=PWksZdOkDfci-27>>T+F>Dm>qV#&wXA%E7( zN1xSMw~o)w$a*fBujNDcwB2icFMazyBKEEOQ@(sp-sj-Ev1Iw4(|4t9WG|gRRIJ8o=iM1LLrPRBoT#VDJ^iv0Vy?@1NE?|Zq|i1TvJ$ou@cKN45>snThXH zeNWZ7(PusPWPYA=-^EAwT4Hv*x%ZB)ZL-lhDGapi(FS8mAp zdY)V{`Jt{Qx>x?|7-qYVxp;5O5<_F>$I6qJe)#app_5B9){*Bbm6t28Zrj#>&HX?0 z)DOgTtugbGT`ZScqx|Ss$Rdv{WBaQ{TD4QxT;{&1t;*-$ zuD|kZudYF|j#qQ}s9xK(9lkdQ-s`JoB;J<;j;p%$QG9%Wn#ZIHv{gTX2lE>PTwAtGqJjF?ft>%ZR376J?&o(G1+5t7;ot8%)@r!!Eo8gh}Ax^ z8(nkV&4=GOZ)6wm?RPw1x{8-Qz}dqq*1PummOT4>GnyOUHXr;KKAV_5n&q}UY*%(> zy#71BaNgpl!+e|LvW5kh?)+`vV|!$6|6spAvEXoA?fWf1@AEaUwG7_d?6u>H)ndE3 za2W8m&HPvP8{V6deY!p;?`}S97=3Kc2!Hi^q01H)TfVc;7v9@z+res^8H?K<4t#Ok z&2)RNzxS*8gZVC7|NUOhVXiBt`=W>W-n=(!7;lcqR;;k(kFodpitnzum~I$w%ZrP0 zZnNH+Hya-I%NmB-JXj;^>%hh_p7O(siM{+_w&J!A*|yRAu-?ORE%Upc+aD&ocrMow zrmH!zn%i!keBKMaxN!LHUyg^*!d&ZUKaIVfIc&FiFSgnvT(Xb%Lx%}tA9k#H`zsFT zTI=Yg!|%&cj5NCN+QWRKGoQ6x%_~+I?y;@-n+3yhIcLkTGw-#(*Or<6e&f6^@?pdH ze>uW$rElI_^X%~*{+o9`FMHXD_a5#Wj=Z0R62s+Qn0sm8SBDGhzS;NuvdevWv)_@u z+~yu-}r*krLH}Wy;mydJ4x(4(=9dO&qA+ecf3orYlBj;2svEJmV&To~c5{FzBJLRm_ zDOV*=UAeIH+FQ2udEQd8ooAE76Gyqb$8cbA-*Duz!&mhHGUnpD$a0+eAa+;%uxks| zD`np@Gu*CUN|t)Y&#<~KQf&=X=8^6_{AN8r~*}MLv_MI9xHE`9~evaDpF!56toADB( zYi4{_O|IvyAF{1C^X=!kFV1^<0NDFE@VnmE-d%L^GviIX={ImK!*%yOeU0D7)Az_T z^k%}lS8{qL>cOZNQ*r6F=-j1O|HeHW?E_|=zRsS*eY=nISL0%~Vzlx#yOn?RB@ZK3 z4~=#8xV-;>-W2^UY}}_hdmvWd>*|fQ{fF$+K0Ug_b#EK@0p0skU$6Uo;kdfq^abe= zqNm5#^Yjc^N2YoCWUXFg>_5izNgdn0)w>6(_c*KPYKH50?!o$fi?&aXHJn(z-#Xve zbdPp=!o)A$DOT zb)N7N*-L*o$fXm%SR4g*vh4qQ{=tF{BN8)x#2mI;@?lTd5J#+x>sTDAWYURK;p6M{ z*!-+?Vq3$YPQ0+T@UZZ@Ti*ODtd48zYhjcv=ZL<}GxJ=}=-R&5Z|50bY_7Qb9B=c@ zMy-c?{-^BoztT=Tbx zpE3To*XMU&{*T}OFW+Q!z2n2Rmkqz;{+W72Ci%K`_0NUqQA(b?AL+_oR{-@b3q$3`RHZRb3m*LNh}eX)Jmo$u2A zzAe4Etw+V+JF^der*mG%w5|2bvA0dhGVkyCd?!cG_$HG+_nETMy{Ja+Y0_!lYwnG# zYt(%V8+=)7ZoTe{y_TG~V`KZUUG&l^HgjzELCj^Nb9BC+}?iteYFJwe!b2=RD6mmi*$soddT&IrOc!{mAiEF5P*1=i8s$ z*LKe7onw1W{BJq`VZN>zV%N2WY6@i364=^4e0P{}m@em8wTbJP)F{NX-ZjgTtA@GP zr=~*QHQ1ZoztMGVrqQ*W{i)|VZa6Tp%11R~>N?h%TYlGqT|367Yt1}s>@hWI>Q>jd zoFjGZ)V%-V9BoIP+w;T;?^P{bx^K1icloZ>Z-3aZj_Nhozee>P+!GKRp8DT?26JHM z$CqA%{d#O3JUs}-#OLtd>4`jL)k~3|IB(6>TcJ1NJ_>8~Q8ad+q}lDoet(dqkK=d0 z!Ek+~_ak}BY(syDep2^@b{|Q0-D|=|{UrC4(x1ZDd>H*NhnTHx)ORa;`epW`f9AQ_ zEk`lIQSzKzp6O)s{4tm)h0v--B~<6?7qyVJjIpG()iAN^wX5#>n#8C%Kj zp7Y*|H2Zkc>G zd^r5}w^8hubMjtipIc+|T>Ty2krzkBZggg}_4ef+-AAManG7-8Me!{7iSeKZr+-|3;gjngBOn#^Hpqf z;qz{2);SLEJ@0_tva%~?>%;qd$8K1znXdniaM@sA@nOng!F%7YxpBBJzKaFF%&))e zd+D3`M%JwLFy9?Fyf$pNbh3x@wk+$8bJ#EX#dX(Q40qPWTxV{3?ei^J>^#QqF%Cb5 z{la$-5q?PkAkM*CRz)BOD1-(?H8h4X3;Z_8n+k~P~!r^D;RkIiiJ_koA+ ziU*tdnj7Ej*5|8p={(1781LV3U-90=4fnk{uKw09ELiL}Hsw=m{oUWif+O?(-~Z}o zrt03-_rZNXh6Crmn&+vWtXDR*Uzv?iCAe+q#T;t~2)J>CBbGoAFLQ zpS)hVe7LV|QY-v6p4!9pi=IbSZIgJeeawhm!(gLYhWeVwcXVCS$BOeIdggirPH(DnuqUJzW|@^4fxq`dJOhS z??U>L?cRfRmbqtf_cY@B9H*~R*Ab5E@i1U~)K5__2fJpzTBq+~*`*8b&Di#*heLlS z$LSl*p5E?1xgXVb;kb+arr#C53-|RN1+(99VCyZ5-u*A^OWw!m(kJWjt=IOHi3g{* zM}H6B-S4Zl*>8G--49eR(EUj4=>w{_*z(NXAAIyJum0rEy7#_k_fqM9st4LV+=@H> zQ~IvmA7!LhJNs?u((UoBxUhW4HA>$FkkJ%)7_TIsUXvJ#Nk2zfK=IJ>=MV z{ipoOu6yTV#Ojs1m+d}y#lHIDy{12oT)q`&`rXX?pwFK9UytStPd{;h;RG)>=)^V{ z%^t!R;tS&-u33led>*(&{0^7E&wK-(VVjHp_W5knwvw51NdA}Wn-4X&+P>nliCcOx zqvlL-FKlIFrX_|YzI8ZK&Jpfs`(|ZgU(L95UUMyM9jooa%sA&o^GhSSF`-zJlySH=C?``=xj{omZO#j~T zyX@bK`*&lWd(e5?x6V6pnd>_IdC4{Cvx-maWi#^~r{?`xo6pn!yvV0*TJGO}KD(To z^Y+MEpV?#Yn9<|o>-_ugl6(&_X5Mkun(s*SSjJ=bhx6sTj_*s^l^z-2;l$_>f7!PU zIvwb9RJ<*>?}=->y>`s;Pn=)I!+?E1+iS&o+>3PY;y!uZ+v>VU#?Qcg)%UsFFLNKA z`)c3!Mqd7NkL}pu#@pumymJWM!<|bwcW}NSKjjt9NxWybeva_o&OvNPEb<=oo&Qu^ z=Q6#PAF;ExJ^9onQ=Dzn^UA~WES_>O;!Nc_MkBkI5y= zk9qWW4%zu+>CKR9Wd7xt+*tbNy^9IYyKhQn+sd=sHoD}+ldGdw-tJM182^%e=e^1E zU&dV@s1At@>^JiosY5Ov?7BpIf!puYF2`0iPsMQ^71MIpzRYvrx9efEU)Rgj(8Gqi zMm}|Q>g(^LSnkx}Z3o*G-*sQWy!Z4Lq!YWXoNJo~Qa;;~V0Bs#AZr}``6!Wz*N@AO-;C-}2>LvIJWJ@#B|m!4ATYkrt8 z{i@SLLa$@`OYRrBrxm;IanYZW-EU(!Z`rBmR(-efoBkR7G2|^%Uk)BD+wSLa9{PH+ zVRTO}J-n;u_tL++^z;`i*0oQh`jI1}Hwm+yKBR4BzxtMYukY|);>M<9%sO(7-E*z^ z?wP*L-M?LZ+>Vodzv|&mkJr81^n1gK9b@%@$G&B7-surH?-l!v+%j?92bUGwl`sA5 zvR5qZ>*yHfzlY`iyf*)pP45BL-vr+KftmN-UA?ziytr8`bLqVQmpH7=d~Flo!*8)^ zRy^!BY!`l;`8|s5itm;k&!x`qg zxUlru-@7?4elS_Z`Gxn&&NgDcS!D2F%{yj7M%ge)o}m!8%9j&ib|!hkf{F-!6<-aWl%!d|2;=UTfPH^UOZr zr87sy57t{T>k!B7eZI)EZ}{-tX2#Mrw}rd@c<|2VZ#Kn6#e5Iz4f7qo3zt=VxN9?G zxNtGn58JTauw41#w-587xEhJ16MevIO~Z#hBbH}$NU@(o7CuuSqihsG%VvL`0_ z!Syoi^6cXy>hM2!FV1ohw`+Fjh_5Z`Bja?VBO=D%f+t8_-TC04UuiR=H#QD zx00Wde`<}b=gCDc<~z3W`J0iv+PU?9o>KGV@;Yb5QqE0|-g!Csdg*q~KYSP)>5}u4 z_v7pFvwpBV%vN$2U?u@XP^jO41hQa`z-IsPqI?AUnBv%7vb z)2Z3+XLj3G^_y*`maFL+mX2hJE9s@mx=h!mjb0CYY<#`@He1@zsxUZ^bd%4tw=+u759LG89-RC(yB=?lIZhBIRX@B$D zn!|*vH)VUq?u%hNOxUcKep&iln*o38qx~p{*H%9d8}A2h?u(3G-tgbur?bxcLt3sl z?)y1j`=(b&Ke3N6;;c2w?$}87=x5UFy!xGqiCrDmrO#Sx$q%!&P3hCORs5qLxq7#4 zNAI=mqxXKE6KCYIgUh1(b9&6I)q`HL?n(bCo%+`rYfcZHes-_vk*oimF>zVTE_!@B z7BO^iUi4WzwsjBrwt3FQ6RPL`A^()YAg~h)VT4KGpBOWmcO<4cuDJ!ia0`vwzGWw- zZNgCgz(sV_&&e43CAU6yU&iJ=W1Drx#Jkq!LE%mEz4V74i7_?%!VbP=mX+&)Ilz3-T#OU(Yf$alw)e8=EA`JLx{{#+cN zT1#j7oI~+q%ZOb*PyKJ8Sgq4J(YMb-XZf*xTmQkQzaurTH7xeno_W4kZ$0sC<5+x$ zwv6v<;`R5oxNgrSlOOi${!qU9?v*e8KJ@*(>^LWOinHXuuYHgD%})1A;&Q*MQTNoj zXZoJ!`&#a;8GT>V{S!Z3oA0YXF<$P&!;6{!&Cz*+^8@D__?g{S4C%>f98YretjS%H zx5x*%ZD&+|f~<2J`6kb?d~A~oJ;y7rs$5Na=X~}(ag>*l_rXY$_m#bUEI<2yJJ#fl zC-&r<@+~>>wq36yXLLS$Y^{6dyUve~uJxTyi{&a7@{?ab8Stf>T->pfub({LaUy>k z#cdU*YYTDSgCo&pStk-l2`Z}OAey*Kys%C7r+7bh;6IPqKWFS7Iw zd%b&$>L;eBSR*~nuwBlVcM|$<(0M)khR5E1(+`CM?_TGZd3v$i_Vier7gwKFdPe%P z>ci6W?Rocc#fH(%ntpAsGfEem8i(5=b8mU}`bx+9o6~=$ZymnNh`mR8+2*^%?EdyO z+SfMU<_`wkymweG@xpW!+pO1r_tzZP`+l1NhX-qf;hOgz{`*aa{QKcOy#Bks*M8t) zreVhS{$KOqFkQyOb?ZFv+TzGt|MR>!s(iecSGIcZ^WwgxhvkX`YmUzL`1&|Z_w9Yp z{yV|PX4o(+_w8uD8_vtSp3Qe-@4dfbz1Zq7`xVm-qs0#<9Dn4R6YnvP&zDi0w|M7a zyd7igTUR#vTff=2o4vuvVaBlF=E1XvSi08F+}!tl&#!fd1Do}-9^Sj=v)>nvoA_{B zY&0IZ_WNQZMw{_4+w(Vnf8)MkyBW=Mhuby-4imN+ZOXAZZT2IVh3ME-a2fj2Axac#dhmCl_X& zSZ}&dS##U+6Y~uV7Q?M`Frq7Nn!Ui9Ywc_B+Wt4^#oxTvY?!%Yow0dtbKuy2a$p#3 z+lt-xJTf@0<{6Kz|L*T%yv=fDFMev z@0p9`Ht!YR)&AbS?>DTsxo`9tb1m@Sx@Y+w+xJZFVd1&lWB0unTh=o^@73I|-w$!x z==#1--r)VZ_Q`(Xo@my2Mi+N*r>_&M&Xr6g%gu%4<6Yz9UD! zZNhDT8_A`^bhmBGIp6)RXY66QJ<2C*=kVWZfp6T`^~R|UVwY!6!-Wsyh4*6bdgatJ zUAu%4tM*Bq^=14Un_Yi(-KY0J*IXQVYCP6m4~F^1zSgSsQdhF>8gJ@I`F>}@o9k-d zFE#5vDz>?9*Pg0rQ|BT}?QK8DC|S!@7k|{)@%fu^)%@Kza38>Ov)vOXYkC;e{C@Vl z`V?G)`WfA`p!a}&%l^^a{giNFjjP8ZmP+bIn zgC3t^nf;po9+}_qNBrwVICl>ufeD>JqP!I9+7qjQ&*?0WD?w;uCgKpbT7JPcB zX20}g-D^!h_u8j3eOdQsvp3j1+{hkd`y}44WB06|cJ6-@o8I=H>T%N-_xc|D{KUaV z2lnT<880?RciVFg>nt8J4K8ItP5gaBk339Y$9Av3&Wj5jUD(d2%sdQv_>yfl|24-dd9$mGhkuz* zh3A?zg)^C%4aaR>rT8!{xRhjEV;{}Buo3Hu4c90iV*Aj!q(|33hiuw*e0&|@d5QZ! z8HZ!e`94`^;>&i}s;@2n8Dr~_Sa-ZzUopaTJMI;yxi7L?zSj74jHeCfzGVE2eV%h2 zeSITe@1D-TN%(WtJ)YPvKVx6hIgkIn-qt71)8_o{y!rhkJHM+hG1u>tVr0!{wSKnY z#QNRk8u&f+?;f8=eE5CWIpo`Z{qN!!{ynyhVEe@JNG!<7jv)Up2fYfe1_4+pZh0vx_9=y zvgWL}>`&Q*|9akQ$&cT;Pjg>>k$>b2ZBue`i?Ckh5|K6M4fjo+q36-+9Fcq7`4Z=@ zJd1qC`-U@r;lGNp@~rmTxf1hm+%0$BX5YhqI~FXM+;5M}J9qqeUa;hoLncxto%Ls`q;&n96NL8=CAp_ zVpCtlmb#&8gl4_o+lwxBgKLpb-rIiiEt{%KQkzhZXiW{1V`?PpzSmE#y`D7}ELYFw z{yTa`AGTfVl5cLSb3J6K@nWYsZ#ePo|G|6z1*a_=M$M^pd#T*Wc=4QR-x>LKi-Sh)g-!JYveSqo_$ku$<&yxEb@||n)Sw}dS`s&fi#=W+y zf7iXcv1OfOdU{J%I`s)-!jM}1Cui_69`^z<#mdmZ=mMJ*3MK63h$KHO`i zcWRz{db6dkzU{n!k>2fa+p}+nIEs-TFFjl4ibsF9*NS!K-}=S(o}=`g-6swo7PqZl zb@uw2_ritEa)})VJU#B##YP;No_F`Xzp`K$Z`)}PFn_<7136qaF*I5(wtKzT8P@A# z_5e!{*Coz_1&{8N`~H7*P7au`=f!U|FP_@(blx`7Y45OktM>@U7FoqA279_voA3_I_X9^{l@O439-t#I^X1-y+B@^$JJ9Ye8~9Nm}0?{$9YVY{0P zueJ8>Dpqk&#^%4o-%NLyFTS#QjxgQuUzjT#+2{S_xn{CkzPaw%*Na{6*A-W;HSCw8 zSuot!dv{}3JQPmbe%9LumTFdvz8Nq6;=N(Mr5pa+vEm22Z3aA?7ug)eK4-q=o`>0* z>9V)i2kWPwbiI$*bJ#F;i{ElC@n4UAH#FB^UVE|K@Zj**HC}d04hz2b`c_;xZXN93 z^`73y76T@R^o-db?0vs_U$kWZkM3z^y1uvSzS#H8xzB3N{jY3>3HQCYbYJh`Pu=7V zyt#i=^Z4A-^cuwT`BB}+{x z&U@C#<%fPBsWZ3iZN6$;GhO1i7N)k&GtQZ7tT?K>yLOge>-pybDV-1#OukpJ3G>ZZInf>bFwCsBy==6Xt8~RAoOER-X?>z|aN2%wP z-jv43+pc?MX1v6sw{;)CbKl#3`%lkq$5h|%^z&f6ANzf~r|5mc^!Tc8s2IB!S?9%9 zwjSMoJoC4{qrh|YvFKB)SKYmC`7_sfd@l9Pi7VUEJ$=ev zJ$B-EY>!!g8|nLh(TORbYc^4K!*S(pP112m??z`nX%S6!?B1V?!{518F ziny>Yore*|hF@5lV}y6vHoDk*ln!5F5WlbK#InrHjTnx-_5XbSWS+!*JKniw80zzH z`93-3|JmF$d^IEIdoa?cKi4#}_%UX_*>cCSeZNz>emIxAua^&Y+$+nkY&DNPb{~grBEQ}PQn|yd zlQ(E2Us(A=VwMhj`Lw;($cd#~r2RT}~-g@;xzPn{je0o&S;F!FD;sg6$VhoIH{I(!TilxVbO>KON-0oBNVqWA7X~oOqsv#Fo6eY?3F# zdbLJY^Bmd#o3%LdvKjr#+mEf|Z07saO-)kg%rmI2A5wRu-dXjC>Y0kI+N4Lx+7|ZP zHow(L(*L_^tN1gYy3F#_cDAk9smG|vbRes`ujbTxvwyhkQu}@E1;+lD^FdvZu{jr(TEkW?pgAOUQe`=AF>8 zp?_fe*bU>YKEb^=c=sRNGr;HcF6eiZk9sAHKInHurryV8gRX5i%f*M->C1FKMthAT z(}>NoyL6|olYPI$^FCdAKz(%2DZ1=0I3xWd`b_Q{g$qxws(VmR?t9ks&D`r!&n)xV zBSBw`URv33FsDyebML=kWKA4;a<*|#&bn7M77O;0mEiebC0^FEvNTwKsG9b;hO7y$l6AK z$G7HY!5+nchX?oGU+m$!&4I&xGipySahm0Bx#mk3o9yo$zS~^)=);SPq4G{>_^rm~ z#p1m1-Y{R!#d{yD_v{HakNsr8&1{?LYJV%a5coVfS@iUapte75|~9%0*t+x|KhtIgl- z&EN6OzF+SNF0LEa+Z@`QxAv8z7*2O-X3wytA zGvBh;dd6kP-e9p^M$5IX`A>U#rIT;_;hUp*Zq{P9uub&QF~Vir=NenbzFf0l?C@ue zpXKJfC0A@%F!RlQAM5rt^L^TN9L0E>o7ZX|F6~}3y1U0SoUGLPwp$5 zX2IG!OdPRWpXbD=^R!%}t|hXc#s|+;jM!V3y}-QxIq!Og_xgO;BKK$+EVyHoou7l^ zKI;3S_x5tX^}W^iWv^fF(Ynvtf9q$yn6Ei5_kJIkmjaHr&pePao?7e zJhnS0_cNKD^YhFmcAev^j?iqh3@^*U$J$CSBXB?)3cBmiE({xY%Ue{5Zah zAN6X>s+M+K*SlBE+x4$}r{?bZnRt?Aq)sNrqduoDe#&NDb-ws)*;F6lS?kj;2t-EW5-b}z4auJ`?xKRv|mD{>9$0d{}!qYpVO`0g>r?u_4in&P(8 z`#f>fr>*nSe|4|bI^^@NMO_y*$hzm-z1jFVPU}ba><{}KvL#M&SIskSS?2V=b58Z3 z|GU7&A;2CK13w>P7-c7(F>C=}Y|UKElWuUL>c z5MwhZ>DGL>Z_CV7?I*@n=QsatCY3cYXWk4-{K<3iE?5-|j1gP(Een@2%d!nV$KLai zZ5`LT*0D+Ki4mLswXvAw#VGrFJN_rvT=tvo%6{*)U99tm_}95*w_|WEFMDz8Tw=1= zPi*{rPV1OEmgJXhe#T?3f8Vmv&&$s>abx>AUTmA6{|6ucJASkAwa)*4|9pG>Q|!x* z-(me*Np__0H$c8D@X4;*c+_yhC|P@)D2EYa%lX z*52Spu9N51{Op=@oRc^8`r+gJ?br^}t?M{*^1HJ6$l=K8kdr4SUvw_0d~fA`M;}|; zDOVITJ~^ow@>(nQS$qGl^ICCU<;Uoq7dwBhwQ^qaYWs@+GADnI?bemddA(V&`7bd` zF8iJ<|Bmg;SoJ_^g*|Fct)P0LY764_p;~3+UE7H5rjA)PP{|cz)jP!ctb^WUCywf} zf4ly=d`qV1bSu8XN>$B|7H8sqZwnv+I6iNZ|YuZ z;bFwGsW=tOHFDLut>5F;{i8X(fr>YKde>ZBx7NFVkmtS+^W}QnM{u8lUPAR6V8M*P z9K(0vwQZ|Wj5d9ddz@ZLb6~~L+`XCnO)dH_r!PYvX0P3c*}a_2d?TOd{$alKetLAT ziM4x6!+WQP6b4LB%6{o_O)si@PLa>J`d^WqJ{UbWc&>YA;kdF>zpixY+ts!B-F!Vh z`**Xhn0wy-yPtRF)jLG5USf~*Buh5E%k&$ONzOI9=NJa8J;Tx?cMnqgT8LHa-RnH- z$ZPEW>gK@Nj}w`Cvx)^b?0ro5`1rCqV6PQDB59b|Q*z7vOe2Nv9{R<_u~c;yT4ZKf-Ji=4G((zRY3xaDTOKKEg_aAC9I8L=<_%cf*!{Wo(n z+s%8!bx)kbb@eW2@!)2_uwPhl@m8^6<~d-uV!&F%X+wP-uL`uyZ96% z73*d6k^R1K+w2_h`UCYFXn*|@%yV&u?ZkxZp%EFMJHiz%t`+*k+CSKU?{H@;|=Wt;dFmZf; z^F33~OL3p%Udp|B-+$Nqem<*hf4i59@p8X!&il*>Dv!v$-T47IN#`Yu;li4;&QUQl zSIo%Y#*qPRnGM{Ika7t9o8hF^EO3+K2MlFFaWO#P~dvOILoKzop`QJlvO@-AtF<{k+Sk zbN1%DC&!O%M*Qy>sSAD`=lRo9bHIOH+Ys~AM&iL+C*Rl}JM&?$rv|E;$@6W;+;!Ng z-AYDHmRgOm*Ot4Eqh1roRW0UP^VEi|qbB_IApW*n^{Y5=*S^?L<7O1^ji2jY)yves zT`%iB(lz&U(XO$vnff`pJu>gZOt;sm>32UsvhESI-t4!0YE5s!v8wl=m{~if7%Zrcy?B~@SzwVDF zMzh}Rjd5?Z>?C&&Rejy~C1&Z*K3?}_V|V(%_}_hD_hXSQAN6-{JI8SES@YFj{uBG| zX`^?~x?@Q0IkxV7*O)#ydiCRbBwqLEJz5?awtH^hKON)S=>C3qZhU49o9J^Mmb+t_ zS%^`DH#B<~##`%f37CZW1#vmIxdt2q9p?|zkgeDVK1UvXMllmz=ZO{FHNuhs?ym!B{5VQ^a?yMHhad;IES4jRU22D+|k`&}G0thW7Sx91&0T=dBA>q(6Je8Y0f zm-#Tu(vGqCZ&pDqZ zeUAEbHJ^X29cN_n;b+hF`185rZQJ?I=yPq|-^~BW@BYsF=BMvTzAy37$oHYY6a76& zoYqV3?@Yc=$EW9#jojzAjGuS;^?A_gyT8Am9drBrJl8!b_cTV$+o$H2p6io{{gqt?{*>J3n@sOz>GN!xYhF1U>*RjcS+=?FJRhid&JAN5-^u@; z`RL@JC#Tf2hfn$TYi>KwH7XZ2|II#MKQGy=SH4THyt>ZUIrHS-!+^=Z51-xh%xh2`P5k+Y_za9u&oK^+6*9lu(;wrQQ}80Oem_whVz%kB4BKTWMvvBi65 zudnN~z4zC39QB-ShYSC^>%y+zsPlegykj4~Gn)7MS><`B^Vn~>Yhcy2|8kw{x$EE~ zUu)`Q)zMum@A*}Cw?49YMjN?%03K@{9pfC-{PYdzCpcD^?(`PuBdA}{@p>NF`&fOE zZI}MXmhn7%`Xtqdk$pyVWlQfP{P)baZF)Fmr(RChHLf0wbYZ;d8EH+=DL&~7F|MQa z>LYcJ$~?Gydq2WqzN?2-*YnoXdY4sitzw4*i`VL0EvN66-W&4n&kh+jUSGVI zxRJ-^Cmu|%QAfpU_UpYP^dS3C-w``{n0<8bQB0V5*4+=i_PKPN(>HzVj~nNs6ulO9<>zjSRVZOtG#eeBtw+|e)4r0hg z{cBin>7|R@cG>?lytn=L`uUD$y|ejg*Y9wK>(2h&vN`X9ZU&2A@A(~`yWaO~T^R8@ z7xsQ#SgwzW!@3wM>oDK!|Gj)R*KOO)de8fyAG~+_t$E(->=>|G^WezEabquLT->$! zuJ`ZuUf{9`zs)}4tTSf6Z`Q+$7Ynv7T(=o-GhpxCWiM~Z7YFv*tas$igW<8-JKP+2 z@BiKN><>1-T}-%G>gW5Mo9Bl2GQxPVZMM7L6TRh|75i@iN)-0F(yS5AC-Ft+?al?+ofaN<(*D=R`nD7hlE#4X)ti8U?e3l3zv`b>h?_@jVwpSdds=z`Azwd*JGFbzDN1i{3(Cd56`vg zmGaA2dNJSFO})`Ii)x+NcP%sZPSsSIx813iy1tS8)Lzkh?{D+pFy5-&&|Bxx{5N&q zmUT>O#?*nT6?_oqBaM-mY8EzFlg}X1VC9URE7lGTT($yK3YxT|Y0~ zH8t^d*yq@s+T3i`Yq4Fp?$qWb5BJsnU-udmhkilqriX#7dKM)YTVC?rlbAVnuQu+5 zShwftmAJ2hUi}%3Tj&1H>9=(MWqLUFPyZ&Pm@vJX#BF<>L-S_1E%$ze-a8QPtKO3B zr0?DqG3b*Gw`Hx~R>#C&dXL`6&~wh$anx(;-j?QxzxB_#`fcg;HLooj_5Utg>%@lf zNuRF9^a`z`KUoJcI*xmSEthW1-`46UwhipId!=_A_f(Oco@e@`mZ_hcSnBPbSYpGH zIgWe3?x!+0TkbwB>po787~8j=@QaMTbB^-)v;EYQ{-a*?^r^8ax%$=1Z^sy0dg1D0 zJBEEMLoOYodf{76{Js9mxqAOFS=)#E!WSYFhZsiC%ohD-8Rf72XT%Y&z~8pw8_dHN zh!tPO*|A_9u!m3P@r{%GDi;rebF5>_U_W9?)?fT6KH@{|FW=@-Vp7PPb-}IV)0}Di z!q;po8}YH0cO0`WuE#t|EKJu%d}1#7gONS?+moY3AJ)aWjx5*rWnA3StZvy|x+imd zuFG%j^?h>HkJ$Mc>l|Yn8Kcg<&r$PS4?gVU-RB$M_K9uDFMd0A{yC*vw)-5uW^?6< z5nEkDerC?u{5kQZ?`uIOKd$+{p8UHc{`23$@)alX|2IZ{H}(7Ne~ahuReqoR``I>i z-skUD)*AcwIL|(e40(RvH9kHI{n?w(DA&ektVe&w`?I3YUVmohb5ozcC1?Kmy>-e6l82k7$>-hTnknhj)-H6Ty_WrJROy<$e_c`CaI{2>T zyZQTZe7@Vf`}aLaeD>j6GT-lDwCI*??E5~N*x31=Z2K_dxlij}TXFCs-o6iO-aPn2 z{&G)m8}fpQ&zyXu#>g|8>0;Y?L-H2cR$d}`=_=Q8PD3ommag*{{FRHuAGvZQa+`I$ z$+n*Pe*TXAywQ{QWlnyVJWg`wd-J{*bkZ|&et2&3NMFz7qRAPF^EilMS$wm8j4Qv* z9$)z(uNaca#w-_Z>*pf9POhE&{CXCX{9G|=B(MI<#T8|F)l?D1vn`e7KaY^y%m z+*Ur+EZeth80@+Zd9RP!uFey^IIq^!Y-YLWEKi-qn0fhz3;(-hs_(F8-gO_fUk=Hr z@1ke!wd=vM#b(R2jyxlEYwFS-|3zJV>RUa(teO|Sg627qh`+f z9$mM?XsZ_xA2D6a!gE#gt8Y;L^bMNtiW95n;9i1abblbvo5yz6UwRbjRiwu;&#EPx-Lk_Uk?q z=L_piZ%Q)tw9@199)$F??*7z2VZjxT{#wO$pRD?D%*B6^v-T((_3*Gwzpniw*ND!& zyTgKG&j{De`pX>7J9f75n!aNn>RmeCaN*t0RFATIo-KdtkIs7&*ZvxDU083+)T335 z?)~;0E=>Q}aT)D%{A-OZ9GE^aeOmR4dwune&)y^L?Y(rwh2g?%ndfNEi>_p5z}T=p z$7Z=_4hOdF&tvWB9Xs#u)w;MTe+PK>|2F^id!dmNyM1H3Y-E>p=^bZ{$oA2DcxT`5 zwa)%v@AozTEe5N1Kf`c4R`FHu2W}nmI>d}M#}*rpGk?4r+MG8w?B|8w`Z)W5OE13UHX zUE7H#hxtl|zmLQkCj6>D_VK&Muw40?^}28m#rDDxG#Hqb)fTH_HCEH_50+z zUN;*SgAFJ4c@IBk-8{DAAEvwH+h*p)eD$8^!-M@UXz%NtcR{zk_xt8u(8Tt8pv89U z9;xT6`hJ;bs`74(>;ty#x##9ttBmJ<9GlOP`~G3VJ0HlLJOMxFEW?GBKj2$-olE3- zw71;lHOJ9&bDz18xo_oA%4d44+-%3lb9Z9Flao1rb1vrjoBrf^ZPR(5c`mY*Co1nO znR3hInCO|eo$^#zZ*tS*ulOZ5Mz-c#{>xm?T9(b7PgksF#FB^elE2q6y5#qZ_3C-g zSrg~IMwlAop;t{(wThlcjc(X4HOh)dO;c<8lw5YrU$L9|$#bo#cU1F~-{|q7UTfc; zoAI`+>$vez9ay@q2Q|vyaa>oPxWtakHR7r-M~BRI`x$2Y#lGv*)S#+^qg(YZ3|I9r zI{S$0*4(x98pC_LZgx$c+WWVWo&fy;?7Ft^et`P}_Mds{#C*qxo&+&ER>d(_X3cyb zZ7128e?0H5XW^RzhtHOe?5^I5dorgl6PC+4-Rn^gh8Xl;bR1n|Z@r%A-u4D~?{9Nl z#Y~Tib9jz_`c%ZwT>Y%by9XB8^vcR#bKB|st-F};vVZp7_WJbTe7)7JG#EyT)KJU#@;2<|M+5BYYi|q`fK?eUJzUHu^C&PL0AJ|f^N8G3N zur+Zf*5+P1cQd!JCG)X9Z_d?Y*j4<^`RaO_pM{x?yskrhtj`fHs1e;{y z-S9>6Nym|Ft>s&+HH?z=#~k~o4|Yp7=jwMZJFa8d&K&hztGTDI$Lw@CD*RUm{;{)- zVy*K!-no9_o$I%6uEpbn<#zmIQ+mZ;zWsl3{~NsMvBOvF+Si+(<9VGqUw*#Z&i_~T z`M)>6e@}fL%kq048NZ{*&b8=wU!O65j?hUzpQ*B~xj(1anh)lMO^Zl3a=kja) zpR$*K*=W@Fck7Y$clhXtub369#>g43@Al}P>Pu< zq;nH;kmM|4xg9e(QDj*^N9l=?nBPWnJ#@~+c7C<u7gzppiYg092W7hqnp;lo-Vzwll40;u`bFIc0v@!fBT4e|GU z`VjEkj-#Fl^Yl3AjkNBtV#}t#B7Mo!6Tug~*ZW!gZ~dCTl6T)oOm})oXAf}RKj&Ui zdQnfNd-LCLV2$0Yx@7dduAUhEGxyajr>Eu~+xW@e{W$g8+W)X$`giMSR*dYmzqf6B z?!PM+)_YiR*l)P5-dV_A6!~H2UZ#4JC3C-$anED(+4tQ2&DZ(rwGR8GFRR|H`?z7f z8r45df420^g~NR5>7My#Z}@BfSbLDlUVC@Lcj2}jqsP<3Mhnjxbz zAAah;u3@$1v-bjPA8_O~`rXgH=NIPN{FYJk=EeIR(b^vz{pP{#dokc869;a7E8Z*C z%YNX+fUy_Lh5wd()}Cum@X`<0y?C$r@aSY8rVESBe2v9$#eUIg9**1Vey{V*jN!jw z!(qG4iQ%{MiTvkLoHm?yvET4ukKP}wdGT2G{Q5o5X1TCs80$W?*B2iAkbkZ}eX*JS zyxQw)wtLBmTkKQ}SoXzCCF^spJ-&Y5v+eWueziwf{&3irgP3pf$a=4@Y}R~pVDVY) z^)0?C4s6aEZfov~4Bp#1*~63V6K*X1jurclvAOP34(CO-M{(8O4-BVWKErpze5DV| z?O5n?z>1sGnj@Dk@xy{&_2#$OitiQ+&D`t6>HWKHm%Y4Vzv8ED*DQE=ZZlyqSoZXC z=p2j{GwfI~tTV4gx7XpcmYLbsTpahdgUQM_dwVO+;k@?A9^w35U+l$X;l|>yS>ub0 zwGVUS!*pdIKAcf8j?Kk;Uv&Dry^?=&U+>*bEVEx^e$R8{wT1%^ANKr`4ZmI7H~hGC z=Ddm1Y***$`EcF;d>#H9whK#+jK2>&`+wOZ%=t<-_sMyd%J>g2Y>`0L~3)QA7VSBc^L+wbD3IeB~42E%iQ@nV1UGk@rj|9CXxJ%4`&28>Uh zM`g_6Skx@U6ce5rXsx@Z8Sb0fC^gYzRPBbW>b9wyVj~ (7piJZiO`s}}Uy?}RQp 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

2=>{lMxSYmV=4?OtcV20q3 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

&k_Hy-qYJtuW$Ny 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≪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 z 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

Hm<8`b%)_0+G4mi9rJgj(P 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

5b7SYjt|xwS zzQl44>^!)6dVHCST>2MRYXi#dRTr50f$Up1z&||i$f*~o#-Kj(*tJ%H?extZk4|#O zJT;5jera7F!O!*fGp3d@_Prd-wRzP`T5C~EYB;XD$X<1uiJ7{J>pTtb}7^yeKS3L3PPc2M+kA3DLwXCsMjr=dw&|E9i8IJKgXEUht zo!XsieXZ}Q_J?h1daegfoYec?wMy~Cqr0tRf7*?l8mMgP$8K8J{I8#Dr`1zeEuZ^Y zcYW}}UuvwoHv8ERuRDG{8>I8SjOTKnnsDb$pRwxB*rfg(AK9Wyt@+!T-^=;h?$oZw z=k_npdu3aHc@c5BIp1quH+JGp!UIoicobqCK4tN{jsY*c^ow^nK9QNLUHtFIIbY83 z`b@9R0O$Yv`aEzr-tfnYMSt1&`=2@gTijiYI^&;ku5hjG4pywJdF`~|4)$X99-f&z zAM|%9{%JltJ_FYBuYU~}{jdN1ui>Nrr8eV#&3JT@(PEcY@{fM(kNiL6^B);A2mcS5 zpAEnJ{0;Ja;u+ihQ8-4J4@_3vH~oeEPMzgoxP{+>^)|*chWz>b@8Npqd!7$J%voT@ zlF`q(;2E=Dx)x>pBm4#46ZSK{dh)wZnXy`Z-5RU>Pkk1ACOiXq9`ITHXMPS^r@oJx z@1&mVAOD>1MfRofKmQ>NU|eV3U0iT*n(BtaHLf3mx4;Pa{$qT_uhJh5^>2vVX{i z`T4o`?~7*~JODpGFvh`CngeWR3|5Z!trs>rwqP{y3VvX*IsZHH&FT7o{ff^m-@ABV z^TL<+^);?ZRA7yTL5{Jx~zPamRi4>*%`g|8Z+9WA3-uXXc&16Z68B zRe$(o@RG2SagppdcO3l#V@=G1x4!m`^PboZnYmrH;7wt{%B&YYEKYc{3G{#e zDlYhl0Z!O)g*Uv<`~Cej=jb-JIPdp|CsyqzSfq6zTIkba>f(yyyHh~)!P={)3|nybLw>R2mf99_d4LaPWT>=KebEZ zsNOjGRd+OhOHDJE<}*$gPdnq<)ZekNX>8`q7;N3Siu;APiO<|C2hf~r{Hp(|9{VAq z=1e{L`z0UdkYDT2)UaENCRg#ClF8P3*Q?RFuHE@-r~E|u4RP^t>zwC~JJ+Ap-tG4* zTXP7v=5IdMe&rYN?-??+tWTUl?7}@=<4Y&-v3_tW?Xeo1kD(3Nk?8q5pA310id zosEq+vPV2>1G$!5KJS_V;}iGkW6pBT8C&t4<5S+V>np#f&uDDRVM@~)c*s`v~_q@dOeVujGf8^&Lkma7lf$B4f-{{WV#6D|o+}=m- zi@1F5ijlQzUD$8`*dW6eo7idG7+RZcb#J;q;wDyn6gf z<3~TwMztRA=lOY7>-pz($cJ?iOY6(MJYq3F^7kBjzHj}z4|)&txO-dId-t^HyMJm8 zl@UMjy5FvSxiPd~k6*{F^R?}s-F;T}?7@oJ{n&f9_vZH7j&1hzKWz^V5xy}t!Pi)6 z;s(#08lZH+IU6Gh+pvz}q+p!lppQ5U&w-zWmF%y&WMY5EddpXKjEga8XDr;hvkblidCkG{uedv;xCOIxI%)DP6B7BIG|IiSl$-GMrSeB!Gb#O*)o z6!QPnJ!&7+QjT5fCgq1!cZt6B7`2x9oqX49P7MbA#G`)GI*t3bJ9Qn|J!P#g)uv-w z>Qk;arA?iwwx?b7EuB?RZ43X@xL*2QJ8L~`%TAwKooaEneumB*Fm*cm)biY_j<;%q z<$+xTOx;fPz{E&xkU3l*Ts6kXkbhj%CqLwzi5Yn=opYI*rfaLzNpnqYwRO$f5X*LO z%G6J7Lwo!mHQ8%lKh<&%w`;#gefQ{6|5d%2dN8)BF;hEcj1Jk7pMLxpAMUqy)qQQh zbHF{nX0hi;&#+F`fgP1qW%qnRCX)Y^`$@f1v{xut)KHc8tAR9|jr-ef%M)~A_!vFS4Z1K$HhQ&F1 z&SN+Be1801@%PBRu|IIH#!}yL*}-$vVZlEObMY)Z-|GzTtLyT-aGuup>~GqBXLR(` z#f`aw>w>c$*eo*Fxi8)W^RRESukbwOZ&|>|xsoA2{qnw9Uwp*- z!vDt4_SoK->X$2iw3jR1Jn-%Fe{~nn%y%zmJ*=JIH~!AJC-zGIHiYlQ9T+EVya&g? z&r;Y9n_#np-{v#sb9sEP^UPO%m$|FE-v|BTXuoi}^(n{u(U#X;TrM1{cvSe;%8|9t zJaDdRE&q&rdD;8D&*giqgFAko<7Irl8(JLi=622f9v__v{vM;e?z{E-SnPe?tIhZ3 z-7I8FE?e!{!3v|hSO9;=@ID`#`F(g`gBce`{M4Gejh%1_7^D|+V-n#X^uaE|NyMKq zdzN`$`o>V;qKk)&pCpt1+SUHFKjE{t9E?aTwZ)Mh3-@6^I-mbFFMRsQ6)%3mqm6;j z>dW@qc<}b<&ijv?(T(ku4NeAciwm~B&-@Y(ygu#dg|{`f{lVYWsb#L%eruB_)JE^6 z9=nx8@ZCbPCGSXo#^rbMSFV9fxr=RXF2owD+b#XMq)VT1^D@O-@)jtvKV^D^E=z`=)$TXE5jM z_3v88<%C_okdC^AY8Q9U-9A3k8{Mj(^u2!Bf*A%sn74h!sjmBb#_avA1>M#dRqmRxi$v2w4FF)u;%eGp3{1YL9wmPX(OYicI@zd zj<=3}ajfOkCui=~6;+!I_N9KAxaMtLr?leY-KxpMK*b`;;F$)%~-E_=*>ue(U|_55f(EZz!iAo&sC(7>*;pf>_}c zsx$Whe?YG4_>E(qr;ar?mid&#hl9|36G!tn_l27{yi2$Y`6Jhy%kRTBHnBVF*>)?= zp6B%6wvX|jy2f_vG*|q~%Z;r3o!5xoT;pBytu5HrWBTRe)TjQi;@1Dc zkA`we9Q1H=lGZ>@y~p^C$B?1->HE(rq@HCc^uR6GCsUv$Jp>0a4(K4 zU&(4?ed{eZp7p&a%RQ&(fB9)mU0dhO9MO5rBU@{_Tqp9ZQ}@m1xh}=XJ)C=wPw$Vo zirseEpP!3k_UF_4_GeVT8`pY#xTldbch=SW*fKt6uc2$l?>XoBSycYGU)y(m_5HcM z@qf1ITHN}1v}AgAtZ|<;S>H1*&%W5MXGeKj=_IcmEziaqU%V?ewR=4Gcm~?H&(r#P z>}R5$=Mz&h#YWB?_!B$N&eQU&WgW|Z>`t86Y25z9cKdzrAO5xe-M{wu^x4-Y&e{9e z@9x;|N_h`#T(z>dynCeTef4GE)HQn``|zyc)&O5R=`+W});RH} zn|^T0#wf;BOGmtAd+^rGL7%ybuZ)+9doqXC^Tm$2i_2)iR2e(YYrJ*S|BesAqQ#T- zzcOP~aAj=3s>BsmrfuIo#kh@WY>f|kaB;8Bk@gGr7XSKH{_@HBl8x~_Z)=0jBV30x ze@m`W{#f$l4(`_;e_vngip@X1v^OuhJa6Bpy}1!Nne#5^P34CtN12?hxf=H6e;vbq z=RI6(ljEtSzwwtm$FQe$W>pnR|SUDp#-n~>eaNL}Lb&iJWMxZZH<9nYEt@=uP} zGRdd@QN8Lb)LF!)7kk zr)sa(oUl3G#A=<3IJHsj%5^N+s>b!LPWFRrYIjdQxI8ZQ=6MjWf*ng|L9jWs zIoJ1E@1rg#j#$1^2b3@EU%gu2j32eo9Ygg`%UlN?yOF6DI(CvVPR;aDgGDB}>#GkP zadZ7t&qaQ8svTdSQyZ2Ib>-1s4#67Q24e zGxEdfA{X}?z5L*C<0tO-a=P{-_LYezUgMuQ;1Bt5Uxy!7ACA};yqNjo@U7yN-Dm$P zwib>KW_;l5g(Jb5{O$8Q!di)~3*MGKTxw;z9XWdQyXIPbCO3R+bcf@uEivR9JL12u z7ytXA59bR<_@RRn?o~VD)8FHngP$Y!&Hhrn2S#cgMSbD3;xe!w{r{yJ@RR#B7kvNE zum8WV_}<0;`V4SvN6wyBOeb!a_{C4bSzrV9BA&7Qjq>}&=lbAohll$Z56}D|TXu(s zg@2UXys!Gh%YqT~{#`JbYK*D%8BYx!I{3=xe;Y?UaJk*`zaMSR2Y<*HXFUAt=7ovR z&%Au&<%I`}2(y8+ik)VC>GN|I$C~eUhX3vV0rq!05C8g>#a3s3)&GZn4&Xg-)1P89 zo^$*hdaf3ZmovE@hf6)<^19}Jb=J2W?r^)}VaL{7F5GT;;%i?HSsblw%hyi3#^!K8 zWtwC2yLD_d0JmTtZTsFQyBANp-?LJm{n|0)1J|p4JA3#1 ze2Wii*Y~!LeA~4D4Tp^G!2vS{yTs@8BaHtriYm+!qCZ#ZCK z?D~MS+lRw7zGiPZ7+ctxn9;}oVtixu$5=KO=T~R$*7B2Az{!riI9_s)^bbc&F0%BS z_igS%t3Gz(g>PPT&JQ=wd9=x=lB4asO8FYL$@|W`xp^72d0cZw;$C}n zxe{A;$oBYKf90z@BYAG>imiBIa#-n{H`|8T&VT)ErEk6SY{!z0XR%`VnOyzN$I-tp zbGSzyo>yaWy<;EFSM>sMvyS0f!SX-8)F0Se<4b)beyT-uJo@swu1|PBMt18TS618B zRL(g2_!$#_FhqG`@w&+N1;!Xm(M$G~;TwN&IDWNjT}XHY``2|i=a*b|!dT1aj9pt3 zE*n49#Dd3KD|7t|9saQ&o7&Qh#pR(fz?yUf{cJ_<$8h z+=Y08Cs%NJ*v>op$wyDzatF#+$0oc4dh;P$7H))juor(ptj08-LB3m=d5+7Km`k~F z4oAbhTEp@szUH|)#b(X1wa-)EIDfA-cUIq%=g)k*fB3-R#4ZPB?(Ohq<@mJL&6iC- zJmHyVb8Dv`&W!PyXRj}M;>%~vA^XbnImSkH3UQF=i8q(ldhf-xjLx;@;d8)87jf%5 zHd&)Sr)A@@{k%@*@!Z_M<}YWNb$dPQey|@K&7u2P>xf*jnKv;Xw%8mwYp#D<>G6$D z^Rc$Q&a7d@>SyOUW6wOZ4zGtkes1sQ=D79q+FmkZoVgP7tjqVa_5E2^M$CKVbIDq+ zeByG?S)VxJv)+3T+urdz|D8jh)nm@9d;0$s`RCvE`Pn9PIN=_I@7fIhp6s;cC&#er)>uoL0};qs#NHYmELr?;S%v(y_+INZXjZ zt<9G0K6}?5f7zS1Ui(z{$hB{I?_>|{{+T^Z@x4c?&Np+(R`X=<+Z5V`7c0 z^VLRUNv`a~jxA%oueRqDR*CQQi=pbq^DlbW&+(YA) zhrGu-Klw#pobTju%Ey+S-p?h!8`7ByYt=`73!Vx$SPPYu>B6;@bxM*TsC6#b0{o$=kN|fGZ=nAK%H}(Ovzj4Uqq< z1`s=JWsf|58N1Fv-N7{sV!Myet!sSrRYyr3n1bCf8^)=`KhIp z<8^JO^&D)?4a+t)o7Q;#N-Ms0@w?`MsYj)THS}^8k8{7~acc+nd;gCwvC;eN>XY-eu4jV#UD5t7X!Et~G0H6l z(|uyzPh1SnJe)7wY%lS@!FWlSX3^3fPe6T||W7)W`Gs47*?C`Z?d;0OI z-#2+>`aayTf1e5N*e&ORdp3BuR`}rIerd}YU+&giqHvw?)L_wrtBfVD?qWQin>U8z zY8um7M z=XeW?Egbcz6Gsld5l5?7aK2ogSM6}SZY?)IJ2G*r;djUW5ko%abdk%4xZ`uq3ulbZ z-xci`vTtm)iSx_;^ZYO8aLo~4KK71Brt`tIAwK=#F=q}wNB%DOd*3 z^O^BXx#xXfoNRbs<~e72BQx*2_~Jk0fz9jgdEibnPJ8&-9dmKM%)R+qttDJ8ysXah z$~Qc&_}%G;=XLz(Oz3=y(KKQU0@aSz@-nSg`!Iszsce;I#f55x)0rML7 zmfv-2JWV{E?`{0xVsP}q(!$ta{+UPIulwM89Z*!W}CZE~4&ae7D@9P{$&!Cx?T&(ZoHXqaZUv$d(Z0{T{Ii7s%x8M1-y>mV1 zj)}2zMtq6;2iGI79s83L!t<`Cs51C_ObKYm1{`E;eHAU)@56)I{<8Ap+m!!rSoa`Ft z#J~<6m_0FkK4s!5hINWPHjZ`UHfHOjjvM{S13ca~xBr$} zkS*ikGno6^c+ra;a=#sm&z)F3vu5tZv5)P{bLHkz4v&JaoJZ!q+%Riq{uW2n z@?|HU?%emp*1Yg_ca7#C8Jpj`yd8FXJ@z^4ADz||8?ANX!V{VwoIW;du5%yDw_Ix1 zeH#T0s@0~UH>SwdocGhy| zQ;d9mj#vMDmWg+MM`Vkx^IyB~vaSDNeC&Uoo3&%E&c|~OU&-9}GZ>qW+xi*nxe_C>&Kw!v z7`1!vL2KX9zF0e2>$HDWciP!UXAUm!yWUsL-Ch|nv`=a;oOtZ*`0aLL%I_f~UavLJ z$hrq#z3mkH_#n$X4_RXdpNy^;rTnk33G(`ZpMrI+ZQ>L^VOz{4UvQRjk8l_=^u$Tq zSe2J6uHVI9#Jcg^uWYx)jMN85UR-(bCbro45~mxTF>GQD#$}F!dB?`KEAGU;I5=|! zCpQ-D;fjNsFIEN%|8RlT(H+cAZb0qt%G6)}&KvM^Zh$>8oF^nN82`qxer$*vUiUL6 zVa|KWc8$?B4|=qdKWW@NN*wOQIr-M;>EoZa+%SI5<*Lg&x5*D>M}Kj|vJX#ed1E|t zMeN8qH{bh_HzqIrkmF0fOAcH9mXy5_*LW1iSIN3MU{qp#hgog9C7*~8@?U26qj za`%(d+fOwJxZT82J8@KV2wbUcx|eEZvbi-c zVmxbVuW@+YN4@PK8~dsIJ?nbZ1XJHrP0%$$YS}#_;(8%Aw)J_C)DNi(;&-m=e`VIg z<-*fee)wQ&m#tqO8|tF?xs~74R#gX8Ewpu0>Z+-gruJ%%cu z+nTE-9`@mA>CYVKwyeDFM?0KG`CPRt4xFxdU0V2Hal$?WeE8wW80-6>;a$gG-xV#N z|I|JQ?ltx|b_NeNhbgAM?f=p}!0C$nZF@Lf%l-d+r!Ov-)_kwz@>yK*_?oYcoowqH zj(Bm!<#zvCYYxfhdfgZId(QbHgM%I3H{7qkFS@*}Tm1PM{)pj<5nmXN=kc5Wy_~OO zzrX7ld-K4T3)b^to(KH?NMEj3d~xjHZy#rQ&HI`Uh8K2Rjp^$OU;M%SUXIuHu^axh zWB>o&p8qx00)ri#1tuFzbMPDZXY^nOalZMUXMLCS=5fEB2mT%R`|uA}8=3iB&h2ha z81D9t>GyLNS3F~Q3Yh8HW;dRaXmMbogi*IZWr)$~g_dmzCv5tLXmAmy==X>+r&*pn0KYVYv z-`a$q755v?v|Og$6VEgDBEBQN=ZWD_Yv&eT)@w80Ti$kf-v0}xZ!TkS>CZJe{2r2Dd@ec2M zZ9eu%_QmY4-B-;CcmMakdfvOz9$gvxwDo&A-cc-q>$FspRnF=#rcBy zn=fq4zxwa@N{MyeRmE=nZ?2O(WZNiybD8+cZ|6Mpty7*OUN`zLeQ~x+{w)WyO>(`- z@5&Q9hfI!0PB$0aurBhw$ZpQ}C11qnS64XP+MIkN3=J?mVi+l;cg^hI$ZjrBjQKukyaq&J*X# zTw^}t=ueGUweB@v$F);F;yU!Maf>T%t`eKp++7>Lb@a;BYHifX(dSYf+%qIkhdIQPXg=l{ zA9U4goH-<`?#9Na^B%w2;{Uq5?oavKPUBz1`D*`~3!7a7IQ_$yeXgT6H~x!LJA7R^ zx$t%)udiC>U_FZy^q4w?uX3!OYy7*e`e2uPqIN<5@{o>ij@N7SysW3!TElBSCywIc zpY>}EYrN*{`oz_Cj_QenOk>Y~)+{czYvCTy^V#Gc@R{p=K8{oF(%f+TWEZ{WW8I9I zpBRo^pR=CEkFDg$);j2)wMpk#T35!*;rZ~*IutYOKl5~4o6L3Ax$gPBCdIgZ`nkX7 z(7kpJTI{dSxxbI~Y@a{x>pAnwzek=s?|6CkNbYA%Kg;tR$aAjmfS|u~t(Y^npEWZF z>&RGbpJTNlrk-h@U(Zl%bZ!6YdB$1qb$RS(H}|y1w|}13%(t$eoAt#b@Cw*)BY0j1}C4{I6W+oj_yH`WA08 zrlx3oN^7htnXvE7SByICdCzg|j$G>r=8f&qCC0_p#JBCi(z02yJqFWfZ0yb$48L0N z|BMf|55_m958jX7IYIIPTXUId-5mE86Nl1@4K|veZr$Y8JR+0*s;$5Wr`F=uv0ZzirenQ0;M7)Br>P&Z_Nm8c{Bui<>7F0> zwDXx@*PgE3b6hT1E%9=0!E2JwV_pA`HOtp zJo@2(4}Uw{ul}DcJaGBj$|kPQ0?(QbH*1+}C7ZGMW8z#M*xw25m><0FiFNIL-gm}t zo_BM*;&kyr1&xmseBvpr{kKlt9u>(Pz+Xtt6Fhcx)gE20C0q@wS zm__fpfoVn#1`?k;@!V$&W{RKW&O5F08NZz;l`DSbM~_@8_R8~; zuc7bxUfY`Qm0WqC^SZ`yjyP*e4rn{Z&L4Ki6HoTadx!g#jNH8T zeJ{HC?Da3t>zujoOIz=Ev57I`iS?0>E2no2pt`T^?1PoJK2Tn_yfEYY4*IPrbPv_L z=$eoHlsd$;?5FZ$>~+-MddumT6ShA7@BMkkyYBLc^{@@TsZ9HR>pi18a_ruJwIcjK^~P9VU&ar6)}*U_`zUYL++K_GXwRj!9UuJW!dCHC`%U(?`CH>JIllP1 zHMip0?r@Ho>s>S0`rY^am@lo*;RGjEdC-shW}dERxWflWdDhi?NPNY^FY@w!;Xch- znoIN=$L?*b*!c|bXAO$uIasHB@sqwS@|R7=W2<|nO)T@yS&L+z^YXyH4|A-!pWL@% zC}!5Cb$I^X&-q-t#&DkJXRv(UKd;*8{^F;f&++l+ayiuXIbx4pKF9O3UNV1%y(ik` zlR4~f-N*X&&xk%hi^|$Rah6UtukmYLCr;!2ceHv2^fSpbsDJxBYo@Pf6z!fbfBTh{ zZ}l4c+~Qf2=gZjJrn1I%>*vdzi#VP;GM<@PtL3w1$yS^^8~uzPe~n*y-3Kv==l0#N z-_}>Q+n@H0Px;-~v@fw|_0rzA_ayI8%wvAn94~vOWZLJtXO4~bX1CVkpM8$Dd!FXY z_{eN`IpoH}ZuJ!p+n=uBkgXrQbnFji8Gp&aK7)_8{plCeU~Bt>jj$08!*{Td@X(EA zoMqgld9sFLvBL*9hT5O;pW+Ee*2eg;cuw_1VM%kikM{+^v=blPx$VH7=6>yS>yE~+ zwhdk`9u7Xnuf9Lx>SF1(VDf{@$w7?cFQog9;Xx!#j+Ciirn+T6CesPkL$U0=y-o2zb~w|TPGar5GG!OgcDtK+XN zwE)Gt`Mk!h5x@geLm>AbJ97T=zNdB|-Pk0S+SVFWGcb=V-x(i2#eLQqtV`Ww^pARn zY9jS_4aNWS*LJF-q|QPdak^?_OAUoN)uxuid-UUDE*QJo-dfMC-CWt56E1ICIkhF# zqOzXd*Z0v)ZK^dV*|t{Ix|ix$u4O59^%L*fqyO{EHM_A_U2bY{@!hpKpZhi6Ykg~d zmEnhsIv=rI?~|Wug&tpd^v>qY-+M_Xgy2h+Vac`UrYU$mbz~)>?(7;*mkZVx0c-Ya>TX$WgEU%-{)NJS9~q; z7MC0DRD(`|_zr2G|2=qr@Zj!$#lnLR`3%hWF79{uSfBZY=e=_Ax8Yzf|7%lI9 zuu?Ifu+=v_XBp4Wa=kkD3xAvVk8{A{b*<~!-|8RV2`&D3I9YMU=6*jp-OC9-&-jK1 zhGT{|R{Q36Kga!Fz3{^7!?g}S%XcYrfgKK>Tewg7t5~VnY;YHQy1wr@9IwConb>fy zorBnnzhA%7U7z7O$G;r!`Cq>9yOLX9j@aC7ba2Ev(;NPme#iLh?C-M8xG~t{jR%9( zg5`?E-Yt82eNUS+z8Vi-Xpk{M_PJl~J=J~jzq1eQJsdwU!E=xIzFv;l`+IG?XB$Tl3+&-bd;TLwxLq*f@!kEg zDSk9oWIQnkO9~SnJ^savw8g2#j~)M}70+86uy6Zr?|YAf&4syRb9ms(;o{pf!{T}s z3!ENI4OYiSnBDE>i;L~w?Rk$>e#s%ud!sv_uul2L$xBA29K?3YTgvNByz;-!gKl2b zGsRE+&5fK#b=;hd{B6n7S6?+`cl>eMru7scq#Rv_NRTG{T+Mhe&0UNIA9-+_M5-BVb|3TAFMiCYjmljjc;pd zw8nYZP(z~z=NPT!l@l)Kt2*7niM9KwEvGB};O%2~YLu>1K5CE;JA7R8)EODL+?oII zy!3U&hWe@Wu8GHa))6c9 z_-R%9rcT{DxZ10K*5O?nzcusNX|6AQ=A`call~9n4{iXCBR*|UY4@>Xtjql9h`HO^AOEq9OzV>EbH1W$x*E@8bHgLc znx$8N^hcKaS#vv1Vw{-w-ut_UQg$~c3qe361%egoEz)Mwtt`c8FY?!d;dlo$A5F5a`Yd6kDVhe&n4NZ zoxYw0&sgUfBcG?P&neBrvoOy~$DFnAd5Ep}X=P9UuHo{+OD4Y=V~39}`_=x+t$&a0 z+!<426*9<|^b#W(J`9IkPX zd=%^AzRDDvxUWl`^Go)&`8pO>Y`lvriy7?5x%`xR+u!H*L`DI zr;DUHz)ksh6Dbp zE2m3aUYGoqzGN$(P5$frHhHjeVC>f=|BPpy==M9)4_o{uPd_r{`59MEtG??6sspGt zfE_Z|5}fC!rht56Klx$T4Qfx@?;mrEef-t#8po%+e6V<0)k&5;{IF^!$mXIRGcn8Q zmd8CUI_5ln*Y;iG+2cQ{3El6Nn>v;1LasAOPTfg$t=6j0wVnmX?EYu13tehes%72& z+x9V@I$Y0UT&~x3ymG>=-?{FGJ#|9Y?b=qy7=6FnPx{sn|DaXP^Vqp=*;?Z{^D_F& z4X3YKYigb4ep@SLj8Emu_9;tkRr=fCwOrMF(dR5rb*df9Z}Gk2g^6RCZBl1`@W9lA zsUQFPI(6!q`&YI;;|pgSPM7xZyX9m(m;UFkxZN2K->Qpsz`fS*aJa;=|2ZRkc;UwV zb$ibKPMpi{hU*pAI{x8zH}|T3zVF%J`HYV*bIJYwXRz(X(9izHy~cukM&fc0&->(j zuWmTh*p#nDXKr`aA+FW@?LEu8$GdO7R{r6WFVAb8&+Dcyo|k_3Tln1Yz}V?LFmb}~ zo^ihe8h`lNa>wy!%>5gWU3^!3_EXCt37k zzUagGYAqgL-;UcdU;BTrg`3qi{ORGA#l@EIow(&*SwFhy#m(xTDod;-J7<8IXZ$oK z-ilQY_j1JHcFO^WWA-|J;C*X5v46EsqU)aO{XCrS$m=J4_iyd_v6;Qzdw=)#J1!-Rix+lStK?Xmsx-ssVhrzpp8e&W7!6l~aQZA(59Tk?`##3rBVc=ekP zUET6K_Q>9O*0Ku^d}1h%gTHO=W`FXv=8TuejZC>>a!B$^UDnC=t3Gz*)yKy&kIVBq zFDB;Uf@`0=*?D&3k^3g5TKc&duZx`fj^nrVSGVn46Htvob%f|%efCaqv=dMJC~+%e zUquf8%T+lwiPR$O^W1-b$N9>K*sqIvj%96abKlW-{btv9&>0K3uB7+(RntjrXy&*z zqVYfVqG#VVB*)nOPj2{G&r{e~alFP2CtLmDep9pD^3*(^ylpt%);-nkn5m;GF8$O^sjb#FZO4ZP zmW}PN?)v?)?9{7&@P$`BYj6&7>)Yd_ns!_CuEonIu}>Xcb#7|bWA~_e$47I~cU`-7 z&$GYRzj1%x-gv*Y74JH0D5t?al*0%o(Xsi4a2c|Lt5_UGIo#2Sw^{9*U)h|E*XUfB zzBwIYXI*ebGY|an_47JCPjsw>`w+L()^RO!oEzh*`zE*S#`>`7J^qr<@;sMcd(L~- zmO8<<+x^;Y{;jgp9$wD8>)`-reJ2+DVY$JXvvRlAnK#|*zBP=^`H72EEcCHqJagQ2 z-Z@yOn4`-0{`=I%j3MN5#3H;a;!%#EuW^oLJ|xi2QtBx%a0% zKK@MlGdTC1dpL9c|2od!y#D^Prq_J$ze$Z_f1d~Oef+)p8KP&CV)pNRTKuuy&lJgc z-bI&nFyDQ?vEIbxS;R9;ac+MSzN9~U*QX8o z!~bH(o~Zq5_7*tZ`i|YO)_F$>`_ZvSYi~;|al_ebyXPIQ_}JWePmK6%|GWRQ zHqZ6hzVJiv2X^IfKYfB<8Z%hM9B<+wo9oJu8&g$&;ub@#*6+oQ59?WR${9Z~TCv*q z_FzEbrxvI)yy;gad>RZYya;A2Zj>AhY<$Z6n;SMR9@)aMwi%!L(zah*O#4l?^}AnQ zS1s!?hF5N|><%_3Z;*WK(!XPJ2x1uT-~Nn`?aecqlN^5dm7`Sutu?PptmIPTt6Zu% zRL1z;9E-dx`4qXC@~Vk}j9g3?{amtHy4Yh^?)UoDf4A@aaq`hKkL`T+H$LHZor99Q zmj5O1rQf`lF|mk0m-1lSoVH5U-~W|*fz~uO)D7sX ze$d)MYY(z@JaNAnx7JWDxZ`i_t$mo&t<94IZhgcys-w&r%I|vY+DdCNt|mmMuIjaYiQ2clxK+MPEAVQrL~};(>49HLnLR{N{+^WT|<* zTh3!_`Se}O!+vzJH~+hIsso1qr3NTJ#_pR7UNy*7LwwW^mt6Bc>XDoKP0e#^ox5h~ zn&y++_1PBN9b4kQYppZ)mF>Q3rPb})ZToF)(|T}g$MwH;U!DJfvn|IvYiaGd_2t%^ z-`^#9_4c`Tw?=K5`Cj_wbklMUSZ9HUS4~}ebH0Zc#&0-To%7|qFFY^Y?l1UVpBo;V zaKb;gJ+GUyyzscoM`wU%499!^H*miT8je@zd&3t?9$Wdij}3c`b0To~#qZy6b1^LU z>$ASh^SaJCVC3e7%K>BCbG?`Eg_kwYyW7JJ>l|?PW4q1;fAGJH7uNaR$2i~TEE#<1 z=7Y`iit8;mEPXg&IAWdE#i!r@d@&rj^VDO&kin4$PmP{u;^lq$erEVt^R_+TtM6=% zthVSlqgyUmoNM@D>EL){Bfb~^v9Db@TJgf-gEMzI-EhRUd$#+3|L%S`VmMpHq5X$& zg0R!Ujplia*;=dAS&_k5V2i{1a^`m~;*-goSJCit|Y!ykDVu5imUX5F42J^gLx{?qqU|KTGJckJ3KCY)4KoU3Azp=kfc-{o1BH@ov9y!gs&?wtucYnY~f_GIq9w6UM)LaNF+V zjKKgNv+uJfcmJPOd%oM^iND^0ZxU0OC0M1rFStgy$o#I}kz*X&;;Nn#mK@x*IAGZ* z#&^u-?{hI%i>>h8!HV0*7}4+kArEE@&IBjw`(cVhg%=xd>}AJ1#g@UWvbX%;W5pug zz0CI(L$}>}uy)45+L!Yk`QT<_?P7F~g|)%r``S2u%YWN26G)aC0riJRJprGQjl6tsV`xuJJimYLT8Zl#^+~JRgy%SW@x(oS;{R}o z#~s~g-Nl#&x!?Ei*mWV|Z6EW&qhlUwLh(CwpHnMx{ipb;btBh_Trb+Z@v&2#sruD^ zt8cw!j8ju{J+4@emRQvG+;{D7`jNH1=hksfeUN(H!H3WK;7@YU1^f^W+PSUq4d~oJ^y)0@wtabMuJ$kQ-4Wi)(^1E zj9Y@-i-3na!A%T2X*f=g8^>!-jQCi_iV5$^7+=QriFe&`-^{~fhdVZx?LEC$xN7$x z(|f2UJUOx9yt_BqJxR^QhgZC6vkphzws7k@hxR>rd2#K^?R?^9y=|Ote2iIpuD#{| z#X8zT>ldT#j-JrE0=mW{Hkyd{t2q4VB8jVW7)_)~C9xl)_sZ`? zNB_zG(s3#$J@!0@Jo}{fW8|C@bL~mo?K`zUeRqw=9#{Qe_@w217uT9#>PG96zPPo+ zdp_q#{n?{=3)x)vsR53LsGP-duy6E7&Sm-0UAKlDEp%%4e&neBs+0X@R9)($Z}$Ef zwQrxt#8u5TpVu9&Rk_q5uis~lUAt=Tb5G1=S){zx?;-qCbQES-ySu=V|uV=M3LheqKXg z+ZeC7&dIfdu@0^~x)yz$XZB#sH6`)v;q&)(%X{g%*Za@+RkRQBXMbPEPL67n-y?fa zoAcuEJTbf%nKMRH-nO6T>z=W-Th5`^y64QjE$3Ew`@U8Fb8qsT`=;-!&dI$@_sOd7 z^?i>Wy|;36FZNjR?17zJYS(@5jra5Yde`;*zGrWL@I*#5ThFcCR%~I5*fM90e{he^ z*>!_GJO&e0&4p2fp}NMzgM(x{IfJ!?nW%4HFxTxrKI|LcWu8%a!jGN9{KATjFN0~p zo{BjmwdT8uYYraHcNH}keg&8Mz-R54(TDbCp4hhAUpW3+I|mGJoi_f{2L$8mJDt&T zH4@v0`hdId_^Q{qzkgc$QiJ?&kLsO1{M7@EZTDl??aMQ~=XU0r3wRo1b`Sz{z`#;XANz9XD~u)>}j%Tw+qLrBYdyd(t+WPn+HC% ziL+gta^;FsZhlxC@x>i?Z1ct8pHEKw@1vg6?emcSTe|4sy*mfJwPLP=IBCP!J-04v zEm*P2i^kje*nV-0uAA7_ZplTjwbonOD(gPvYd^OCyPx^>v%bW&M*A^Z|Gj#RA8<4{ zkM~LcudlS<^?&y+E%-d++k2O8D*cz=dPak7UDr0(kWMUp);g>7-PU_=y*U1*3n#Di zPxA6R&hyMK&-Er|M#pNO(SwOQS}{6o{vTjHH(YD}zJv9Qh>AL8(v2`vQtTo@N)w%P#&cw^l*t#(5w%>ZMW52dV zpCyjDpUur23=o{PIYVK*!bZVa!Ft@&{X5ds`Fze-IxxC$^xNN#Xt=G(`Z-=dubVpg zEokYwt<&n+UUFD3omlIx<#@DSo&~lRY+cxS(tf7~I_t8O_*wa&+PEbl~{>TrZlgk7&Qr zc3bOJ%+_aRZ(UfLZ)vCKz0qrVR=2fWY+EO`KI>fVm7G12&zc%Kdi@r&Z7*|ct}po& zYpoU^x@)ba38UZICXE=~SemV4woQ4`dz0&$sui7ga$E0Z-FsgeG3Owyc*P}m#;)J% zkNe=dPhLLm&2>oQC8p=mbWd#G%XO~~9w5&;a5P`#H)intzA!`8Js2UFVquO8pOnAX z!6bues;=hp7dFxwJOfU`7me6!{q{+Gj2E7&_@A&CI;~<_&wb9@Klo6(t~FeLj}VO) zY*=;r@OK2kqf6ISU1EY`gICum-^%IO(REo1FCPqSO*b_Qn+umaE_o9JJ{Nv&438$f zF}vpEHeRQe>Jk4IOW%R7HQLNIW)F|naVsu;igMf+MgLVy{OX@NzUTgJqwb}~_V=~= zxa8M$TzwV28T0gc%SJjsdZcjGb zjS*cVG0$;xjnQeJF|%I0q+*B1T%4%R#hP#U)8RfV-r6oaDf5HtiP0MVbaAnI7A8K8 z_1bzQe)6uEQ+Mz2)jT{iTzX=x;f9Z1^~9Ukx;5F|nFM zF{!~wJX**ct?{U4`#WxQn%+ly$5(qD9VvA^s&?YEPucrDI5|FtTc=8XzpmugIV*2! zp14!*AK1bfWUPI@)7#EoFM40jamEv)nze^(W4AB5CU)i?>vhceR9w%WvC%bCn{!JH z^`+NlPipk>!I`Lj&XxUoF1z1TpEou798+&z2XU!U=TUy23${L&d0+6w?^wOB%IWi* z_ao<0<2s-GJNUJD554|AckQ3op?zIvG;GyhuT8P+;kcZS-($|dV{?wGdB0|#Q}46h z3!T?vy<|PVCmL4>RdROx4gNd~-z3b_7-6!8Ya>bJWFFMqhuYR9?K0JWA0{8yW zgQwqzLrBjbJ^|gh&dc8;hnpam(Z|I-EPMQKgu(d+n{>pR?C`LPv`CmZ}-c)Qkp=edvVgZG=bZ|319;WR5=oF+Eeo2#t3o_V2O z+s$#pslt6y-~8#}PKh<=DqqjT$HtfSJ-+j{iYeY#zwg}j;C;mv_b4CSFmdp|I#`=y zejVdWE!J;`p6x~Jjo#a1Yr4vjhPv`Q=kx#Z?U?dg_iYVW`K80w{_mRao88a%TEA@# zH+7=vwytZvw>99_T=ReZ`gvSG-z%*ce{|oa&pPfubT11g-aSxkZzJzr@;}Gu!RWr$ zc^%W5ZFJw!VEs(6f7iLSVSE*b<~zD?>%crCjP@+ec4|ZqUV84sm;cZA`5V#ux1iC7 z9Y;Ou#nyk(RnLK5aWGinr^cL@?Sb>S{-(z0zN==Q2Oe!#T5a~U7L3m|N`I}nbX~@+ z%jg!XFs1yjiU#*ZEL&z9I!Os)^?*C zOLHy1N7rXAZMZdDu*t8mSmQPB>#EoJezv!@-_m3AOs_|4zt)CZYi-RI-IqG}Tm!## z-22(zV~$Ae#wKjH+W_#)! zZTDdEd=FDTwBW|=qwik&a5UV?PY*D9aD4P6p6hvDebD}CCZf&>DK{|2e(eJ6}JAU+W1HJaofqx~?uZ=mIGMu-$p+Vh zpV7RKc%ZU*gfr?r#>Vft&OAJ10 zYVAC8f?WgOKRMtZ#a}w#9A#>44zqB2)!%;bI(y3AbDx7bQFEXbgHH#0^}M;((T%CY zd6ZwgDx++y?}Hjoo7Ul=zw*D>#W}-q55H{Q+T1n!m=E`UnG@4IHN6YGHhZ^Cyg2hd z%-c8rtypr_!QNUE6Fc=>^VqUijhxp{3UKa`@TL{Mwlg{^! z@Yz3gxIc2w(O5Nl-1jEmlX7ob@pGR{9(8h`WbC@KW!^FD({|lQwcauRWF9P0xnPaK z8_e4`c4Lp=ii1hKuk4d=45Rm`>Ilztoyil9F@}mRENz;7mD3~hUmoTIS3G)eALaC zf3SX@;f*dleF8D+DIDwh-M5S`oZjO%BmK{gqmN=u??k_*eu%QTsAEgd`C?Z;ik&`JeXM)c%%u_I>mJtquVbC#UikFQo!>d>tG^r5 zhmUq!x$qFv$ET-PUw`!5>vzJ$JK(Ex+Z@FD{`k>yPmN={d5oj$-u7@G8sSlTuf&^U z>F>$Q|Ms1H^DNdHg|LCn6n9Y^Etu=nPb{MYrAkz?Q5Qjm~c$^#53W;F0N_E zGw&L`N9z4N-a2revoJpg2N#ZxJ!;N5h$G~=4E~Oh*ZgM1z_p4iW!~#~)|VQ^fes(rT&noe@Tz|t%>#$~g%@7);*Z%&F~#*B zEf@~g`YQZza`b$!IOno0?pbriAG>R|MoaAQ+Kb=DHrlW4;=eyMU2DAix1OyblkXZI zT5sv3vT0nJZ|s%#kt19G*7N*sv-RLS+q-|;+0OtIkKUTRns;q!ukszuR{s}p$HT`2 z=Yr8caeCv>VClk*=*s?0=hA0iG-drZG&-#`T%T9;T0J+MXMoXnTj!0g>t}jex^5iuh)K-*S7mv->v<|zqDHFs`iU5zJ9h> zacH|+>rG5-J)#MN9Y*IBE`-|){t8wzzT)qW`+EM5Vd=@Gull#2OH0*rzw4Rc|HN~^ z(ut*mMg#8Wd|UgqA062GZ?s1}|I~OBm{byO!*m+jCeHxuJ_QbVsG}_o}{EG&BYqmZI|4wtC zPqg6HVdt6P(lcl8I+s(Y^6;Vi%3iu>{K{dCCTh*sv0fiLn(zne$n zMZp~)V-_p_dTt<|EtCLcXkbL+I4w{0|B?PtAMzv0{(u=U&4jnQ+7BexI7E)zS-;@or3eY)=7+@HCRbC2cT-uGqSleu@}@B6a+)>owgvj$I;Um9}f2NOJT z$ou->mFT+uZkw@;zqAP#eK8<-!ZuzlEKkgb}BH6IN9KuX5_QVF;u?8oO zzPmAB)NNd7kn+9SbDGZ z+=JO0i_<@h9{f`u@Rfh-zV1ut0rGo8`QB-s8}|27os)TbBzhbjr3uSMo%C9J9@}5X z^lCLuUFPZ~ThFbU`QC57(@P&ne0t3ElkN|z*P|{qx{vfab=})0_sg++WBk+iqTTA; zsDXxC>$*43ccwM(`thaLrcU?$ejfPb#r~I3{J`cGYA)@z_c+f9ADuY-#C*TJVpHe7 z_nMoK?n~Wu-+iBd9kclseV<>o;AxusY0gGGkZfqT-1qVK{a@Tr&6oZw{;B+ows%eG z!LG46syut(cw?*Wf1L}H-Lc@Y#A;qKaC@=AkxBbqoSoN|2iA+7v132tRkP!T4~cdB z2S0fE6X#JJUE*&5e&;{B_4NFAhKZj{aM;1J>EPS*5&dWKpjhOF_){Cr!DXeiW=X0gZWaaAX_)?OwT z9fkvc9kU;KeT>$l^GQAT(9w3tQ_szLOuZe8otPZSKY2b6+ta^)J#xMktG(8U?Z5DN zYJlGBYuzvL8PBn6pZp)^mHodP>$Bm{=Xy=~yj0%!zP0t|lYNNm&$&N)`Rr1E$JLzc zfcCIm*A~@iJLkqR*8_6A_IV|LpXVcnbJ39)uXSCmy61XRe$Gcn&pEfTb?mI|)A@`o z`M((VHGj`vYx#aMdT-yyxM%77G}b(8)!<%-AG_~Yx%WAz&XIj9M|RarY>&$2-sbz; z^L~4@VaKSJVpq+q|1uUnh^Cu+b?}A8?H?@Bn5Fg+rU3&9kARQrd~`Hc;#`zxAMwIJ zjC}+b%}71rtmoMKz4{tU#@AReIMMjg_)?g$u_yZ&cY;ls=Kw=e6Z@$xtco35@a&4S z-!+442g6c7Ilmgg?cQIQzI9z`x7fQ60P9nCVio6g@V#@~6R1ZZzWawWRvp>0XZHg1 z65T(%_b{%DCVTw!LGEp4q-VNfTEkWUMXz=GE$38?&e7Ofa(cZ>=cVq>PcQewxckY} zO;4Inww8S6SgjV_!DWo><5>V@6R_^ zVm_sF+kZ4%*Es8&-+4YaAPu-`z*mKDQZD*!b4b#7*(Whe+Z_$LY?+7qQoXK2t=S{_ z4~|USS=q$ZiLYypEOSQjd5oDC?|2e^mjOaU;TH-y8a#W9M!~NYoGo$Ywl;zZO@#)hv(nfbDh7LGq#?PzaPdv z^tTax0lh&n{@cpmWd63KVU+*;y&ipo>qanM#^AH?F=uT|$TfI=;~9;)bzihw^xx~5 z;Mk$vB4n_bgdZ|k+v zQ_*p)1?#zB{gyP((6(*qyYqX{W%F-FGy2doyrludrw`xzz*kSa#TtBYKfBA`=kW8q ztkGm`_jA40d(ZDWx5oQ;=67Oc_w&HfT+w)WpU-z7{I@yZPvGzNaroaXe>?SWlfRoD zz2ls=ZSgD=WmXGBmYgDfB$;Tm7Dio_I`in-*)~D949-rJgdFl&%C$1 zFVd8w$Nn^;pMDt=Ew}Yw>994IZhSOh>9noY<~O6at~(m==~_h>%V&*{~2{J%sp|9x+X@)UG|CZYwNYv(F+nCE;u_U-<0?i#RT7K3^sk*e_U_Pw`&R`gS!_Vr%tbD-&qHvTL->>6S{qs zuit(aKEHc`&mLj-4tsv`+|RUrTj!ykMtw@hcaP*A<@7(^tJdjtR-F5#s@1mXpT1kG z=c6a=qx(5>^X#vC!rD{4-RbwHC+yx+`>A)N)~BwkUXr>mzOQWb!MCsa6~`cPj@ z-MTkh2PQ9?ZfcNwbYJ)8?zi2K<6~`(AievKV{r|N$p~klIsCz@)i!<4yzJaJFMdN@ z!?EdE;lz{=z4#niGk$R>$3F2nU&Re)lREG~J(qs_$?N1ffp9qDjha^y9|eyjK8ZTa zw+39c=93gNdFGsMTi2PGC*O6i!>y@Ccs60W=G&^y)`^F!1K)|OBaS_@W^^w8!y$IP z#)ZeeV}6*!Z+5=4*_vm)>y3^(vAgc#OUW0{X$3N@VP^AARwtL&eSTAmUgm~?R&QXVYVQkFp zbG&sBYDi}ppY@)xkKeUY&-zcr;#Y3_Yai`jHfzPM7Y#}I#Bg47e!Wi59>320_}t&K zAGRK~-!taF$2z*7$E6?E`Nwx@xtCVzXK#7u#97BBzhmZo z&6<%~oZ~*v-ZQ?=OI_{J8tJzA-)HSl-MqHZerrE+`}OSKXdZnvzB%8#-agN=UwPUm zF&XpPIG^=;x^~W0Bj@w6*NZLh@fY!L@5Qg`viG-t`!DB`^G%+{_1W8Y=5-uxmUYEe z4cYWrW{;Jx`s=gS`{}byEn@Xq%;)l)<6I+D&oz_hYew%Ke~*3-s-Di>qt7ul7&Fgx zC$`T~*C@U2LIe5a~L#urYZy2Y5 zRlql35p4L3cfd33bJrt|oW!zbesWTmxY&OhukZCW?z3&-zRP~NL*d8TUmRjEqws6( z&&auzeQ>U{-^3ex8h`d&wV40$2nMe_;q=arrn~E58@sT7=cqSe->u_%t{$Q6>OW?z zSml86=^NJAJ;n4EiA%5X-Pk?V>2;3o>prP%kgl4tMeW@xfn=_Iq<9=0Kbmv(A z-F#WatJbzKZu^-p-VwgB zwYSlO%XWCp@Rr2Eqk7Fe$8e_bnZu(t*C~GV8~%02YiQf!vu>@n?Bb1QZM!+@#GG+7UgEa~EFBb^wcq%x=UOk7zME%uD_`2F^xyW^ zJkJ74Z;h{NS`T*I%(wk9kIw7ZdY)I>Z$H;t+OGa@-^$@W4UQ4k5$0&zu`rgfWaHBt zpEV{ejAk5d91qTZ!`kXG!L)q{^JZS7YBaVyc+^-{m=j-NDB)o8IH#2lZu9x!Yy3Fl zo9!9%xemV6ck@)M-!I;)#(#V8Ao<}a2@Y?&u^^fJmo5exE%jW*HUS| zt?lNS-sr%4v=(eVcl5T>%A)zAn_1hnj_X=SgNv@Fv40PG=YIOX$VI17J<8K|9bK07)G}`vH9et1(jji2I zj`TtN))LQizUZmsw4U3~@Jicl?QrY6qbnxm$$c;*ahtO<4Ya*L^D(O{2K>;JFvf7Q9uXxc`me z>a_%qZJ%)4&I5bx{LUMjuvnc#*{|>TY3*|hPSfwes1{i4f$4~U9>kW7JnrGrT))(H z(N&}EX54x%b8EEHU0a8p-)dIfhd$de)_+TbO^o#Aie1{V^xl4ESib>1+AeuVzl{#; zc-P1?!bcCj;}gqx?y=|odE0y+jvnl1ck4bq_u}@W2Xpj2K6r0F z7@c?FjMRGbjV)NFMq#1O-`{;R{%L&l#6@5z)iA#D_m{w32YX>N<~p{6(ZG89Fc!RQ z!i^OJMog^mV%Elr@+pRO)ghK#<{L{US9Zq<$9|~`zhPi7HFfJi0|uAZTzFep+y0Hm zHCIggx)0bfu2cTh1Jfr?<8$p;#Z0fUY?YJmqvpG;?om1>{S0yRE$Lr0+LnH1`kmEN zjc?hmo=ZAz^>^Ffw!}pb*6%r$PtW|eHq3R0xah;0r;kjZM+|v=oIdj9TK2rQJ=V|f zINxiouYJAbdaLU*W6#THKQZUJs_T306Q9Oh%ac26U#opjIQNF!BWAqrIhFHV>)c$6 zd({4Jx$d=a7uf4QtFgHZaTM5exNdT-2RGlr{aKucWB+phj*hDwaXFj2$sB#Qu>e>I z{-)OONXZMQ#CrIl_Q$9AV5uIh4^z*_j{TUou6x_Vr_~rgrj~SF#hUXJ-#Hv;ou}p=!+8#-uk#a++We~R z=2cG&`2X0%_3CxGFVK2=gge$fNcxAbMtY9!SLkWFmim&_r*J;%s}jq4_N8y6$5|t_ zx`%OI?ccVkqxiN{3qSSgwKVpgvu+=2)wH}5`M`%S!i;AmdEciuI44QK81 z9~DlMjZa?3bk8@uC zcJa+K%9k&%pYd@nkM*Sq=Y3tTA+Ia@rC#j+C1Zbfr#9<(efi8}Y@cGV^-*ho=8vCs z>iD|l7}9apLL4I`GtA=rh^;~PT(rhaxcqMtp7vQa` z0q&^1jeRu`aM|0@4*f)#_VtAn`4nS%)%9}3%2 z&wgpXih)b4dicBUU|H7fBhQ?p_X@5J4>>u5p{w3EbL+bY!#ft7PF~@9Th$nQ_W{BFj8#)P=^K=P;{MX3=)1D?H|mj={;NK#?d_8$oH+GF-H+*9-Cv!) zZLO)5gZw@eTXu1aWt-d|=jj(c`n$=MKYc0vaC3RoYP)n^>}3=0NKagSsr@I%93bo4 z=5_2nR&Q=QeR<}Ov15)7oZR9eDkpuscmenW_5JDdD|Y(-@-ZKtfOR+n&sl#Q(rw!g z-@#hE$I)=f8N0X?$LslC)hr%mco*{ERh+L;oQ*k{=)U1|q77@$j*IX6(R>pzmoAL< z3-^>-tn++=?9Ep(AKof9YOXo{KFn#Ib?o=J^jqb5O^o@s$`^Nc*5UYur-OfM4i2B= z;RY+Gc|Y-ZJ@@baZSL@Q^TS2Lc{<0>tkit*n~p2)5?k@2@)4hTxYKa1bzZ}(#`ZQg zulvc*7MCnO7@ipI)|@Og&+|dp;GE%)6GNWu@XJq*`Hh#pZHvS1-*n!7^jfc%maDj< z*~*Wtwc2RJ(uK)ypMM8>X}(+Ajefjs-^}%lZ~OKC_cG`Ap!->1aQ6KFEb0fm274ZC zT{v*{B)dNl&R@RZ*x!#}!>T_=W8q-i#=pX;H8&2f81SMnrRU@iE-l}znG?GXYVGyw zT)2<8!aU70WE_5C)f5*|ILMsD;ytJ%+~qxu4;zaOwgWrDdpt4P=bG!`Xu0}LXP(vd zaqK)_S(<7;V|jk#**dT7Xs-R7uj)h#juuO-59_=Yt2K3R4f)c6OH=*rdY=7N4%)Bv zSTM-ox!}AS#TOQS3Es*Ye30LJ&j0(HwY6H;J+_DLyEWjM^PFdCyO$>1wvL(KcUFv_ z3zY_}yvOsUtsV1w&emb`?5Xo)!&gW2;OMrj!3RHKGvP7eDdQLAmp+?1(ricTwWcdw zSGw%%p2JqGjLocqFcKj1WBEX9D+8nc1LR-W-! zVI1MG6$6&)xUD|~%kf^0W+82%_t^HvfT{f@KFeMj8=F<`Px|khU(ed2`|_ObJge(x zaIO7D^KH!)%@-YaX}QvUrTIGVuG#wT>_I(h`T1UJ#3x3%sUMBF*bK7Esy_y>NuzSBlb>$?6f zT;rg!`Pp9TmkrFLRZrxVD#? z=|jN%-HXIVAETpu^exmXAHB!)Jn381*QC$!`0Sn1|D5qX?wQBh`fkP3&-GeyS!YyF z=RR*=qw?ENv88{s{_FVIGTyN-Jt^19$93-cJh0aLnmRe@rK?8SxQ@He?rS>Nb{%~k z?>yJLulxHR@SMN$0q_Uhi`Kn^`DnJ-72|!l&t@I{_QZzoxJPNh;x))EpK5s2eVhH- z{{3ivX1u;CV!|8Q_dRc=SoXV)=Feh- zW9zx`T6nbP-|#7>?2O^ozqPwrA& zXW{b74ab=|{Hf+}v+b8Q9PU;7f$8zXnVM^bUlq3s{!fh^i=Q0)ojY8vYR8BF???KM z^eL)AZ!$df;j0sSeBJX9Tm4Y>r>A1B-m1?@z0~wo_`AOvo8wO}MDLWi8mT!wSJ!4e z`Cs@SF|Yle>bi&A{b71X>$dLUqKmjr=TyFX&eNmfcYb=)#CWt0%$&H6Q4Te%y|_27 zeRqGWUYQ*1eNK#RSFG0A=j@@^rZ{?T`&DD*sux$UoxZ%|=*25eufKEsz9g>3j!_L_ zXRj6WW_#o%|DTK(Z}HemKKP0{JdY-M&hO+ueBn7X#`n}QA9b`>V&l7W*zex+_Uk?1 ze6v5CO>$z(h*rwH*LU4xe|=voC-E8YxV#R=mvhW}oxOYXxwO{YG4J*7_vhZ*zLS@8 z`8nsU&eyj7%;dFb%;zL~z5iY3Z$0C^$N3D~zV}Ie#yWH@IiKhGoaQr<>q?#5`K?0kOSt#=zIE=SoTqHM7j=Hu-S;rv6BWyS$Z@`ZW!|-wd*;_Y zwfFLU)cbmV&L`{ry{|ow-&o>ci|DrapSthhj=~pLt;Q+Vn}b`7r(CCPLC1W)tsP&z^3t!vS8l?laYU z(uczN(QDEJme1O5jp{!c**86FkMzLg_2|AiIj*IA)p*7^_v*D<$U;9jt z-m$X5L5K%vU6;5AS3phi22<an^OM%M+@otec`9m$pVIi?uVS0H?f;lZ@9i;~EpZp; z_QL1E>201*9N*G><%hQ;?%2QQ5BIYsJx9B(TGo2aS8m-`^~8-f*IDy$qRJB|im!9U zf1ViCQocFT556_N8O;GJPCPK$Exf7^al`P!(u5aRJo<0)8JkmvS6E|)8)6Gqxo6`MhouefV)oYifi5WTRpgAqA6!Y>y5@6 z+w=eS#qVAY+<)-2HDU02+0qj*=KG?B2?vJ<_a4}c`#Zl2oZkZW|M^?>*k4+0 zM(;7t@3xMc_2{|Fe%qq|qN!3VYuCM=5iV_1I<9ItUcWc29BZ=do9BelTyNdi^`+fb z4p`%fx4vHg58(pqzUZ^)xZX2!J^zb+KhIlhKNH;ce(o2&_tJr*^Hy#&UyU6{JlE22 z=*C~4cK<$dt2Y_nzz>5z8Bp$ak;O4J=Q(^d4JWKdwcG`o)f27-RE1s z1qWak7BB{gRxC|ecJhhqBlGS1ZjP24zvhLHvTkix|G%$v;EL^0-+yCHj%*`?;;NzV zS*q3pV-tJf>cZZ{wSD7x_7=8o+%IjI++I6&;r|bN_XA_!{emh>z1N4*Dj#dwr%+_r1}oh`oV>#pZ{v9Df_edNbh*CCy6dP90f`MG|fcxKYb&0!PU9uCvQh>^K|0is4cA6cJg#k<8Ozx*|!{c zQ|#7bnLD=n0P&>uMHe>5TDHdW;$MsJ1j|RyRgEXsXOGyV@6u<)=6v(D-dA(t6>APQ z{lag@@Z{=Gsut^T*TZqspG=>_IjtTC-n_YU?HT^Nd!6)4(rP(Z?CPP?5B1o4SktZg zoj?7T*6#c84Udog?MT1%=4;!fS4a=pwO+J}rG>DkG*xOTmmb&oyRPQl&nkyJ^`~8b z^}2c;Rf8PsLGFju2Y3H_dRh8q_H*CtKG^5r-1fEK{d4693}}Co#OlInN*SYOmonvhP*rd(HDB_mvZQ z@GQNLa%(Tf&BdH^K6(0oiLdiBPZLdca{AoG=RD)JPro-4x7OI!bHP(Hb$Z;-0w|_y zIewip@$%(d`?XH|BX;(|zI+qk=Q?qJUFUDOM*Xd2{Z*YW{MX-UYMmPXoU&fN|<)TU+)t>KG(64vp(;Y>(An`pKDp?5wCsDdaiAH zjpS0t<6HyTANxN#`aZC7uj~GUs}q;Ty{Y4U?_h7=uVSBjOy47PpX>XcV){O%eC9d0 z&sFW*=fnbhuv7=zV91f*k;YO@`GE**Zk=H_ z@>I|`)7ZSziiTkyVpF>&$lc8SmBC^4w)LQy3oXg=|n6q!R2eG4FD5LFm5a z-!^egTnl4{-yOkbKsTz3@{^nF?ojv*7HEvn@bLVY|VIS!Qq-ScC9aY zYqZ)NiZxg5|I0VO;Y^G*-}76}$EMoSe#u26wiYaHx$;hKe5tk8uiEeVZRex+=69dT zt>Zte4Ws`GPlBn1^%=pQjk#OzO-~X%*x0`C`@-VsU*g+i`aAWN!l&$UaOA|pNqXPgFJBYtbW(SP%Q0_*?%MZe9ny`vAu=5uj;+oT7dXMFuz(EInF%O?%^-=%p4 z1O9$II8As8O!YW;UB+U^=U8%s>k{KpcJj(^O(M9jv77K7814t0MtyK$;xbn4jqSiQ z|L4C&yUmCun>iY+=ePcgt>e&h(QhXQjrZucdRA9ju4_f-%^qH((Y8)Y-QF|L{7R>7 zZCCZsky*>udD50+TRJi4_RxNhZtS=(@1N_Q>3g{EpSqVneEH5+bl!=ddwSjTD`#-P z;0bU*`-p9O#wV88>!a_2Cl2npWAYuh#!u82mMVLVi8ThZ=6n3af}Mh&ob!p-j$b}$ zvyI;2__e=uUuhs<8|YC@P5UE?{(~XYVXRcs1ghvm-}3F>7&kE3WxBc*4XHGrZxRH@ydCy^fvpHs5_l z=DQE6ob)X@Z$|Yn>T|sBaO>)c=ywi>t$fwCUHP+D*=m0EQ|hl`C#MhDYrn1~j$OHr z*va2{#Qb#ZzVYrCt#N$jAA9$oy@&eP>^Is+*H@2v*P;hbpX@%>vDS@pF4fCcP4~{k z_ncmunrnT>;OqMI!`&y(o?X*DyZ2H)^>_^$(?>IU?$Pz`9=>DLd!Kn;-yU<$Q%kiw z=fBBZ+(tN&=Q)J~$@ui|bvTx`g+DpmN%1bvI!_H2PNwUeyn4Tqm$CNndG~u+_M&*$6cL$Tz3?BzUt*7f;Y=c`ygm%LxZ`SY1txeoYRml*b_xXQskIm}o6 z%Wd2KmpS)=T_g9Jxd-6q{$T!X^K`x+m0vl& zhv>dSz1*uh*Y`5C*u(WXFE-z=e9!XzPxnU7qiUTw@m^o|x5Vs`z4!XZx$p1JF-C|k z`&y@Qi+sT(jYouO*pIbvh38YR?a_PlT{PjB;GN(U;T*7z&qT2xl5QI)=T$sJ0nzJ~3;rRXg)9Vm|QhH*x5+(rOPz2dfIl z3(xl)+z&oiY>o0Y-f!IQ9>ej*{@o*_XQ9T-pT6gs{^i)Fzrof$3>xjs%bs3{JjJ)) zb9yu4yDzHIHG3@I^j-L_!?oRWJ$?Ut9Ub`eoAjDD$EUtjw$qIjQJ4w zjBpy{awejXn9X;@ie&&dtwe^jto;IrDbn=ekC8U;BuMyK`(f z!^7ttE-=3DMsbqi0{2+Fr=L>^S4rK?N48!3sD0LWn-^_9^wxb3FB*RIWBf+%wSHUs z>RF!XypOT=Men7q_-D=oepq~Q&BX;T|M<*74`kZP1~W6+-a`+>(d_^b1TM;p%xYc8y}@#y~k-#tIrkn83= z|Ep(udHxq|m&1ClG+E89@uKtQ{{ptg+nR9l^9--_0LuZ>T!T@O83dTz#tw!5_6 zOY`mj2N>J_|9TaJp4xfb`-8`Z`zw5Aj8`MvAXu%j7#L*qUTSP@cK#3GXu)W%d)^xC z%GuhkpYyGl)_Bo!*$ZvewjPtOxYABr>%C&J)gfILeYX!kC%o;MpAk&4@!03Q@fsMb z@E7;~^Z)wtThC~-ryl3v-+s=B#(Vpv5kEBF{C~fB-dDd9JdcodzJD}IFQ9%fTg|c6Yd5AtGgz8}?1||y`a`eCKa8;j)8! zqQiP@O?R|hYrocdt?OR#(p9bNUiRp{s^dIA(`((<`f%^nT5dGi=)2K_&l;_^wA|>q z(urH=9c?&TFLCyz?$(f>da&E6w~ z{@m}433{)}P0rWj!ZBc+`gRsJN5&kjW024jP|Qs zaG;N1K>z) zt2y>(9=IJ_)lrUdd@y~+XHO99|Fqxh)o-+p>t5vaDCuqdomIZO%KrEr<38!lcKfXh z(_6I`OpU5Feb(-qYCe6N=B)2yG+y<6x6i#^_mSQI>DpB_at-sCb&uUY;!7`i$DeE9 zyWQ7Y_su7E^jzt+$4-s(+jDJJ4A=2>V4Ga_SiZ!y|H^Bh?lt>9Q*+;c%rofw<>O!6 zLu|xPPUqr-|IiqJ)^HTzH*6CRGMopt9OP#H#klyL=(^-w+OGH_pzd5RV?Pn0$U-5VB@7Bg_i3PjW98A}oo4Gsu<^jXiSr2aP2Y0vlJ93ZC z%-opJT%&UaM^0|n&^j^OcF%9Ew|v8IhRcL2Jvre}6DR#w*q<23(jS-?UAc+Dr(@~2 zoi|!8Yxq`jQd2hU-yFY*dFHQPWolP1l%6OydZp6`opVrs1CKs+>93k6Pi=au@~hu! z&Rw;L>%J@dx&KNmW9_9Qb<>AoKl9XaJm*S$AK5$WYjhv^u3@YiSW7U$LtD5D57sNI=Fmd+fyM>Ag_SEROjcX6C1e5jwX6@RtX}$c3%Xnes z#?+UM+}J$|Yd0oWk5IMrEN`&?VD_>v-^7;R^QuQ39jnKXzk7kNdXVN2RY!C8E9rfr z`O2?8sp_lmqK|SPWG$GUjlJC~MIWY)j`VTlbUt;czk53MTT}m~55)Jla#WmhdW;sFURHhU_#CUASo~x6xT@p%aD%nad++>ar!P;B-hTRd_2>4f zPlp>ATgB1m>qsA;HF29Oz~Af3zGHr#>$zQck<@}q>BG7)Jcn&shx>s45T62n(mCxj zPg8qu|4(zY+bgE{CDzR|`56Mom^ZTj@Ji;M$T637kE+vL6m#py;j4PYKOEM>ryOkI z-g*v)S3dE6jQDkwU%VcEbAI9IG(L1+^6hv0@Oz#6!7Hlv)^WW@;;aWBuG4mNn0^)} z@y&&{COpr{G*2qNwDvN;S~>8b@re`l9$)jXt=V3&wmGM`TzqJ)8l(4` zem)C){9kItt?lxE|MCp5v|s7IXux%3Ub=94#ys0g4>5g2@cUqI_XZOq`ycxS;mCt; z54Hq5gB9@^ZyH}4e}X+Pzc661XXCn!I~9-p7x;7G%Z)X|NrWp9zAStrjL81rB4I+$ zjU8jFk=Vg?;JZ2+Lki=;TTo+;pD`fUZa=ddt+$`yl};O5Yq;pSt>0QBZXLKZQa|Ur z)}t36EjQY&W3hkgy@{Ezf73bZXu5mUoVbZ??YDJV?)S!q!CS^yc^+iG!`C>Ad->6m zOWSRoS(@7uvd8=Lc@ z*E+|s)@F~ke4YXBTIkBrdC`2O`>y)YohQb=XuMC&_gX8r;@5cYpWN$w58k8hzub$_ zW80s5^p2bRe8uSZJ&5g`iRXUJ{aaX|@Au4QXKY{F26ymXvZrmWqu(lKG+uDc(Qxtc zT{-X#cxiCXiZ}iNJ2{s1&Ca@PCi)nhof+@adVH2lVg*{E1kFNTsYcTeB=3Gc=iqM&v!X5UHGFfc=id_VxQkj z^?LUpt=ZC3tX@Z&ZuKqdap+(0_1ZrA9Q@lyE!(CCo0{L-Pj5$G=N?br875zSpnE`R z$n=lWbzM_)DI-dx_)OC55Ct237vtvEU`_|V)Q{$NIPgo!nFY%UW0So_tu z=do#wR_jJ%!mbdpVTeRTKovJ6On&EQobFBLX^SR99JAH(0 zd!0G4nSYL-{fBy-^e|VyLNDXPeG+wJbKfJawf1wLl-Tr5_xi+C9qLxCCl{~YOy@$4 z6Qll2YkD*Ca&-U2TJ?I*@h9%P@vVRCK2>$LKRxWD-s(%;!_v!EjO^sN$K9HX`_`^U z&)mJS^xMo=udLTRanz=d_PJT_@t&IZ`PjZ`Z8fp;+VUFz;rLZO+4~vc*S(&4?6v0ge)pQ~+k3yg z_TzuAb^O2lcfI}&zsPxsnZL(=kI#DjjlmVk-(%I`^CVl3ClBA+zx?`ak}vzIb#ji4 zn%L#b9<#sejxY7tBlUA`GgfWpe5Q%f;dAo!Wcj9E*;JEUVtw%W_MF#}`O7$QZ@#Xb znl*k~>vf-V9S`?5oLk3_*2{Ih?*-U$FOUtct>Q=j)xC%{_LqAD_eSb>J?9dKJ+=D& zq`hiRtmfpg&f$Ht#;5zC_DxKUIl3*{tnh^A)^5QQl@t8J zd4OYDKNc=go^eNT%hr9FE5CAGzj4jf49X5iZzxTObQlVhj1+QmW_EZ^RYKZFPtvjmvPUP1D>xq=7Zz!^q~D@me2jIp&6;obQL8tj zkD6YpV(%_YmI0+{OL< zb@3a`d%&G&KXE1SCC!19pBmv>q7P?1->oOF5A!N#9s6^H^U=|KPdK1!3>O4fl|7ob zqF$c$m9M#|qx;_c)_G?5*bkRw+Xp`eho=2n1BR!o^&H~)h>4b)I*0RzD}%Gf!o|H8TUb3MdI z&t-m&aJ$Fm=Y6o77bb6P@VfBDT{q7R*#QFEdY^F=w#nJ%UM%OM`(w{dYc?5)26jCG;hon{I{^3uwcauJ`AP=V=c^Q97@gK;Xkgg ze$E#SxAj{z-qvsDIbfdGl`R@CYsaC@M*o$TER7g#H^iR0Pf=(*P%-*wdg!F#RW z{rdlYrT=z3x^Ly_C~Xv+Aiho*tuT_fJaC-xSl0eNUtyZU440OBX};e->pOX9xvlTc z|LcoJt7mrYv;K>X_3@$q9u3&quC>=Z<7A#-a_h|<=9GrD9oA~C1 z-{8E#T*UhvsMUHe`mN@z_4fXHE?B;bmB#B)x-Pn~G~KQ-=W3{|{itTAMu@^GBYvU-qCDb*%N0 zcXVC*Q&(~FCokvmKKlOI_f6do_x<#q=Q~-->HE0n+`}st+uY|_``+$*w=qNf`hAd! zpHXw}^T7^12Lp`l`?<8*iERv}_0fC%Y%q238#@X2Fb5+EyOlp9agD2@2M_L2%<}ho zz8e_-8n+KD=~{fR(74gI;7sg}IT~)Q6I*qIM>UpxFf4OnTGu}L`R-(5JqjO7*DX9> zxqh}6AJ`pTI5^*$ZoW(D-|I0x7w#q&{66s~AMAdxeb-xY&%PnO$N8>l`jhIVs+Rg1 z^)FqkdmHLV->tR!8}(4c(1WG_IW?>W+vh&&^hD~Fl#l;D($n4c^mg=q6|Y{du1V@0 zyC3BGRBPqcJTapY%a$DceNB7Ti2cX0udR=3W3H*WuBMk(@69z?bjzaNvnMH8wunaUIWI z%FFscJBAlMb>MBolbU~RpPr3@D}|#yG2&*$&z3FrUWbe2oW%!cY<||fE_|+!t?h=x zjqjh0^gHxM)PLzuu70QdT6@%f)91M7p=X-&z}J55QLjNgQ}&bJeVOZ?zH4g&%ze<4 zQPVl@=RW7r0{pr@{a@vc{X_dW{iSt|vz{EzY3J2^df4)*|LyaZmP7xmc#qLfq|Z!0 zd-uE1X5BZtCj0MtnpghBsy8S0J_q;Tkf7el`_FK+Rwm1Kq_N%xb z_TT4!&HriM{`-0Pckh2^eU7gE?tlMZ{~h#aZr;zX$>-3Y4?e@^@9KOeY)_u!&pBxS z{7vTbl)wG1omzS=TnE~p*QR|{qpu@6w>mFkb4;!NY-TU=6oZ|3Ucfu}G(&zD2oX^2Id;W3V?)$*RWUbNHe0=8Dx?cHIhkMC7w_Nk>t5|Aq z&#e1}?>RN^y2|T1@e`B#;PI2=8gox058Gw$y<*?Kx&L*}j`?C9Y@s~{4|M)o3wunB z#t*Dpm(BOej3El6l<&eB#7X-l*N3oE?Q!7@)~b2py{??z%XwX2@r{Z0TwLFqy)oO4 zU32TdH?Gq&x{X)aJ9tyE>=S&cxz{^q;&o2oNU&|NXySu+e>Ymst=Q9rF7Q-5~FcfXdNZ!})n&E?^ft}Cvu=lIh{RxdhpVznmM_RSHh zj(Xkhd%KT);|6yReDQ_qwY%?DzI%5+*Sq`i?%%uDAB|Z3Jw1LO<MpI{!q z9K(n28T+z6Tu0S-avc>feHU(~xfB0(T4KwO1{{BnS$jPG+ur=kM~?ZU6Kh`Sa6{!! z4m^-}r#(`)`KIBv%qRJo1oGLV_o*70-(zC-*u2<&b|QO}P5=KI>(+(g+``SpXKi?M zc;V*AtNP;oq6b?C4&V3uZRlg~df^f83+i<=fisaLDk? zUmoVMqx}+R?HBF#_Mzk2X06vXv039)Zu8-arB>w}{deV$J^mj?p6yMJe)l<=ukHU) zHfhB8Di)lk?{5~yN7uEsd;UKbf438Dc;oTEVftY3jK<2~YGci_F03SM+ItCC8iOi! zuq(F4wP4|3J>k@

<=|VA#Yw#~0i;*iksp*bnSD*s^o>8ay^UiDCq2kzo}XN|X??JaHA8t&11qYIz^zt^#fE1h-!pTW{=qyMTFel*{z z_nYT^ztww}{;Owwt@rYLE*h%-uU>Rt>A(2OUTg3{xIVC&u~&`5-x+g>_bVIs_x+pC z%xA5=exm^&J(qLKGrxIm*Z)WFdTv)5@Y03n_nenLjK2ERcDuHIS6Vsfs^0r(#W*dsb2Z!cb`@N=)Tg5 z%O?Fd7!a&AN8`d-Z=dJJSjK5558uLb!c7ay1*>UvoUvfn6xM4@S9?n@E}O941J7Bb zz-RxAircuY=a>C|NPGEK|Bcp*CXAlSsQDTdV_kLYyPCIe|9-UfTk1udjdn{7>h>tT z7matvmQQ}4OZ4FAz!~!#@HKY5{oHTn{>=;SslGpceQ&K8-LL!pyYJ6+Pj}uK`P+*A zd%i1{8ttP7HM`c*lUa)Y~A)~z0!ceRm6bNz)G4go3NWP zleOSrs>V^vzp-0lx6Zr$XKp;GIDMzE>UT}s8aD=mw$C`UaVa=e{?>sLTchn@*54ob zj-*FxwUZCdZmb?`ZS5C({E(gB(p5t#Pxh!*}@pOPp=2=N>)U@48=C z&D^syZhbd4kImtX9_%{){y+0@JdB>FRy1JoOlZLP8FidI<1KvWFlS}Vg*`FfjnRC~ zox#tYyx5XISWhwL0Kt5+*M82$4j1QfuwZk6)H2W5G0oi_ez5(@?>!ceINav1ZRRt{ z%kwbNYqNGucu{ks*unnhW}6=!jy3ibuU^18=6m69*BXCutnMdX=G&)zSFCFP!}Z0R zZw{S$;k)UVyw3UMyRMF*Pb+`dvTxaB?;72+sh(KN5=?$qiy>qzO5>5p@y zhR;d$yPnQLy>i9&KJLp|v!}=7>%DazU7udO*3qrbyltGH`gP)bm=kcV#QSynwL1PY z&-q{3_xYT?vga8)zt3gtdad8({R7|PPhNH5K8JahcE!(mJRBi}?E-|Hk)R z=lggsZw~1FeayeV{vPrg*O(d_ANBX&UgC5<&$y}Q&&0$KH?imMgU=oIUDKK<@xRyGd|~3v7Cd>&vUQa&TDGl>@~4DC-OO0pYOF-+jBkB znAbf%?{R8$ovE4Hk5TW>!}iEI*YS$$YqL1E*Xug>j;{B-j@MeXbdNi=e9pdKQJ?#e z4|8|Xgt=dN?)r(zeQV!`=HA9$bv|Ba%>8e#y;t&n93S`a#1E#>Ydn}h-}^#$E&E`T z^?k8m59!Fl5`~3Sqs}#X%56N-_{Li9sXN%F{aS-%8qe5oob~s4Va2K|yjP>=wHBsh z-Tuac)SnnIq7LFu+|-lJ7*Y6BxyGi0Ly37DgF88g@+r3G&)AQ3VQt&|-AUnY;csyF zjkATX=`lJde&KauvCG%BWZUuX3EujK^a8hU#V_4=dY09{__<%l=Q&^cEB8rdC%+E+ zy6<7#{gwNt?v1opdbGq)E4IInU-5>v(b}&z@u$Ds{V08Dt*z<0j(XSb zQ?Gvc#Wwx+i%+@q`}ow0yMIqjaR6w%-KUES=vejon%gfQ{eRi41s`tVpXk2kBvQj% zM{NGid-=q9z;`e|97?|XK0Hb5#vjl7Hm~CEBwk`vo-XHQNn8gOg9{;g*32N$ROaBVz~QTgKP^lS!P zTWh@falOomwf2im&;7RT=AS!HdT(>f%@yBq)c8EM z4t)HJ=SJUMIxsP#%eIfTpABA`t)2~LO?(|$XNod5rKuybL-U-S~ew;MYf+k<@@$Es%ISTL&&@K?=)LBWv0 zk;yB}CH!4+;JXXEf)5pE9Cu^ZwheX!m#sKq$i{`+t~pq*v0bgjVbt1uM%4gMVei_( zY{HSstJq+!KaO0-@?7sV&a=R+1LyhQJtn3!R%^t5HrN_4dM~;!n(dyqhAVsfX5K#X zo`>{a+x2_Tt?epq`6drNwYAzy{}m1l<_eDLQG6i!@Bch{uXNep=)Kl%=b7Jr{`c*- zn@0=gnP0R~_8@-cSRck09hunkEU+Am+t~u9m;YDG;zhk-4dcjWBzmAi)W5GwG={~jHtTRfR zZQVB-a6e;v^xe{O*Ka_huZ~_kb8EQDktXY$OZ#mN*v|q#^k3yz7alEmY-q=Q)H%jK zw)h_7r|!G%k9|+gceBntH22zdPyV={J4W~UzQ=RlcMb0Ut>aW1)uwsq)R1=Ka_*9to%!N^dbE$pBvA!{NFtVTf-54CKPW-~>t@ncK{XI;_ zTjM3JV>8ZP)`L$UPR@A^moJKXu2XpPAn;s-DC)_d0o2SiKKAY!3B09aFaX z{%q~9zKFQ)hbAYv(R{UTt@mxNo{&9vOs)Hx<-W15QRI$|^|@{lqifgLdY$W@#y6X5 zxF0@!^js^I=RRAS?p5#XpPo9`Zujb3qx(9Y>%G?N+TYh;#jX3pxmP%r^~EVP7jfBJ z)1BPDXOTDBZ`rhlw-9#$4}$HixgYDEylmW;bswA@^3L(yJ=}5dLnmIgy+*%n4oLit z^xTRsj%w$LGh*M^sR74DE;iKwS9!1Du-ZRsa(+7C=PG9FyqTMm`>bJp4V<^I-ok!) z{$jM?i8IefUDq~GD9(`>_`MoaKlaTT9`3N>de3i1ah%~t&9jPk-P~u*^ZX0=f1Z(1 z{j41$Ke^=e5l&X4cv<{s&*>?ev(zyrzHhnjS2D($R#EPkwUOF})W3mijjQ^kW|JCw}G~8~fizYcQ`l=}%|R z6Pw`^h_t5UK&z|nz z`<&H}+vohmu`lP6Ue;^Bi(goFzbD!MS%cS=^LhII z#p^$CC4SHU#rx;I{qJ%feLmN}Th8%qeETxp+AK3n%WCC=m7PoHV( zYX7REdamm|Tw8v{bD%_mr+#~wlGxs*d_}-H}eQ)bn{C(KYz3aZO<~}!kAbYIi+H2W&%*^XvKJ&yD zc8D$acdcayyO3iXVXUxgbS@a757#2k*n&0lt0wiZ5hEXC$F*(z9UDJ(9behw|6&w& zD_`(izVj#i`OtZ9T-p1A3B?fxQ+jlM&Dpncqj2TmR(v;xHSYYxt*TWR`E?W)FJJt% zmoYl=#_i-8lY_y*-i}edTRU)*4({L^6-E*bp)yKibedN<`rdEyBb2^58^Z2I6 zoLKr-b9$S1q?b*9tNHMM9p9Sp#RbZ?`&;JE{`sukm)AP|clGL{0jp=Gzju#MAMfA& zs+!Z&+pj%3clZQ&1PoRj8l8=lE)^Gk3~)`Q*6h&%M2H(5iYYhO!Jn_ZNh0P);`a} ziB|35Q_XFLPo0t6iTP@74VSplcE#29Gd;>D#&L>)Q^wxhvb0}u$IgjPoM(JKIp=WC zpX1ScOIKBWv|Hk`_FT{SmQA`Yqvqvn-BvmG>~rwxAG{$M$C5_OL72Em<$mxAeHpBjn_ z{&Jr2R%{+sD|j?G@0*cppq~Fl!=2xEM#r`8%ZR4xn56}y{YL*qza=g@Zs)K*8t~S1 zyXI5l{aE|?-qCdB_jA6sz4?2e=(eQ+gE5|bpLslRQys#DjqPgAJ>Jg}M?-#SyQ=-Y zO}cMso1+J>oc!*yv|VYs)M}l#HDGDIoul7*#vh%x?C7k?p^kOnvQM3kCyu=2YW{zT zqYoC_qc9a%3mmpa@Cr5b|MY6?XMNFqM+^2`zyEy2S__tzD-D?QvF59q(vG76SB=qw zQ}5q&4|v08Kie9!iSIYg3Wn1d9EU#`P`2ce<2>sQ#(~ipwk?=Xnnmvyzijn)rS%7< z11owT$KQAly!D~~M(@oS-M7ZA$Lcv=Ct;UukkB5RKCOqm)bt~HSy1}ak6#Z zgQug-e&FuG)ek+l>Z%5q9<1N%kDj3M|L^SXH>}6fUsQim`TLn)e}{G3I){DGf^}fq z{nhftu3o2OV*9o)duqCs+kK?^x#{crd%kGE@)MU_UzcRZub7Un81H!wq#@IHhn-;(j_7-?ng@@*2Z2 zHwU+3n|pIyaNZfk2P&p{K6t!Z58p^l{Or+V{Nnr+e{#bsCT8k9;*Qr#x|@iL=kzZ`sOcE*5|F2^`osA9@3=k4@`|bG~)muA_RMfA%0>+0)yY z6IWhy>AQydpYY(_7vXmw#5s1qq#mdHAmVd$thw~`R<&pO#o2dnl%7lV$WdKl$YCGb zoaZ{ziz()5OK$A{xe+~O`q*o~U3d4XWvAcmUYFM){piX)@$Pxu+fGjPv!g%JU+WzD zJi4|usqE!=<&#UVts{2Zv=?^O?7AJNo_qUNop1@ts~D|$J?gv9YxOy`UvZAf`J_&? zvFw@iN`Cl)XT0~l>!DSulpS@fwKEFRxpZA0F&6w9%;LTI`rHTifR&ef#oSwn(|u%VwZwCe$bF*x)KDGjY3=)l?;XtJ_r1aU zkkN|qQvBII$>OAkYFs{yPtrM3~xEuciKgZvrzIWL%!Qa8` zqYGE9jo-0@`8hZB1ZgCIxb$4HNh|Jt%kjI;p8LEK6CL-`e0!h7xHs(HF+Tdy?nMv3=YI0=gtey6Rj-

529m!r6#K3Bf)&l(O% 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 Cn;jbf literal 0 HcmV?d00001 diff --git a/Test/PlayFabServicesManualTestApp/GDK/Assets/Logo.png b/Test/PlayFabServicesManualTestApp/GDK/Assets/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac081b39436ce5d5b3a6647eb444d30347b9b99 GIT binary patch literal 54843 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 QR{#J207*qoM6N<$f)3FW9smFU literal 0 HcmV?d00001 diff --git a/Test/PlayFabServicesManualTestApp/GDK/Assets/Mounted.png b/Test/PlayFabServicesManualTestApp/GDK/Assets/Mounted.png new file mode 100644 index 0000000000000000000000000000000000000000..4f82b9d98d173ee8c731596b570be85ba0597be2 GIT binary patch literal 3551 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 literal 0 HcmV?d00001 diff --git a/Test/PlayFabServicesManualTestApp/GDK/Assets/SmallLogo.png b/Test/PlayFabServicesManualTestApp/GDK/Assets/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..d137e6173c58e49126a4e46ab6c821b9c6fbd422 GIT binary patch literal 30312 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]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 z zvS%FB9-R@EIfz6Tg45jXk+|7gx!FC0QyBdoCPEaQf z!Dt*4YuIm7QjckO%CNaeF;dy)jMG3K-kF0_qK;l|s(e??c*Sc{9E#2r!ho`@ozb&P zho(PNQ9;lAPA={yWpGmSEOoHyjp|WTG$$dwaxP$@v&zvH*2iwBNeUFJ!ZgJU(tH^! z#FKGEeVW>R_C+nc)NJhme6&q)2J$9QzBDM->tq9E`<;dxJ7vp6c9`9l-0c{i@6>~S zQJHiSzU+c8YR|Q1`HFIzCo4R)FH(dL+C;wfySG!^3K?&3$GP~hfTo*_e$ylz!(N@4 z>hpm>fFD>?!>a)WsTwu*)>;(0u=wMr!rQ6j9R#y9m^JylcOl1DXcZm?P1dcbS)ap8 zVri39s=Mn8UeNQSMiya=&dv;Ga&t4hLa`~AHzIx&25Bf^zzvF^CWrg^{&^9A`~nkk z09$|5MD37Li^m(orEhjNv~lrb+e_93e7fa?hcE|nzdtKE=0ZU9BGh4J=H$taE%Zkb zKa>Do86X%7XDSOv?+Z#hOokD+) z(3`~QuVsl^`P&gWZsscQ1EHlOa{3Mk)kQ>1%|AWimZl+Lr zv^9wMjXJ<%|E4@~=?b3iQbSq{5Vp@9r4cJnfL8IfMy5%NyiIq!R=K={`+sgNB}n7q zb0Rk#(+a6h=si>nKHK`EE0Aj%`ugB=krk~aWd!EvAMh5Q@Pr*O2Gx_vj>$i&G3NNg zMuX>YBFbxX|KDEWEy{yg;6&T!LhoS=Mi5F~Bn=t|Yn+|7TjZ~^;3ne975sRE_F!*!z2oqcn%!?y2!y1+hbDhJP zQ7qu6sKFh*a!VedRM`NxG_lMd#}TYl!GmIse)it$-TB<17H#3yNW>(r@5D9zaJ|Oa z5c*Jz{!;dE)!7z%X%DtXfqJI|8>WdD46Sm&V0nBKL1G73i`y6m4xAi;@%lnx=d<`G zO`nSj74*M6w7!`+?0j}Kmxwzwcz;uFg!R=ye6kxsjh?=^O} z_o?*IiqFm`nG$VtU(E4^ovlzzHJYjM7qA9RklDbZ!RC^w)kc(nBA(|75iTwGsa>Qv_wjZk zSg)*)bwuWqg^C{JJo&kgdt_XKG76>Uv>hHgO~#U|l|06eTZ-75?Z*rav~}p52^$Xh z^x*H|!tz}k+CZi9X1gq|g!V6H2&bVL5g6t{7a(>GWJ0}79@5ARJFWg&otbfS5Z&IW zY8gmn)Y3jD7?+}8F~ao3pp6t!6VnK0yy1os^VlP zUkx=`e7$$GfzyxMmW)NH$*53v?(iMP88vRok&C0SOEa!Ko%foJS@u%AjlcM5U|2!y zhX#Y3@JRuO2B%E{;uGc9!$}61KtatA8rjRwt}dNIR)Dvejrrn;TZFiSa&@m3C+_w5*+D^?+=U1PK2eSdtaoc zyMl&h^O(O_V45Xyl6NGCCIS+=1XHAIb37mNMJT$NJkik0vKc>TIx5Q28$I}RKI$Hr z(1f_OHgexk{O|?C#!@llGJ6|6&(;bs%4RyCU$q-F;)ooYbT=DJaf{r@`2c5aKlVWD znoLP6B^fKPI0^>d*zy=y9;$_KbO^YwhG&$HOyeR!6QN-(R{qOKOh#FI!hkMs0lgy9 z6NK#{ctlm0nh+x<5S^#BO_gAwSDnSn3>IT=n@2<5gWg1Qexe~LQs{rip^vvU&vghr zTB;^Ez}QIV!nS{XdN3$GOxtw+QJuYAZpZV-sx#^u-EFbyNfKmOLZPQ=tHfZggT4<~ zvGA0jiH8soa4NfK%B6hNY}7eAhSjR_^-E&q>am{(?>@%_f(p~Rl@}9A1O>R-DG~iu zk>5qnjG-%T6^aPc<2JINEC|~%>LY(**nE85_9GPoY-8xpcFl(L(>+Htm#_h46ET$5!8s)p9Zfv&?&h>8LH z@XIO(9yu3q9dPE7aP1tjh9h2xOJG{zj7 zv`(YZ>zeKfCa--;AJVKinx#X#x&dVMXsNujV6|XE%_cX~5@j5yF@IF8`Bn0RdQ`|5 zt1|}c(koD0{aFr9Bu&cFr3y8eZ(FM({;Ey%B6g_K?s*+W6?P~MsJSFZXX-TtvqL;Y%PuUsH8xT~@Os*Xxd=T~9vnBB}UMdeZOl_^HtX7NcQHj_RD-kdJ) z6FyGJK5o;@$Q(O9i=2Q>X-!fj!O-ke$MxFrOaRvD4OtTGTG9*03z_%dOri6f%?8G9 z30iPo!v!byv}yL47ZwW%#10q33zDR$c4M+8|2#f>uCNGgIYdTzQnGs@j^0x-V9nBw zTJ!_!xQS{b4{?Y7?k}02_wVC8-0*)Df^j=AT_DDp zt9ooo!8V%daioGc-cFaCvay`sjo4nz+${9ybCdrS_+^>O<%FMFk~G$P@sgRB$Siw0uu6nK7)hf#l+Kef~f~SQ)hX+0snW=Ug}Qd(w8pW~7U>qPtiV=TO78kWZ1i z>^w@Mtw|#hbd(d)$mY?}4{9u|O%)Mbc zzx=6^w9{n{&zcIKqf*1z!aWK>pefvfYFA(*!LUFFWxs%4Af+ZuUfmYmIhmcjRn~lw zp6A(N_dkhRUG8P-*oi2R;|tR9pmKjhMB(!8V|+8w z=+ET3WGF%H$ikIkOLGK^f;ut3i=28tt9U62FRJk)R93<)j!;8&fw(HNIX%Y>EsV;Q zs5^YY2##T6e<`NOkne3>kuu&wZp+$&ZcG(U+5Od5D(N*=xSA@15#!#^eL@_5ozWoC z7RaFu1~A6WB$=s$n8M8=U}Q$uU>*0kj`zU0t= z=drcjlvITl5Yv;3NF`RG>Yvfh96{h8Av5kTb7waaX_(0jMVrqb;g6!Z(K>~2492Dz zVY{!(Ne;Ih#Z$nFmqjp^R?;AWvb;nEQQA;xTcI)UxGDx0ss_#@fN!tG7h3_6T-RHN z-ZAzeBBhtBpay#|XqmQ<-cQ{1F4Z0Z%5iQ8c; zzbRIPNF%Of#A!<-Cl0wZZ5WDFzF#lRp>Op=LApi;8)EbL^v9tTR#{E3kx2qCdK=bj z1LlYQC;@Cowm}SmG;=oqmubSMpYN)0FbX5M&Bje@4axWQBr-$~YsQOTZsL@U(JUIU zP`Z)v$o|{u7u}f>6Odsqg&p}w!tJTi($E6iVqcRsQ`2fdF2o~HIbX7M{&Rl|yzH~A zR>GUv-F?7sK=e1a-|TG?$4fZ z7hgq(WTp<3<#EpN)Fap;g*A&^{} zr{WWqa<8k)Kw1MF3Jnh(K97FkDW#2Am9VGnVo%@C;pf|5XCi> zVH9I`YsMk2=+P=?{>IFLf#SqmZRd3@OX|NxFS*?t-0lr88q^!>uEz`qW|BC{Y|UEn zG0^9y%Acm~=Zb_rzAXW;4cnU*|Ds(hKfr(lGh^l**9_T4@+W_5jTngfPmx7bQ+_Xm-zV$+egF8tgWoW+|ND*ik6zbKCA*hrwYwSa0 z1by|qvGeu1lC)JnLOpNEry9FIa=7W=b+|%`I7B_Zv0i`q4ypz@fq6(& z4_7RF*YXTWTsi@J7B1>ay1ankNN=cLF=@v-nR58U%k{QGm-sE7;Wn{wR?A^0f`cD} zU^%}HY^+MfH`Iiw6hi_kpm+Wm2GkmZ8?O_}vhgHFHoOq`{}N63K{|~+ES{J}YT44N zCdjC)TX}lvuxbFujUSuDF^hd3NnYgucO`EG)MDb-hBq({wQ)d9T?ps!s#GK2dP<=v ze)=L}NIngliCv~(gI2P-DQA$&CLi)OBPVP8hhNvvhO_}&=IxM06}oy|LgL8^bel$9#aKfPxOXW zyC%}MTBf3L;E9F}zl2&#w*c#N zH#-nOE34b)l9(6)cUr}R90=I%icW2S#PAjV65h8Q?=K=(iB$(grgM8VN#s(;c>)hS zQjX2@n_bPG2jw3K+;9)iNK5T+lLO4!6Hrku9%x(|jrSHkf1 zQhlQS^Fl;KrO=ChunT7S*hyF8lWP*VF1QIYs*#+}S*u?-zs0xW*5d^e=u^Xbj*zJ2 zo=JV6#l@3lL_-7C2W&Z)IDaFc{cHBdh`t>F$H@(4uZ3Jyo2bLD_u8o#h9t_O@orgV zMQK5MbL3_+7riiA|M%DUAXr(8?^Ct0?ZE9e?&pGeu7^uc#)gyc8VDx#}Rf}VdBb9VyQ@n;oeGh9)`VP?qjk=tM0hOnaHT^bzPu| zFN@VY^TgSQ7GSO?RzzyM3uw*2!x+|JW;w1R+)S4fzP5_E2;W0iG%Ip#8$1k$X_a7E zxEX}2v(1v3MA_bZMukJb_8QrPpgzWzXRg)3E;T)()@%UpMNF!u>WaBH5~3n z1d*=s@SXk?8CB>9X$acAo#|b29%GzMcn`&(E&nt{?r9;$JC9QAi9FdXOLnq+zi38i zj)g6+juf%{-`FFVW9?BM%6-GF#5TYsLf9LL?5mgEbh{ywBxJ%Bq>QxA3UjgH;TMSV zS|Aq<4IbXnXO~Zi@*tgv<{igLKS#(fTT%u379#CH&WPhn&FbT+^4*T4wY* z9)|QIP<=u#(_6!4URZcCl-(4krS@ZB;mcf0yXV823cKV%?(bHw_21po4677*(88*T zwHO*g06LW2AZyX$x?MyqCLih8=|BDg{lCxHa(Tk?xGF(cM(W*ieoVR9TMbbfHbAk= ztr6zn2!($i|Gn3yAs~HGw}_|mEUd+_!qY50rfPBZpgdL{fDWu|Ry#lNd5LW^>uwf< zz+aBErj~a`a$u;C?}e_ZF8U(7 zKC;abA1tv_H-yD(H5>o*w%tQM8asKhz`!ct1z5uQH7frxNmZObJqe2Xfi` z&NzFxY=a7~L*MsyX`TiN0TAS?UWGRp4JFW-UrD@!FL)hWgryjf-rb#dwWJlzwa0rn5DB3b@K`d^u&G)3LZKv+jAS{xuSDAv`GFN6k zR?23ve?L9f;#RX>SN&Lu*F-9rVyNBzBhJJy$Yg!5g(v8MdM;K}Hh1_`wrCMg?3z%f zvMx0hA*WiTT%|^8IMv%Ja6|u6NB((fikCu5GlR(GhOD11?^KR>jzJj;{GM!iz)LPu zGOp}Rhx-L765fr7bupQcr4Kfwl<+JjgFM>oy`SFhFdreJiGN^+(<&KQ#s7%)=`PX9 zhY}LO_sH$d@Ea*#K3ve$fq(F$5JzMAIlsjzVt%}Pl8t7!qwBT7r>DoO=0>UrzZMU! z*wRNnxyy6SKakH3m27!k3js1H$RVxs*Z?2(LmRX2;;p!b0_llLTRAPp;LHv9-X|TY za9fr+qCq%{a){=DApdpu6dlu%x-PVj_cTPXp75*C1XwJrwRV)*VniFHX#LyOBvgfJ$Mu?4q`D_55-WC#sB-IO6Ju-C-8hJm10`_r?(wK0b%~% z&Ly5czvFr3M1rTD@&~0qF4x?>H%6NM=mp9{BT&7G00q%{dyy8p{^Xc&YUt7P)zEX< zzI5mCGcEhyMH`y|eZd4cPz=|Exwn@9>FKZu3teDHWM%`*JwR|3sh+rIHXqo%HmQXF zru)0hm{yMWHCauxA_(l9kF6C4N`=+{l$ioEB52Z}!Q>coo2@+1V$6H`NA>M)c4Dt> zqF80LG6zTdYP~0opscMX%__qMPa`#Ywvo|c>R{M@T&FG6f=AM1d7??J)uI8~qD;cJ zpm>(NctI6Ya{!!pv z`w0RuWyvO(l*_rEjNulo4DDG$8PybmACWFYKnHGV+2;NQjLk;${?(Fby5H-J8LQnk z0a(JBs?TJzeF5lLTM9O}FrqlOJzoYZ=Y1Qm(Vq#<$l@k5U^^uiHPb2g4TP#=xpH ziQuKrJWK~F3H4}8DEn-{OhYpBL^=zcOMfu~V>iO_htvw*_KnD~_+v_x8rWY8lC?6r zCLuKFj`*q$yor$gYM{?gNhcr7tQLk0w0;+nhGAR`eE)&yUfd8WjzZ=!ypV!VdEmwj z6~il<|Rzh*1Dw1TwX0R@H#VMD46uB4AAnI*z&`3JGdZPSVbGj#6-8yjXIG$Alp zz`-&l7mLerKtob)WQtlVV*4o>1LC8}4^9&hI0SF;`1x?B#GNWFW{de37Qz%vcdSN- zo$lSdH{MGu^{IAp>J+3ah4p!Q6G_J(Of*B_7S^>6`Ye{Q5!S;Qko z&h}7rkkhX+lN2i^yTpXbnc$O|By5|U|8&XFa|HRa1oA``&KqCIg)o`iYfV~1MeokK zgO{`uJ}<>2VwP^kI7Z?#XC$fyKcpmy~7l-Q!oOn{}WFv-|oUA_vMipft9+$-wFt_P1Um@Nf$$bs|yNl}hJVfo`(>mf8R4@fRc9ouWzSV)yuz#5M)pGtGr8;F48W1LWl_(F;;Y3|jC~1G8TP?m zcU2`UQ9|DC$e;%(K%+;@=KFZw*S<|{$KcdB)3}+RjJ{YeOU!yob%Vk;q;e|q)!Ni% zTYq!ZkaKtVPP(4__XT#Ca{C$jV%{(vA!mp_T`Y*b5udNx6EH8I8=u!Mur z3|m26ej&va`tZ%)C<8c8SH|j6SEVHm)0eCQv2CR_@&)6k6OAr2cAI@59G-DI81rv5 zKQ+XJz()F#{A9jyZoVP}N-88z-F^rpPvqTSKQ>)5=y|Qu^Zrl;N_fsFQa|Z7UhcUop`HDNhHr=&|35KIKw17*X{a<1pmutsxo2cQ_ z2G!Q^%1%~m^H_%`B#dPNJf?26w52Y#(09x;3G7C7bZv|th)aqV(IzkYZkqV8!n#i% zi=pH;a_Y5R-I#4}vyK1k?Hq?KN2=ETbq(C$F0sGo{lD1=Z6E6E#DG|GB)gG)yVAr( zQx8!Bz2_mM?;}}GwJaE<;ihH0QBW{yP$J_C3}O>uvgp0**y>p1en@ebS03Pa1jQK= zKn>zdn6s59`lN)!XRK2D4DDVoy({&t2BA#=Z2C6pmojmQ^#KM)pB>Mog1l{AjMkCS z<3=#nHmkEPoS`uEucP~oIE5Gwt0&&`Hb1Rw z?{rnuwV>VPI|FP~zJ`?OEG7Jw@FAr-vXbcF=yY#rD4fUruAG7b27t9)X)Br|X)J;NzCqy+EdJliX-iicBqKVz-e)mb@ zGMbJFs0PL2uuwE(?2BaLiJIBZRlM;rNZrO%SombYY9uAGA0NMZ|aO z1~^!PdI+LYUmY{OOXr(vfcIgv`A46gkxIFF0Eq33SSuOj!J4+8!FO;{-fiN%K49Qb z%)no9$}}{(YwnL>7B(IDR{q(yb$bxN`=`R2wA1^^@``<%skPO2Hvjfgu3ycRw9Ai`doY0jam-*vbW^5L|=!rD6y3gOzy` z6J=Z!anXVpRA%=L(d2qywHD$|kzaqDC48f(LS6|es|=j^#&b^_`@cd{j@20p;KZ+W zSo`b%MpWmc(3o_J(Z=_Qe*%W9rU;6gNiMvYt3559gT z+yiE>6{e)0Y1r(Ep4^W~GjUqhEVm)s^)$}RRpK@721gZaxk~0F(2q+@Bk0-;NY7m! z?#GKB9$RC0T&`cfQIy4>tv15ZS>?$U&q;{XklB1kyH-}-rNj&I^3{ju7aWrv3pa;M zxluif-mc1`rX?Rts9w;=k z882~#m6VaRH%{UiIFZpgtby)ldXxlyMgXB|CD#!_7O>u^^l)jNRVARoqBPvM`VtRw zwZp;tG$-}M!?H4QXZ|$K_;Js3zt$D+g;+nZP?-S4>c+|~>$3$L1uh{A#};oYlaB)S z{h7OD4~B*Z9E%G3T%sqd!2w_-#mGYUTuLsfz;9`rMh!1G%f7!exOb50WN8M@UokiP z@Yxx+Wfp{-^rVNAc+q-kxxdP`U9);IZ!RZt2rJ$AF~|?J??t2XUV38m8&2)cL`03S zV#=8(0A2nM+xz|eB78nkC>7G$7toH8+GwI!TzV|IUft%(&v@Av4)Jf}aJ;Ks2PSVI zOx!lR6=VBw?JgVKF$8xHNk}o$LkFFtVG8GJ)#_PoBIq3DV7VOs>ZIga9&Wwg@o-;` znd8w}0*XaV`eIMUp0;FCJb0DK@9qjHe#)vs>|V8U80~EGS1p{&AuzM;fzOwp<>kb* zW4+c~VQd!m`4n#KIS+%Fn=DnD_o5__#}Mx^&kCf%n6QaH6~M{AAf=7(c4>YM_M}h2 z)2Qnau0&`0&pB2SBgy6#82kucdlMOo0*c@fWFyEK} zcawgG>)*GqNad_LYZAlzhE!U2Y54$fOUn=0^O(o5nBw zB6cU|qV6F&sh^r-jI>enP^=Y8Yb&PuVZ6eW8{(2^#Bt6)eBd;D8u)hB-^x|~(th5* zB--8)+S~~w+y?7$`k?1vKGm5wn9TaQ4vMmm35s_gmJS4FI!ZUYCLDRZ+?{UF*9YvC zv9BH(;J$9B3(jsA4z};tB$?*nkbKGO6DSx_e+~BQrIwQncHA#pp7_b2Aa%#>XHJsl zWh6s+b_Cq}xR$o2K3AkyMJ37S4p#0fu%N3Sael_>PCa{8wT({TTti+(73BQYKljlo&tVytIOf zt5QAUYG7F~I#Uk0@pjrVdJcmziwtv>l7T?ptBIRpo~tIWPn3oHi@}b;(cH%abt9q} z;%7~1M<#{W$q#1sQzbqHqkLg`h&U7TD3KJ zPf|$^6aYX#zrO%A^n(^E{qx%nqV{)&xFR0&*Ms4nlU2U#!Ju}SWGULg>)PNACP4r% zS6hzM1@NudTvB3Q9mn#e>bQCIiZpLU6QAHxAA5g3T%y+pgElbEY|Y1JF2I2UQM>Gs zKh)^JQ?2kt6~k*spN!AhiWrv&ns+cT_hp^;%pzrAM1_63zAH_!F{IwW03J)=wTA@j z11R%YzGek-T(l;VMmdg`k`_b&Um_OM*6r&q>qbJUujfgzx6DfaANTeV>He#}@VxdM+!WcZBt5UA$Xow$C~?=0cbvn{?MOmsS~Gt z2tq4zrsm)d09{uogCU|-_col}3-+W8w-5nCHnr@fG7W$yiVT{J`u4EuX~rbP$j4HMwkCW@^1T0ErXJ5!X0ryge8e*t8tj%!xHT4lycgQHj|FrdyB-?-Hv>8o zH~u#DMLe|>r_f(3svWkZZf52o14)0GLg1X{`KRVVxtvFKZj2!!!7?4^6?D-O*W~|o zKWRhW3A&mz7Ya)?X#~yrnJgjIZ-86Mwx*}&X`g0tHW?XoOp9`!i(BdgC!Z>M7`-Wl z6^iGclpn7t)FMi4ov*Li<8K-YD`pku|FVCe0I#wJ70|{Nhb`hw0&B9EWk)k5B}qA0okoXy$Z4F6fT! zq|t93v_lDT#igTU>0TK3%{s$$RGkg9q$!nP8I28PRP|NjAW#)Fe4bP4%e~e&+1Y5T zNGBRnNAkFp82L(Nk~GGyOq%KVo^abFI{*Whr>;(x8{URsSbBr20QP^&oBX%-?DNe) zyuV~0M>jbq!Qgyw+#z6+CVE=nhdNdT%opJm;W?*MjycB?HuoU|20ONK|NaT>+U}4aAcAMXZ3wy^dh1SjgcZ@Lj6)v2*6Jmv#rS-G4A& z=%dByHL9s?fi&4XK{B4%Nf{?>pgw1@v~{L8RnyX_7P>Rsh}vjti-z$>R~? zq4C`7_F&iHv;-H@s~Gye#5MvtP!1VPQVY*W_uD7o+4E{kbMR{duGaVUS;3VE(gBL` zit(yL#6-WIOAMAP2S?~VFwfRH6GOs~62GCJqzAVCplk_=kpg#(ngnD2&rkC-4yG}9 zI-nz-`6G6gTjEMaCTJyuoH-ef?;qh>@QCt%Xt>~=v4NPpW!6N&^%M^z8@2PkjDgP& zgTXxjHe@BGupb#|x`+FQ)&T5TXbhAzRr2^OBE8EZqA!8_e;&_RAF%thILt6`cxid6 zAeSNewmjG~);=Ra&+npz4#w-%FWGaydyN*8`aE^r(}Sar{WY4{V$sT@gG^pSX!J2P z7JWm6!NX6fvi9PhtBr5{_=1|45q{{n9OY|Cc^;rXIqOJCd{Wq!{+&^sEJsNk5 z%POAmt%-`c-X2{&^O`A@V!}c80gH2uYX%X`h>RLtOKVY8RsW^-4qp$UjI-pRk938X zm?az#b$Tr^UA8~b?*`vH|JbTM?0Mr{`^qD+ve0#Jv{*5G7V$+Vi7HF&QfODlBglCo zJ+C^#k*`J@t(+e})oxMV^xRebNHoQF&WRrUM+V+;RGePh%@7~^_NOH83FH&raOW=;>47lXOz?5JsS3X)WXwX0Ap}vuEUQx4lj*Py(al?5gNyUO50>{ zYVZoDr@cIA4zXhK!@t3j;$FS_}3O?l&sYE?8 z=zYv|PQbAK>G06&fY5=^Wi}nl8{;|4u%so)2^5nhX6M>lSh_q*f)8bKIhI}=sSL67 zu2|M^C<}7S>I|m)rshBV>moYMw5%6frwtD${EBT2fh!RIE|5-awPY}O=jml|oNr(Z zPW`nsrVBhQW?LOTKkv+UR#VL)u)c!2wnfv0SUQ&Ewx zhZk8Y_j_PnI9zR0m;LUn4yDQ@GjDtnfMBAStQRj)s_#!3o!vwQ4jER-!~Li`+2R|7 z`IpENBB6LL8}aSO;!)b!6&~d|wX}upN#?#YO`e5!RYu=H5fI0;m+uRtF%1|_+jwHk zo^F&i6O!3aT0l2aGWs5hm3S9(FL?S;sCDEjKrpSS(3~rbhWPDKLP)sf3!!CIDZ#|` z^hy>m&I1zQf##QpNX2t%EtZcEN{UoteUc_CdV}38EC++30o&@E9 zmib#z3B#Q6Hb0jE*A^3#3^Moc$lOi5!sNag4TY&+`SjTz>@mTSpmLvL+Q2B?MiNrU zw&RTvYuJy&R|bQAWRmh;GJZVS0oMEO z3Cm0Cn;~j--_dO(EJA(K1g)lxRNWbL^%wQu`DcDO2ST)>`mSel&sW0ioJz8_k z*E#(FcID9-LDdXveA}jwHV%ws>0iI4vM;3^#ov9p5cQXpA<6?})!_v!ofTt>&+lF` zu94m%D{_M4p2LKg<{W`IbWOydkp^zgtXu(n(ls2@afG;lzFD)Lot|J7LVU9*iz5e3JWNh0gwV}hR))#FaF)P z%#9OvO#SY|gHQRfS7MhY{|6!4FJnRCkfG${#@#_3H;DKt{zhV$VVWW!CMgMxzO`o7 zhD4oW-uWdM`UY3_aQ_JyHLM|RX#mZ+dz=j+gomSV&9_-_tE`J^gFonn2G^PL?!P)u z0pQ0=_KxZS{%?cf|3Aa&|I@z||1z2WKmEaniO&%SRyQB&PpgzIHPk$i^HpLD$33Iy zeT-{A;ik>*ot0`hqbTdqVRZ|ixfBM2FUWH*y;GAtdw6RsEPX@B;!Li{5IF9=|37_2 zc=`8)_w|W=Cy<)g@T5BX77WC?P*Pp=QGLIk;#+dkGS?iHKtTpE!Os5$$&SbM@n3yMPei4lEhGyak3Rnr57yyj&Y%rf}20XpIGQ7!~ z+#vs`Bvq)-!VXM}ygQdy&yfq?Z^?7P$hXV}+TjExc+Z+gJHIsP4?vV)RGoNhCS54$ zkv7)=mAN`Fk^r3>618X%SD>6sbrtF1SXi_@NoWAU~LM7g?8f%$$r}@ z+1kQ77!D<0Ibz)~P`j+|$&|m9H(Z6ig}+r6lLss7X3aiv@&GxFsyXvL_be0lYK>+- zoN?*)RM_%kb!Y2phjhv|2xxS+r0?c~Md9P2miho1Y*qt2=b35#2sqGSMxxaUq z3P2r{=>&K7#P3QZf4;bKVSzI5-VhZy$04TMKWBWt)Cfz5i#tiaEacvHa&g51nq-|9 z3x?nqfr&5;c5h4`WRBHp{bKvAxzv;|>zS_~KF^RK8Fm^oG*d!bgF@g`i%#q9{wTUe z`&I)z$LLZ>T8a_sKYkcSodZs#cjT5c*D@SZ+*qmL2#8Y500p!Lep!8i9ePzI~E@1qZ=ep*#a!(GG(*hNljx-HhRFs(`Enb z(GPQ$`DSV@vEv*ci$=>&`sJDtzsWmgdSe~=U*DF?xZJL_a$#s|P=@A>W)6GW1}R;& z7bXmBVdx_mWXXeKC)hR-jpxUX`yqP&hT;*BiN)Tl+!n*s6ptJTu?3)p>6$8(UD*&6 zl9d75fWjb9$r@RwSxXUkO;frKE@4ZasS@i{`*Yzd+GQ;NS%Mk6nzcb z{cXbg504`LKg_XzIAeL40^#1<;V8)Qh~4x&3L=c7HS)fq;Iv;%eA5IInJkPGoixw6 zuJp0d^)~0(XTe@b>HK?K#soP}u`SOVu?UT^;-b^*fe<{sFI4f{mt`h522X4E)t5;H z#$e)<2DX2}2!($Y_j53Ciago`qxY7u#pvozl>><&i`Qofe@+Z=c~xle@*|kJR~$5* z_wdukM+6h(H3q!>kY!PiW-g46nLl-TUXhd!^AwS5>GLBU)w+^RwG(4`QTtS9yP1Vb39+Pz?5emL5bg~ zK!Sy_iGkRcd;6@R0W29Ef|F_mn8Z0W*(h@*XQkz*0zram=Z;WgI>lDonUoP~Mn@#} zr}-OUOh(ZT)0@lOg_1q!nfVno@c0`|*B}?L5y{_nyGEb%7(-2t4L~x;1h(IG42Ho! zp);#X01dp%&~go}6o#1mL8`7fg~^$n^#`+b>XGMpC}VOlecq?`4P5d76H%{C$P-FE zqRx(!F$U@=4R{x`eNkqrQ`}!KBUPMI#6m*2hGf(B;S-V*{KG6`_0$6YP(IV2G}!ZQ zha$w2ceh&W>qP)+k8ijgkk4`XjePxmZa-gY7(CQcY34eaC}9FKl3To!zDsL(W>W+p zc`h$mvhECiDGs;1_kf*F=&mW?TFXk6R?n)W63g*OpkD@$KTl6) zD77yTCr9w`(5?vBXIFE8 z77EWFhvl5nz24YmlmpEiF{`|$56rGKL}SORQ>`MXgw;V2ti5myj-Nx9vQ;zlWxr)? z;sWd`v@%xS(cHX3> zqE?5}$heHo4e#ye#lUV#h$h~25C{CY8u!TPeO0%1Z*6OEp?4qI0@MZ3`(FBdC@9AG zsAjl2Ed1Q#j6!QT@lvT#7hOxz=jfQwrDokJeSyQDQ>suc<}*fXUmgc|{x-)I$KRy1 z&@?M&aS#PA#E>ApWiTBFvvzH}>Z6~6)m4RI3Q$o0SWgr3qYw6UR#Xvr!dYsLPh$sA zS>C5yb5nWP*L+0ztz)10(ek@)_x~c%{kF|Jhr_rPJNTB3^@cyh8qgl1x-Y*7f4MJl z3Y@OB1^y48B|i;CadDmIV}PTq1lPz09#O{~oMsX%TBkq4m*ClRwktf96{tQ`S+S$8 z0i^#OLy#b>9!r8}UjeR0Y*N*{IHaMJ;ekOmZREbkV)T;@ZT+C+im4E>N3}Fjrl^(y zrfBjHB?z3tlXI|?3b83}bS%T7XCyYlaTYK|9{eU!yWT)NHXE?{CXb0ohg(f2#Yd{WBof~2493n_v=}uE(FARDE=HM&C^j5|@oI!GRypXwa%t$uXp5@}| zc*2pI`NIMe^1a55=%&>u#S8PDK6;VzALem6hpWysCO?VXAeAqiR^ifQ3hfeYo}eqc zKQ7-)jgx_W?H!NF=-WtVzaXZqoKy|h3c%lY zE}jmHF0=e1m5Gvpij!(-fmw?&c^*BaWqE4HkmT%aBHl&}_Zf)5KB`aY=tNzu5JzRi z2qs}g{ZiRPVP#>1NGNU6*xPKf_Na=^E%QH!uX0t191C%4e`C(#&RwAbWtXVo-&2!H z2b8SZ5A~9+x2%{*(}a+Ctt)kX&?DhOgeGg+>(BY@#SP8%ZEKL=#K;cOBt{lsdOyG@ z@zAQtR>&=U!2!klrre}OVS19MUH8pha_+}7Sd4gKH^%b_3yx7JzwVgnK-?)FR+H#y zvMnfX?RFzS5j4_XhcV{ssn9!v9S@eJ-eZ?zDsb-{!^jcv3kv$~Es z^5u`miX%n*WYdGST8~jbwReYr@gcjQr#m3NNY`S+j&x`|Uh@9Fw9NLH<#~C{7vg7Q zdBga2ghT|ey`_d^H>3ukEcr<~9W~YzXLJ=OEXV!Ri^l!I*b3el3=DOCYfw6aEnbV< z=fT?PrDu5O*z>&{&t|tDUzi>hS{=uI+~6Iz7(EGki)4lD&TbM^ABp>a<}{EEw;0V! ze;=?;+O*?M!i5L7!Oaraf(r*)7Vo`hjA};O?3YWA#Tg0)Z5JjL^igb07mArGs^J*% z@Z_>*=)s;2eJTd{K{;iakA2C4PXFxd26vt>*9WIJj|n^O zhZFF%qd-C?X?F{dIOIRB9C}LCiTwrIdqtmp_Aj$j0+c4q;TTy4*? z3g=8*K&I1?#|F4t8WQoC!wJ1JZ0f-_Y>tiK@=;O5UWS*SEV*g>}+JsHywtrtkdekXn_mkoqXsQvbGW)2qHJ2CPZ%Y%ry)dCmkA zBzfLXBvw6fdqACU0`qta`D_IBcKAaYlE8Z))2~k+6@I!gnY~{>uM_z|9Brjz+R%|L zCCdu3GPfrVxZI!?Hiz;ka!X1w?DI3QP)a)6mhcGw=~Fpt-7Z=fQv^i|({v9{j~o3u zhh~XbUiIOLKHp!8v#6RvZcR;+cx_F!|9~XdCs6G zkd8?oCCj9n)2Fe;g}vbSIg+qE<`SF-iC)Zf3=fe7XM=SR5rnJ^8s`rcjME}&vO#+f zqs$4KA8LU2quXC9OdNF_KWGA767NGm3Rq{rS63p#*vsM^j4F*TV|J(i>oGEq-|cy+ z+#srB-QbGU#zXO%mc8`ivVDu0BQn$>WH6JoUbDX&9WO-!u|b)IjnJfAHIDEXZT5#7 zGs7?uhkTS4~+YQ&^}8j91$HBMt{L?pX1b zEZ~|sz1JfhrlIMD&E))3+sAb&4o8_Ay6f|FVs~(M;9>wpy&G*cqul2+7WUfnKR>Zw zeqbJ@#7qM?YZ5EeC0!Z!)M(IW%0!ftKwo_Y#$IsYBvOZmMMf_L;S!GYzV#CmVuapo0gd2B~#H2 zE3W4Z@8g^7nErREE1^mNo8?T==165uTZ#^=HFskC%KRkOlm8Jhvt3`{$Xji*NDpPp ze6gIw;~z&qa5#2*vap%mb6L|OSZZKFm`_=6)8jB8oXzl+ohR z!*Qr~1g8R@6`8Il52lwTUlk6Qi9S>H=K5>+Xh9nciA0*f(_1iPn&N1nIo~?{La@@- z7SPZv;g@Ubvt(7jU1vLpxBC21BDRiDzn$_EZZH-4!y=IZg7=-;C6VOdIb{0wq3ZlB zM%6!%l>TW3;M#+zM0#`v<(BtwK|tq#?Ca7!$~L!Cnen z-deZzdw2$-&7|Gi!|Q=97^Y{w1$;0an>J3FSwL16*zjB?`JM}`PD2p!HFR%{jid} zt$a0iGCubQx@c)S+O&+$d>6+N*!74u{}_41uA4#t-+0&Bj;(wD5*) z%P<0ZSk!A!%_5x0Qda%x!7-f=3GU$fraKeI-C3BEfwJ%5uX`TZ)HS|_f?)&hKQVY( z{n+D9$b`_362&9dSMwR!!kBhth>)YVEm%gAIvSy;?;Zr@_x+aVZMa8=(n+ad(zEJE z;qQ}~ElyMZ=*H0Lyp1M(|87hlC;6H$12ktZeMR;@X-itlTyNEid+4AV+J7oTaZPUM-)C)1fw1c{1g4 z$VUSu!>W>H^3ONjKACcNd`lz5`V>*e%-{1HrXJ}9?q7*EF$DX=fl)lxf_fF9-+Pk0 z-&p4Poqa;j(BVwhh*EaxB3(Y?Ab^VY{kJQMmTiSQb6r9ykrY*r(A72Sx`)zZOKo&_y zV#$X22AyOeW7IPs$7FdPY#(|;+szh=qg>KoqN^G_+N9^=kqyn6X3?=)btKrlzKrxf zhNg;{x$2fSz)*Ht$8mVNu>9%Xi14FyEN)B>JNEFl5gpB1*uH#5nyb^dY1yvnnc?Ly zdhPgZB5#4~s-xVy>Wlf=*5o#KrY1vIhaTkH8D!cNgnsL&@PY(Yz;4v6R~bttU_PUv?qQgC}KCapMTZcr!id_+dY7TxZu=(@s8n$%Maj+H;adxP0XV! zr6n1`gujCpn2-l+15oqgmRs=#jBF=@wbJm*-||S~!LV_wDK+#w`bd6G-v^>ag6my)gx^^BuHcn)B!kD~sp^I;U{m_aZ~ceH5nM4YW}1<1 zVM}o=JVY~|NNx(FCN#vfQ9l-b5trufRe*QyU;G3W&qQ8PSdz7t!O_0xSU_)KzqjE~D^aEsfMW#uAsA1QxH<7b+a`3KT>I_$c)G zO9DTZSB5|C;>+wB-gh7YeDlboxmlD3n2xELpfUOTEpO)sRa;3klUNdd6J)Gls4)C$L;2JJ1&3 zb|qph8aI6HtI7#=Izu$I9G_qx?i%}{i@APAk?V7xJ!IZCe+tCY)9k0s!|gWe{Yd&* znx`qxNdGuo(Hl~2>I~E0jaB`6ds+D_NC^_X%A4l_lMmJ57V}hF+4!Q6&Yip`dX*eas?<| z(lOaX)feIpYZ0TQ5L16=n(b$8nMHEuB(ED`3K|E_;H|s97N20=OUh->i&+i$Tw4bN zgT8E_Z&~e(qEhD+{A0gaV@v2@m0{~>C3+i*7;A=paIVR)*R(!0YV#BxWf5&aYcp$( z6?Y7y7xD5C`#z7EW}q`QW&trgP|2Of_=Gl$9R2!nR$id)XAZ>YP~D$f z^y@VGPA^QnG~UuCKD=z;T_+9fy^Foq@ZzL!_B94qkHdL$k0}x9+UwDJN$ulyn9eC* zF%R`&L}!_tFKck$4wRy1*Is&We0QA)GWShPpDw zh;KhHj(8*HmVbPb)vOSivzT$ooVY3{?i~{mxP_QM-Z^AhvD;`XK}XRhBTIXnB;Q_Q z^c)sy@hr<6iQ;(u$&i;+Yjh$5VM#2s${)GSqGrv@#^Tlh^T%`7#h6_?w#t1(1PYdX zIAKbrlfwp=x&H_!uKsUs^Cvyu%^w5X5R5>fAso^OxdV`wz=7+-VyLvSHCFzBjjDwn zY_YdzpI_n$jKFb~ocyUQqB39UCOC|$ID@R+FA>AAq7~i_kt+b$NCTns9yED~V0if##qG~ARLtL1R#94%Xc$RRq z99n($zmCU-^Vx% zrlL)Jx{2jPjWQ<$*nv6Ec>W_yhl?;9zdA(TvfRPSpodP;kht~9g3%>RSpKrh?sNp| z&p`e6*;Bo&D#49lDW*39SZj!Hlio~gA~$m_6&;s9Jt4kkziaV=aer!ba)^?otlFIW zp~wq(cK-IA=KXM?u5xZ2odhnQ zBYfb%5XA*cSoYfwQkh ziOsMZP`JFoM7^5h$Pz|j>js-|*|@6bY>8!KKf;w(4@-uS@)xVq-6~C`^1e7;@T9$9UaOLu4~3)={@?Vg|2z z&5sXwrH&!Ma0o7!L-S%(lTjcC#Ii$D=WjFT-@L=*KC{)vkuVR}$T@!pO!5wR=T5Cv0Y3Lp6 zzePDU=ne+Hp>K1skPoO(sJTz zwST}})ydx`(LB4U$3Y@nO3ztxY^1WC;)9_xH{7S9`oCiND)BhI^!%p-(XCq!*Bqsd zM2aK(A0#A^x=Xs^Yu^dT{+CJ2xQWX!+Hz!2YiG{z$`gD0BBJTWxn_%ykR7Y+^}2@?T~J{{3Mn0RqH z)LW9fF|c3W5NJHnOKuUWL8JAzs}~7cPm{A1@fp%`kT`IgJkFqMJ{K7ciRC@l->UM+ zL|5erO0}=b%QwawBdvJODpiJcMl;9o@LV3x& zxuSr>m=x3*{dq#sksgEh;o>>v?ZcwYtm8KUyim8Hn#?f z&Q@!#_srokiIt)}RL44TM?uPu1ggq(`%)5VUh&8PK_`CT`a~`Z4R)|ku#H7JZVjvU zHlVCD;b?ZC7;r=!!D#z`|JG-fJDl17KJ+(Svj}H}(WuJpo^Ijn2;- zBA!l@gxh}P8m!41pc6zf!g!&5%VG-nVLgu+%WxmlHXUMMU7tT~P((8j3;8@R3MO1- zD;6J#Bt>f0?~E8u9y!e#XyCVJ6$vJAlmDRD8(9u)Pz#OR%_?GCu4UGm9) ztWV4!H}RZAez6|HHvE%k_#H}Ou9b*sw|^C`ZSV9U$-_wRt!|CYA~aIjqn6HX!aq#H z&oaue>1A_O-yQdy0Y)$}a=GKwZS?W9X|x#tu)?Ii{D2W0r2U`EAgg4oYK_5g7p5rf z56#H%5CbJY)Zn4IDFOkA=kJQe9A!XiWt;dtGu6pGBv+-0*+R~qg6i!?)=s4yuoF-x zWC;gz2bA^~RC7gki3ZZGG4t&s9KM z9}Z>)m+oR>lGKoW9FZvO_M&AicN-RtTS)taN z91@l3aSgwxOoIC-?llhHOi3ocRWG3|#Y4{2*CuGK;J-lyB@{d~Nd{`2V0l@+ z`eEd`iY=kV<`m=4(MOA&&2*~6+L^`k8} zLg1)gi^|H4b(n9*gNBmStULkma`>D~64&MFBGIgvR>1VL1B>2!x@+aUJlzIiVh6D= z+QZ;dM7(K=-|iq7KGQwcC=W2YjO*tlq}*|uU~60=9n#Ad`i?1$B2a~}HGb3j%XH{S zSPUKk+Hc z0PR#wKaxF+1s9IC84oD*K+Lq_x4zCM#ENFGSRp+8be-~=db5tK57a*T5cvRG4D3us zKi$c5Zk*#*$PIu=4&pr50@i&~tj1Ufr`t{wG5ZiKiK}TKgGX;k;Nb5U%kGYpJZ6@n z9Z?OPreVYIvsIfO#@6_wkBD(6JN-QRR^NYXNc>2rSCzR{a^_m1?2&RGa_JnR(A<5q}U?hDWiqI8UH|=)L9CT{nM%v~BksH#A1f4jWm~64co_o_ z=XJ~v#p6Cx-Luc~#uqfa2Iuuc_>3Qv8U|b#b8J0R^m~Ng^-N27n9?DMr)W3usH8c0 zSZlF22ou|nKd2?R5`tHy^CwC?UPc*kA&ot$G<{#i^aT&~>QB!--+9zh(2wpMCPhkn zb#sovBYkqU%5)yar{7nP@Mv6$sl0kg(HXDvysV)mfEN>-q{Z4GP1dUDhH%tAADb2s z+kfXRj~&B0p(`_M`?W(I4(wI(bHPAfrI*L}`Zz}dZC97GkX%V6+sn>FnHlGuwZ;q} zV^(C{*9CGBb}!Qf*fya`pY6;%L7yJuP~Mx~Y3yD+bh|K5_I*4b%VYhcu-?^Vd)~$E zDHH3ph9>P6ye!k1Of7!jT=IVzJ|DAI-UXW8ufafX_PEIl3rwjmWBq`#BB*X;9I*bf zp-3ZPMCZZu3fP3^^s$V(VU;r$S?vl;05`!eaN@qXb18r5w1bemQNZh6%#=0B06(LFIhRKQE0 z-dQ!+KMUZ~1x|kaX*tp@!qKwxR#Og|5)N=cViO?N0~?OTg90kBwm<5#jJI~A7v_p~ z*FW5z=P-62r;lbdYG)u}Rg9p&m+`C>s-sQ?Lo00=tB@AY$1}ZNHUZpbA!f|yx9#>Q zOA%HK^G%UZ5(Fl{Tafw*b&w-87EUC8I%ZWj4Z=g{g4T^vpxYtt03Ot)VX(NP#4jVP zivo(CIB2*yN-raDR6CVuBOM$LbBgl*DVlKiH?#R~EQj#J15p5;sl%CBq1uC1)QD(cMo0Ti` z?HK}C3)-+p0vF2ddIyiYy%U0c`{o3ev1f2R?HW8i>vysd3}Tf-7y)>uF>9}T@>D0j zk1G5D#+F7!##v?!Ofx4d;dn(;!3?BmUVR6BuHqs zKJQqWU(%_5424`<;)xNL!9V8XN}2`AzJ~z<5ZRy7J;y&3_S}c=OgYAvM(Ir4M$rr7 z7KBS)r=rfrbjRS9pLp5f%BOnPTn|OY*t5!ja9Jq&g&=K#fE6XyzMe~eg?=PhU=4Lh z*dbsJ!`?dd002D|wL4Q$_ORwo8q!Q*KK5c?SqV(J6Ho`Zjj^t)$t2}i`a1uSd(sYC z91<*yh4w{t%Bv5haW21M$)7y;(0G;qeOk)VVw;^ZUz??D2*JNM)gh1m8|h`VI1hb6 zfQ?v;umzT92!lGY8KehzMdMTj;8ZV6O!X!5_Eh!*-zLtVYOY=QfO`<(J=V^?Z!b;l+qC7=@9rgL2QX2ElaQq3<4TT!-5aj`rXWx%#Rj|6`XlPC3GbAOU(S4qZ-<~w||@T<5)le zE(3PnEM4$nJqs*HQ>&C!3wG3 zd4M(u_w3(DUYJG0souRz*7e|wT@5}iFfY8B>r5Kgr_I>&Mre;nop&EHpG)x-AN+&DTKLJ#ZHN`w+b0hCwM}45C&q zF`st@$6lHl&tTGY=(&1HH=Ftpk2u0|0&bQSeA&SG)nQiBKTQiPucb>i8k2y7hgymO z{BXk8sUNiB(!7TZQulMv0O{&0vHMtVpkHVUJL*~baLO!h3YzaYXFyq{E2fgX zY9jHnQJ!Xf%m8f^K}!kih+ug_K63XXM1?YmNE2?cFS5h;SMhs|>3~?*zS#>QEZyk|MH<5w|=HW1|wBR1HB0k-h-xQi;SgQ>T2CGcrZL-)z-OOm-abyAXaK-VrRZWJat>OyLlwETCKtj8;LoR8u z586kegd9?TJkS_Jh|teJgIr7Hsue~*p#4}a3%KJx$T3%5f@FSzic6bWbn045ftGI4 z1jK&Ni?_3)yC%txq4Ig#&42!ykwOgr_!KG$X~zLtVrW?iokqJgfZ!==Ob|{Sb^XL_ zCU}m&6|z<5R2!FejDgysXgRS0?O>*IbNtBRwDzT&WU7t^rHvoiuFp%X z()46-=77}|NcBbJv9s)GN(c;dx*S3>DQtEb4qDaGh2Li;38@yL*0q*120#<0Ov3am zJv!;lgIVLU|4{~}!_zF|gdhBcI4j*Sf=s+b5Su-lJ~u$uPVIX9W8GY4#^aIG(8Ubl zD-%TQfDW5ejfXAy`m{!1+U50W6Xga6G#iDQ)VmeGA=Hq4ZzjcF8Bm|IFD^iO`1pv><~~&ff6(TF3pWCqu?XL>D%!W-ipj{?NOD; zMna2H6)w~)b+q@~9&$*4%tY1WMVl1Kna3Mqib47^qmrc!<6r3eLkE?dpC$s_^TQN6 zeDG>YsC62aoap(3q2PEW3@P&xO3uPTSpLD)$hXg~1`e$&dX8#q-;c!RUPDbF8h6Ya zJ`R%(wTqsK9mZmHDQ7B42g#*4&rF z^P%Q{vH0iQm>WBceTSf>v3w3~b5>Hv@LbX}q8>4U%T;w-r=JIRFL| zm?aeLQ=7;UxKWaxGU?CN`T^l(!&yXO{Wo6Ly3ihwn3*Ue9+PWCI{tVknN0oxYZ1Vh z8WPLeT}n=T78_i)oa;s}RdZfSOZ7P!Yz$#BFt_((`_MEv#XV~Pt(QjR#}Pi$)XQ_- zSICR$@0qfm%W{hOam9yEGTaffP<0>%2jS{N|KSmQI2=Ce>rWG55h*PI1D=S-Ycx8E zGsKF5*7}LStD@s=5WXvx4jb!BFnpZ3Qxv+>6DTJ=_q~y|w-ieepz94|n|*fOpl_J^ z+tBb5<*t34A&eheYxoM!_VuLADQoO6BXiL==MLG5aYpdmF|Nt$SkjjHrWt^=FA2UEE6(Ce<%Etv%QYAc>#;s*c-LH6a&nIm5Gb zXedP(;@WD;KHqtxo32-ESx+h!lJ+cPE^=i{|5h)6OI_T$e%%%|R`#t?z_APvO%Nk>N|9V~lA+b#U!eU$oTvh7SZoS`{R}=zi9q z9AjMo+zIt(Z6g?&mKB2Q$%(-=d-TiNgz^axSi;{&149>lj`){IO^3Q*1P|mo1GBHY zH?7|L(S33js`tF49MpDxg!&_wzVVv~3$L#+9e!oGu(LCoi9F3uU-BaV9zzjzl#ax~ zBTx?UNHn6gMGz0H4>jEMZg-_|Ec64A#7Nc{Y8P|WH&*F91>7793y}U{>7NnBTE&|O z{g_6JD%r;#Bf)1fx{z{t8yoZ5<{S@jR41ILuIWWHIyFT693Hb?!ty+Lc1xXa`{x`2 zvj^a92{mw~!HAE{ZJ+~&*`KImsp~alnP?7ILFN#6={9h=7tR2`+Ls%+msg+$WX7dc z_@r^>XT8cb@-lw{BLURS5xj}dt_z81bKycvCShGL3-mU4Xuk@75C(WQ7eb$UlnloE z?E`4!DktbxM~BPkm!Pqj2dg>46~?K4-SF{E@}u0F5rlW}1qBH}%QB*Q<_653l8Tqh zmY&L%knUN@3;<&`vNZJ-=DD+!hIPrFF}JwaL&Dn1-6gPn*N0*aDfQb{Rkb*mAGvYq zyb9;Xq+SXip!KQ+oX0HoxrS*js@-^g8dp|STD>E*caXL_5us}eT2JClp@juXr#Jaa zH6-nCZS20oYSokhArdxK#sFl9tlpPBnm;E;UrwO;sAyGBZboR&nzT?I{c^;3YiI{s zD}KGEPkJYgzpi*enQWojfB1=1-u9##Ih;?0*)qktgyCmBE7tDNnO_|rJ4a*Rf$}dH z1jecqn%_lHg|1y#r?W9+V!a^!zJ0fl)EGZiwK$d;S0i`mp=SY!nNd*!#~~=%KhdCO%rHf+0la1$iP4c_tlfKP9ndBsK!ZSDEvzf5cTn$$jxU_cSEI zno7jhFXxoTY(p|;;fc$gR7n&)Jjr(zJ!~A$LukbiS(3_r^m$(@3nu1*p-2mLJckr) zKaS52AlDaTsmB^os9(P5*wz`Jc}7j}40Ji^7=!S&5$)E*HhY|tK2w*dAX5%FNXrLA zR<^GxDdQHMkBqkw5B_J4v_`k8A*jJIXW1Sv4*al*3I8m>h2nrH2Fi5iG#0U_9si<{ zZ6FG5S#+>;h+{V6lj$SWJcFF)U&>p^@JDrGSaL5=U?yrhw9FWzAV7r|pwkV%y z)(%2~$kTRy5xRisJ~f&JA=956FgSq&lJFgE-OFy17APhU??9?65|?z`KGzs5GfYx? z9)r9NU`4nz_-o17+GW6jwyI&W@8*iVgVF&aDV=zc3cgGkA!daq1{?bc7IiAm{7kdv zbREk|_TM<9r2EIhn+kTap`Mm|(e;<+agFtS@O(6(__$Ea0Q(Nwfdrg2Z0Zge9=DDI z250hhNgu@b@5VkXq_NnSGMT|YW1rbTTLtG%|<2`=JGvkV}+b^l>@o-@tt#Fl|(4hwG9?~H5&NVwP1w6Sg zKmGPIsQ+5&-{g{EWsQZZk(D_3G0KD^uig}duIll4K3)gSTS$caKqUno*zf+r{b0wTIj z=gx1yjd_ZHGtoFL^O)luEQ6pAJbIoSuZ!$zvqj>XEPh$x?JCvkHh5aFfsN)MMOgj9 zzc7z0)jagsM1?g;l=NS!qGU+-q0})_cR}%>V5NKjDYWfa5Pu4mOFmg7mO`Qd*f34g zo1tT1giDXrcAgS#fWM)-Dd1Sx%^+cXnU`n94%NF*OrcZO->;GhQs|JW;4rU11 z$#5=P@WC|mo~g$R^`VS^@}Y?3+9o(`&9q;j4YWAL5+>7fyh7}OWvUh*O@^kH$-k9Y z|EIYPYte}!%xm7(NSzr*Z`*-Kg1{;EsJy)-+Zc}n9PYkKiqW6!aFPrW!7pz*w^Y|G z_%L@}Xx9=nZy|`*;lr9X7KEJ}EedmU1K;w`_+S($wB(i&{j+vXi$#?oyT_^zPW-qA ze}U59^jvsD_uy=9saT89fGK+|mh_=qvG5}ofQ;w`MnC=QmmT3gc&BbYpag8!m0^CM zYebl+bi;w1>7nJon+UGm=Tua!$!N^6`K*-Df2(~tlXDNwwW8UQBu|9vY-<>^LnC{% zIPATTaT5EuT&-VO3@W@mq8s#Otn72fj*6Kr8aE63faDUie@b)Z%k<>`HjFkn^Ep6@ zr1**r^<%$%PPuQ&-|PVfM>%1dLJ8CvHY&dsUX}FA2kxEm+~}sV`4Q9(Bwt!qHjM-28;{ zrA>EYrc;jYO~1ENj1b(K357+B6ka*`Uv4wxz|D~QG=TUh^m|fnDh10p9$NDx-1k=$ z-}A?5FH~_LOMSXF+m?42qmYXQ1Oj^2Ezk2aLnn*!eAPkiK~i>HLxE$bBP-|9Ch|5) zLWq3TeNVG}@}NKR4}*t0v$XjXVfY_wM*bF0=F3@PvPEP(oy(U+aeiF-mS|axbZv<- zGi{6QhdgcQ)8@Q4iKb;kU0X}acA%I7u|lg%PvcR{NtVXyQt`ourhSMX^pj#)7KvPW1x zo*QONo#sI7(mFUpnF;q5>*_*rW|s#SLHDg?jGi8En{?8*~8?oUo+9U%x-iyQBN)P#16(klqyndwr^Ph@^eY{&H;M`n# z5cSyl$K=G0+Q}%Gww_Vhmpf1638MyTv;&<5x`> zr({=JzG!V9u^wHDe+7>nmTbg`v?=X_4~kg-ka=U3^h`Zk^&VNSaRW436GbXl>a14V>`AbFam3v;xn@w+BEy=^a$EW_@#-&|8jam|@2bD)p_u z{vQwJk~JSIt^^I+bC?fdh`XZ2#$j>_F^sv|{!{uR)Azc5mCa_GS) z`I|o*5j~bCrfhsbgEwjW|1fpJ+sIVLELYI=dNGfK;4L^EYILGfu8I`jq8-o#ffl*w zx*-bWz-d{ioot3v)21DlPbu$rwei1en(JOb9W&`1_dGKMAq2vdjP+C4D53nJFgS=i zNWeq^%^N=OR?vjS@D$w1!gT4PRh#yX8M^6d_@3mn$4>cN(j!U(TvZ5*hK0$9X8P8y zNHM@^qvYnX&IZ>;+S0st+Ds{);u#rDO)plVSP4+hs*!oTFmj@g4TO0**k}U}zuKnv zGc$xn80Qx80M)+SguL!)S@l1h2){0**5>4Y(J4w z&o|xV)w0P4O`0%S_l^{h2mBI2ohdpW$0?RQBs#c$|q)E1XjqA-1n>=z%h)|kdtmtbGwG3SII35Bex%TdNCV9kq=ogyi`^U=DdUL=vg}gY|^AZdZTw0-Y$>3#dbDISR zyBml_gI%%)#upTUYMXs?Vbh4yK${2N*-FdhMXzdur@)E!GI1=1sGd-9k7%nsdp`#^ zCn93P-FnnPgH85vPi5X*ME!JOQP8z+a)E2~Tq$5k0+l~Oa;W3MP0OXA{kSd!Q13M{ z4k|m7tpYuxGme01CKVq*rNCP@Ht$2A^Jf6^m@!T+Of2D`;F4Bl7u--PtQsyY^#&!IwiympBV7+vMwf z@{}f948Riw!9hpNRfQv;-SAqL#u}E>`YZ>1d?;gjn~hwjvOxLq75cX2po{b z9BZ%_d`yFI8$!;6+bjNsTV?jkZhlAX-hm4=J2s5rs~y!dW8`eN=FJ*4b82*kfZG&! z68}XZa14;gYWf`DBUhp)9+Kv%rTuBMv~k2f-$x*!`nNu;UOjq|iQm-ZiTvi&8XvX#l zc-{f{hTw=6=x}~x2z65k$xbNzx0ix2NR+&F_{G}}*Yq%vT~bkUOy=-@)#o*k@W!-m zD>e12M&3uRHOPD7=6N9nf^@*L#&Hv>R?eaB=?dxT?w?K+<^$uS4PtoDHn}SS2L^3A zIdAmY=f-C`e4^f;qBoUG*4(YH1bvIEt^JQ z>D2H88kGo>1Wltb1i&Xd99lBwxZ(^Ks_n8bYu@88l>_-&4Smx)zH|h5IXV?hCf$I? zIvH5$vVuff7Nh4&D$&rW5S{_74+lG?iea^nRElAiPk?QgoOaE0u8epVL)@F|pCd_~ zBA*knJ)217^v-A03r-?_AIy&aZwos#b^7fp2xE)PD>@M42U*I@pHQcys>Lu_T3ht| znZEPIB>JF-+mA)x^$qEMl3#+(HcNvbf-AfR0lN*t*6jUw6#Q$Rro=F?j`P|Vmo!cj zMf~^a$hTQ@Jb+7wGZh1x1Wt*A6hbx~oMLHXBV{zjiL&L?uiNPC02Ti8*fX2Mc426p z*tuPpUs_{Vh04hg02}d2l3p;}AXIK*1$$soM}vBJ{9a!Z*=(jb3x0@~WUKY3Ul`%% zaN$g_NzKr!GO5`|S;gP&dVWN@mprZ&7&&-WW6uvf&$gv>fth#VoR1@_v&v(K-k*@r zdee6wG^}4&iL|3tYCg7eMy7m70BqheTnd^`)tX)!(iWBF!%$G$OP^XzRm;eHhRe?2 z;@2btzCMW|kk=@eS-_B89s(vb`=>Umq&7NIJp>7>iuvq9?1&qC$RDN)fFy& zvggpBJ&QjC9{j|CEK(~_&ZS$TwljGifZ?%hAc!BU14?ev1=^rVIpZfKz;K>E%Q~pk zvGN!Jy#EAP%AO`YQyEGcIvaOmBu%JDG3S_5mmdx0MZH{-VPbU=0go@(4t3bJ&P1lr zgeg=Bk@9db+b%EcTD7#0i=KhJ9<>n^irH=Y;ud&327omn=Qg+FZHjPZUlOp;SLFwyQ(qbs)-_>tV0jl@zP=+;R_G&2o+nw`N&)L^auV zb;BsoBk20g@4N@=Z`_tkX(AyF+SZ7v+6U6d+9NB#VBAee`7bn|ro0@?xsQVdF_@~@ zl#9=CJMl%px<^r8M5S2H3tWmw-}kY6`bi5QPm%)gizbMnJ%X{re2Qt;ZBxY+jMfb5 z#xb>TKF6rUd7APiF$5OeXc`vSjA}eq6SZQ}GN@DFvD?4hYexc&hxAaxDN}V#9)u*C zmUh<`#}O_fYnYGbjQm+38M>?Y2*<|KP}40F>V(4CliBXd!w~WF2x_Hi&P3TM=al2r z^SMR;6y-%FVy>qi!1-s%yo|oANHp?z1-;LM_w&vST>3fnjS7HqrMkAX#7E5nU#fZP z3o=?o--rVV=Kz8&TAaSaX;<~AL1&jwhTqy#(YZRmUus>{O*_w!&2{-ZBa>=sP{%8h zs;n$aVr(|#E+jhZryRw&b#1lt%zv9JASpD!nTn(n6!I!b(KyFG#kaB`Bw_^6Y~vxq z%JZjrbo>)F>^>7MU}jT5KT-Tw1bp?uVU|SU_qnHx}mAx;ODHp!5)a^l5ZqYj4|CSmfypbS9#K=8v`& zb0*U^NYXBjKHRByiT(Ouh?Kp4MlYgB!|s|RYQPW%5g}l>3&ICY93CqyMkhQ%5mMEa zxevY`th*s)c{C1A7G=l>Js2$U5B}|49$}m_sDGWUG7v<>vBI$yipi3k4-gUhO7*K2 z>Qxi9feC}3zls)M>eO#vgr(EkDx}xA#)v6TsN-~`*(s$S9mfLT+pM;3tuvbP!r;y* zC~NlT8dG34>JLV(Sz1y~DRv|f7EU3jU*PMnU(os%PzmUi#xo52DifcX2@87nqg&~BdhvKOB4QOJok-f*R?U)#($H%5@^B&zg zC>Ry|YNc6fKi!G;b0MDcGy1;|QqR_`s<4TjVm$b^&-B4=SU^Eson$$gsc4;1M zBV6b1J(S3;0M!=(<%acLxKw|*w?qrZq1Z-!3f7g}3*`KixF`ScJXEkHA3e-@Nt&lQaV8`(CdkO`TIna9*xkyP{3 z^X_RZ@C}}e${ixtF5RIRILw#3hGFR%Uur5QY72b1Ha<-P%(W3J?;{@pmCYg5vQwJv zzS|y3nOfW)jz;Uk|F&2jp6EMSBISzKuJ1Kzg@1t&?ZRU%!w*a{hBT`=sdUemB(LzE zROAw7fpgfa_^ntS0eX0!U}v}5!im3X)U(UP2AQWC3{h?J^8Uqy>$xkfGH6{%PXHT4 z(eEUEFbXenB8T{8_Iw}78F|Lu0|TCk7i9QC3va?ooA6zjF#s>Y!xcL|WhVpaE(N-d znQzW!brZn}+u4wjxA&za=brf0N~F-AhsmP|eSzYqX>*i0u@-&#IMhDRbN%|kxsHRO z$&_E$0h;1tO+;iy&gh(j0ZMRV=e?=3W6teee2hCOoUci6X4s8xE>OJ@YhsVjkHP{8Q3 zvI)}#EjXjC6;N#qi$+tLsJ4GRK>LHAo(bf$Uhv%A9woa4imK>lVi#AIoXP8YlQOAy zMPr@NtR0f7&Q;nwdblvPBccO;+3+Wo`z1iIhu+Md8%bldaIds;a*auYJblhkme!Z| z;ph(qH!APGMg1_@!0r20PDsH>{Iq3xABG-Rfn`Dm1(Jds#1q(J&3)X&wrg07TpoHl z?+9T@j6V1HQ82#b={W*TDQuaAvHxtCxZ|%Eq)SRn7Ahob@B5b`Wy}Kqrhbpc+AmeQ zdt((L&@#2din^n9(F|l#=Tys-Ji(%_qn`LdmUpsh1_=Qh+vtVEQVvWd@^@viGiYe( zaz>WH(vITmCw%(qVKdCb2UcTd>=*Tld>Q)C7B3Ic*w%SBI z2iHIe`wpDlvxmeu{+2(yjxdVTq0rI=4Z?A{46~=46B7wKnmd|8?QQ6ZJzlHvcN!9? z!OIFk`jhu1n?F{p75&j?rR^b2;ss-GseUtaf9i!WEr*j^VaFw%hu|w3z*bKXz_hmx=ex zbnFog(1Za}%$!F_8*ecfxOyHL`g>`As&u-6VV6 zih$V(j!{d15NaMsa~dzm?n~4bdlMIk=OMPPezvmtcd1v*GvG>%nQku#LF>=WL_zV;h)ZEjpZ_uNsm**vtT znKn}zHG0C-`t#l@Qz{2|Dg0>>FR+*qYQfUzXMaxU0;r(M)<>$LH!14r{Enh|VN=f0 zk7hfOIx;%wb^L+63nVX&ewjpHMZdjU>Eqi&-_D{e7A<3eKPsScYHmQw+0=S#U{0(` zG7pm8f{q$0FfP|8+`0ssB_!*+iLSjfEk{&mYNo4FUU*}4@RCT>PLrV z>u>ClG9-Ab`llej0_aOL+q(d#7V~-7(WC$80n!36Qop=I zv}Y>c6&qnqCxslMyQtm2i&!m+cq#+BoSJ)n+UT;}7 zIQ|eAE_td-O3N^iOZHN#Q9__}#KSw73A;yiYd#E%@A8R8CP}lSSadQ!J#6bqE#}54 za>F}FiDBT@^w|Hqv>L@p5Zx2fJWuM2neVkL^$ zuMSwlI^O9nV$8@*g|3&4`a6)FUe^1+bK!J*)N81>{+dRcL|4EfFA_vBI(}A#ZPu#I zP$LC^#t7&vPep}kZ8LUy##jmy1P57WrKueo3h6+n*YJYs;uDlT}trAmyzq!G+bxz;IV9`sI5t__{<&ATRnuNecX$%3x$$7yi_r8 z+hER_CW@D5BiV3xf6-t&@^~Fhv%~r__VmHwIEXrqsQDuhV8mHGk5|?c7;K#ed|ZjI z;{f6vL=I{B|b`~W%6S647TMHHG>5^LOf6y>Ie4>a^0UkOy4w9_PI6Xzkdc#|D}3cPp534y;9w%0j9@AF}! zJkgHliGymgvZx_6JeSDr%u5L2j8VDm`LXCLpZmHFegF^9N}XKr zdg!^7r0*gfEiSeo`Mc6-2Nj}b5;E7QYqa3L+gW&l*!UmxXZ6bh2564H6ATfQm4=d62i9^ZHh1C?X8E2o%>5v zl7X0@gAdaeXs8U++@f=%2{pFM<3X&h?7MK>xsDe1Yr+gDDC$sIKDq?Q6_(iEa$<_%aUW7mEByd^XhYO#tA1qVJ}Rl& zQhW%JdCiK~rf*F7M7!%IS;L*fgayz$8NAP7dP16Y5D-MpzVG?z{>I}*OiV1S6$8aE zNR$+|92gcfS29CE&9p*60vuuPBa1QBu^O|WMN*Zq$fI_j(FM)&nz;3}!eEnRgV|G< zeO*~~?h76YR&5jMe!I#?Smfu>J-kSJftU8d!dH3VE3giF+v(U2R;lX7;9#cc&Mba< zINxDC3kkL73O}+u^#r@Bc@JPy?gv?4ygz%uUwe|E96Va8ipMUrJ)xH+t&?)>Tmj(L z4bUm>vN;RCOh+2wh{NNjNjguGrOo6a`JqmTTr3WT8`cEFq0hQ7Bsk^c)&kr)^M;2$ z6mldYF(GIT^DNM|I!4>0X$>0g+d_MqrrMW`w++(AW{BI1_atHU7mrbq>Ne>FON-bX z7L66)%A&)~4~2_nAlzM}MbgdjASMKB@1veG8Ybb_9k2rH@XMV3;K?Iv4iBZ^?2&-j zkCd{$U{lKx=KpJLP)X;7m||!Ib+2(*=8u_8>R#eZt}fSv^=&TiCyJMB)-S3cra`r4 zb&R!n#9IaQZfmR@f)Bfao_jDlN%V@U^%h1YjLjx0L$1F)80z7=u-43?tpaeP?K3B* z3nHfoX6j)s zm-E_Y_|v{@(7Ln2QtEv6l4K=><7k~<4Sj#(bm=!yl+ySt-n#xn)YjkDY4P&%_??J3 z*j0RT>`K0VZQ3-FFgi=pkju9%48IIbcHkdHWO-_yCM4`5w?l0tVVbO5mU?{;AS-zB1Ocs&F6D_k-ghLNE^^#{O}a; zaE;xNI2F4}e{zg2b4FF{sP!4@EOeTbuV#_{^jP2Xbxp^ch*ui`)o?bVWRLeK(@dY5 ztAvB;+P1X$1C1m#B_g+J&tQA+*{`~cX}rusN~p&1qx>cif( z4;6$@gRa92)|_e2B-oxPZikR(IoDGKomXuP8)Jj>+W`LmX#3kNNs?s85+uYdqI>@v#r!ZK0zk~7s-9I{bIx?W%m{ZgRS{ zZpT!W^0LsW1z=d=+*kVTQesT4;nFesVh@%(WMz}>cNw4y1}lwAl5cvK?Aws@uh@lE zf5I?#|z7Mwhyb6AVTS}j zE_FLJCTaoiZoGqG;uT!Cr2?c zm>|*&)^<`cZnVq|GTO|q9gluUFT|tHoZ0iUr5LT|jHIEO9Pm33k)c=h3zq6|S*+rc zmjWatk=D?*vZl9{gwuIU!Lbd;eouZzTk>*9qsn8?HM$Hn9H#1n^-T&i;B25fAh8t_ z2v~xf^J3L;$#P2E2-gc{8Ym z3VeDhQ@SCOCqony7D;QI6x+-|7+f^dAi4J#z%MJzseCUCI+#9b0@whHf$BLvM?)cL zr^4d@;`S^K20lpQP^}EKJYa0ut^ReqN@sqD$nuCsh4^9}u%lf8&9^4q<|y}Q`Q8q& zv=@`dgOi&r(D9qR6uCT5s`Ywq{Ip=->nSYlBBCYPh9wIeQlTMolha!uGGv};CL?IO z9&N(D#C|4I81ko3tmp?%M4t)blP0(|z_9uiT4X`{1VQnpKg2v2g0!U8Bm@s^_I@D+ zxWg4|TcOj%9qaBwrf1r_^jsVQ^M^T~KE)7p+m$ijprSb}n&XPiHTFvx3wQAaYf*}^FU15_!88Moi% zWr_bH^no-t?l|=C7sgpJFCK06X;I-ueSre#G!+AVCScNumkxfkgv#3cHZisBU-ZS(B;3$g>W8fD^VCpQtU>M!|KKPihZRWRNJD!nN8NGmzT+4Bd*T$7eo(K5_Q zvHW!^!PjjUV~i&nI_>%IqkYu>5d~tLsC$CzYqw(iEY73S3&=Jg^jv%zIgeAzL>@3I z<)zYDN+54_!)sv2r{q*J8!fy+RRA|HUfDNidMsFcV5OCs|Bp|F51Mu?F9QY^q?Y>W zlhP%U-Q--Dhmk$_@Q@Z`>A_jMmykPr9DpC^d=g{q9G-JjhjLcXF#IQDf^A?S;*u}`pB<$3wR5?PQ5Gmyw!a&B3T%Gg5mFne%A2m2pOmN? z&@uS!;sP|s32;s(?0t@grrC}>rX~E;0S7oW!(P;Uo1jC6FgRs~Hew)*07H$komlmG zW5K%$GID2qHLXQ4F^Io#q`*DAQQUF~`jMC$ybr`;aunhqIHjyojKQ)<=A!9UI}gCh zGg^bYY6#YOGQZ9YeDUTif|+^SDg@G|AZCm3dY3}N0JBdDsdhH<%geTdSM9UBiz$G_ zrqkz981@IvzdAD`kq0nYY~Vn$hRdbBqXmrpmu9G;YRIEF#+vcs&R*z<3+nQ9lk`hDjwc_8HmhYk1R~8E9HBi%N3o#6JEM z6^LD$tiIuv-9I0hHJqc~xeR;}pzp)y2-dQ)s`G%n=2I{fWO>v35*_2z75?z^W&t=> zz#jMNmhB1LbY{g9&&U8hrWA|!NE5uKaPLLufntW7-1G))cFVP01m;jQz&dWr5qt~> zw=oMd=;4|4JaVeRkt+{n>d~a(!uU;s zxzv@NRQ9a-r}F}|AHdFh|BxzTEW^$GZCtm!zrDMcyJv)Yw2Z^P&M^{laFnmoKAV#d z#b`qGVcPBUGs1c)61l5&=-4tyK!~6EwwRsHOv9)!q{+I{4X6d3vXI8X>#YS+z?U45 zg~sNU!~W}(`8r%nq=pqZ8**kXVf-V?zL`~aFHdx&!;K0?D$#Ui1`1_wXIVC#GUk0; z(^a->c_uQn69L$HwL;|k5Wo)BF|>?-2Q#Q15Hh3sP|zZ+lo)=7B73@I7!+8m7)7G* z={CGdoTeTUFakz}9XPs zK8`ef(?TuI!2u6C_S=B|Z}p2;CY@T~2r3_g9LHhE70ixQ?)kn<^Z2!m`6iXd+sJKT zHM7VMyG%`>@oc(i0coRGf?!N7lQ`x}b16MQR9c4GEEaT=((5v~yxGnp>=Nev6XBlc z>;S@``&qhW0_C47{qI?Vy@kpS#ULR@!qH8@Vw&2-L(MyX80nhYz*Lanl6;Jgrs!gO z%gE!X)GKwIgL3R~8*E{HIL;UHqV5BBM9T=8Wdq@1VJ$@TI4wBbhnk>Aq}X|*ZWNOg zrlZ$!uMgyP1+h;F7e_0ARasg0)DW!vgdeqNS;c~)sH>?3$JeE><Cg;hwL}u1wfCM3jwjwvG+poAIRi1AhjpyFF7QJ% zMa+bFLBB^Tqa9wtQT20U>msTy(Ig#~A651Mzc2CYR6z*r00X`DaKUgm==~NJ#?jGB zIC7XdXCw_;wZY@xUVm2rDeopn?c>$YTmwd=mihJ|aqB#!8RX#m6VWYjmC$`ut}UPR z-k_Bwaq_m5h8@As%sJOuG#>wRPyT1mtO=i)=Ay-qfbI#kUn(5wS?}+QD%4%zjxvMzaVEqiqGHy2N8aVd@&TteC=-k_rjQ8&x9iySm$LKppp|jAfb*g zQ+!Uc(ivY)rfm$ctP(RJw>;Cb%pJiNaU&I^Cm*EXkb_(e4JlwF!dGqGGz}IbSLsx_ zJHXct9`#x`kH?m14PMTRMId4)W0lyAV?^y3|BiV=Ui{9VUz_v*b(*SmAC-e{8$qwZ}5LMXNK|`C< zyy{Ud8({~rqecHI?NR$+J6Fjx+^3xTvd0UNFS)= z&aVHqP;Q!txTAGwzr9#0Gh%7J3z@>%Gwkm3udGzjW2n|PpI%REnQkjw?F}cM2WID# zOn*)qTfakd5}MH}|7!~#`nN@&XmPnIHzS_;BJ}di{)v{|i@|kUw`^Dm4m_OoRh@nm z#9nzbN_85>ZN(LVjLpI5dPz4Wru*e&U%rcSVw+($xOPoVqW3YO8Of~?qMg>^&gC)) z);~?5RSj|lJ%GB^6fDX?ud;6{1^d)-TZGUNpA>vp=8X0oamaEWE!YMYbIT<=gE@-% zWjGHK7eUQ)==Xg}!5aB^BTciW#pO6j#alYpS*W{xYYcSo!5bov!a%qN?HgbxOW zUjA3i4HUDNywPXp3lnq&5?W3bNu4^DZ3cck@$}aPghjx>T-$bGaTr<{v})02eOS%} z+_koNI|0of>EK4LQgg6M%5uV(LNExfXtijS!G}}Lq3>bWd~}Ed$+4WmKKw#qM2(W+ zLJWLbJe!_I(e|*jy2Y^o{T8dy_gUsuFbfT+%N0BHNs~>Nj&af%Y1SxL{+HJDFk`i4 z6SnWqe+1n9(|oIa2w#)ZUWR!Pd=ZUNgBZB4S`zD8!5OF@B0GHEA?tpS0RVGi+0b|d z4^BfgB8C(+a_M!&s}l7eZX5lJoR12-i&LccJa2G#ExJf}Ld-jr5?(YZibv=c^5xLG z_u1xqZ5^DQ-_&|OOo@+~%6tF@2Z|X&5x) zxA!bDp#}!}cL7fT|pzp=DHHIP(j4?bcEf| zIbaF2o&JPe9MunUv#;NFXjfFk+6PQ{9{jin=t|%?vwfVk%iQHc$ z{l$n#kk*2zRnyfD-u@^5Kq#nUpcuEDQTivAq^Vs4dDV5JY0`4+{qX&Uqad2=p6C!3 zUwgl% zpUUPHV8Z&~+?p6HlK4{jVr|!YEv8zeW<%e$m>FNu!jVI98lE41ChcQM=|v1e-G^Lo6^JKD3zXTT{uKE>Ee_eG&;=q0ZXW09A*4rJ&ViQ1L^ch$M+IMPv;oHA)0GW z;yZf#0cWKY=&m`}C>pH!^AFD3DB-YofGMDIU_}diM(adX9R$zzpOgK~|5m}n-Mpuu zSOvu>EG&O~%KDVsT@G+W$a0;tGwalm$}vTCU@W_3A{sfJe+}Gx-kuw&*vy~|LqXUe zER(~hJ-?8XXi_J5sp;{7(kR08AM#quY7$Hd@=JOF5B*3+*SV(Jip<%=B4pVPVlz|3bA_GB=0L~$8j$u62)K+kwA&S0 z%7GDCXc0?ig56MbHGZ25sVitYDfjwY!lJW_%?Rl5rT%)HMYWGkH)(j^WELmx4J3cm z%3kl>j0s^FYJyiOH0hBP9@4Oe_mN_35BZD27fv71H_1j09G_>Zbvc zpLWcV^#=bSz4`W_EB10l)>MdiK0e2=g+ua2+8v~Nt&U2>AT?F^DSCi)ZN^D0rqjgs~^E;9C1^W^jLNhVc2l zFtq-7!OE5q=*<-_Qn9&l#1H4>1sKTCXCU8R*z0f~IsAJ-HtQb-kkf*)pl%aB*(8i- z0L*Rb+Vlvkt<88=hNdxvs#$P&o0HbS5rEgKoR@~ljL62S_e}{ki{Ly-faTn}%iNG( z3lCSHb{a{XnvjS^*O{LRWO?lO%~G(biHCDT;fJgvAclE!Q1&3Ye-?0p;!?s@1RY<# z3pK0h2}47tbvBrTQBXaPD{<8CeSLT+y!ORp4zI<$YOM17vXh519m4>NfO{Me-}*xn zkP5YKm2=H13(~|l6zg_qTqR4@B5`hd*6ne@zH_?eje!jg)Hn*Qm<{R7D=)&1XmK6rirZ3D>Wr}ltP@`V{^AS##0zeZ#{H?E`i7qYa zjt27*PRlbuYLi-uXTASvWL5E)~mEIxhQR>GM9qF#%uk!k7 zQ6mC}gSz3^lWM*mFk8g9O??c`svYZE7YBd^b8xH9DFvFOzgZc}8H3!&%%GN63F%@T zN8z(l2E^(&(`3Xql-ur7s)qG-+})t|_`%)ZUggck90M_OwZ|;uEOMEuI9PrL@rUkH z;=CDCShs$xDl;b*G@9hw<@C#3Zv}?y-BFnJMCcG+_!Dm8v9FT1yp9sY@=Mq5lYzk? z6*8Lv!TV$H*GbcPm6fD(XXp#YHs9fM0j8JFKW>Kf*XG0SL>pWBd~xHT8FpX008c=$ zzbWO<81QX!!f6-A&N(8DoB1n za9(b4nDYZ6^5*&tC^ed}OoT_H4|$$uqCr>=s%Lai4>qf7qzgshm)n^Pn>4*06gT0= z4=2}D6KxxvONT7${!J-cJ8mWmlBE_j z;idaVg0?R$tsi*$lg8lo&;qqOppE>eKevn!4|&l+W>mDR{pQ+N-G+J0O2`!ei~|g& zI+cPLMi?GC+w9=Qf3ejIEvYO`H{rsJnb7C264x=EZ&gC0B}fo(>DSvV+w?g;DZZzh z$}Kd+x2e&Z7fA#ed~78ZJ(&284D%LmX08n3$jqs&u(6L8w$giP5V-{8ruCp)`J7Nf zb^;j*e>3Ob)7c}cG;?xs-F_e6C@TWznX)2Oo1`{E^RbLEFu2b}$y&kSIhG62ng&)v8N1{oU$F#DWNDXs_t^$Dyo!DXB-Zn`=sB*VI$)4E}*C^eM<_jnZwMxtdZ2g?)V18ZJv?OS@#BAiM_P`BD)x)RbdL zZU`cwZDg4-r_)xU_#alHZ=)`HU#?AU$&&zi4;cmv8?n_FH4Hqh0ayZkwmb~3pBoL4 z>2Q75wp>#$3%eCg14T1d+`%m`06QZ`j`XlRkVu|8@9X22)-V4-lcM&Bp7AF?rwrk# zbIKjUK~cWxD9=@aMPZOw1wd8k^vJry z(e9}tm|_e8EZ4gzJ%Duum0lip z7ECjxAsi4=nas|8Fe{+zt>#Fkq#&r}di9PsBh8#F{;_0u5$o?yeL~kOLa)n^{=;ix zcR-TxQqJ!_^Id9?K7vOf*ft@FCJ(3VS4Yz_$-j;e@UkbuO^Y8>t9;tpw~v86aDbl} z2Tn`PIy48a%B|2lkLAn&+c4tnAe(W-pAJunbdsM9<)NIRRx$Q)*#ZE3fgZJ9L{pb} zAZDULAHE=x02rE}HF{2qFgc!(Rn;P(jb{Q{mg=YtAIlSBiAs@M5gczm={|-?%cSQa zbEufJaTuojlVPv94TgWMn$a@nEn|ibQ;acbmuQfLi9+HJ1<)c;#S7yoAfIBd1NsPD z14A00J#HwJVT2e*^o(eVuFnyL|DfmrOrdtX5OH~tbUPiD;LfmbokFet`Ptn z*JOv6F2b1o0k}&oZgS(;tdt`oX1WU(KPk`J>TaPEFr1K>+$q@VhrA`f_Y*WtX56=4 zBUG5e%xr8`;waK;t-F5EF)`*X=v#;$bZ9Fa8ntMGD#~mDuxAtw0RM;48zQc04#*kh zOwmB=XH1N4FxA~EyuNc>ffW@U`m+pYE2=atz|0V)FoDVE&D4mm+Z?91E$ak~w#-iK zu@}_HEXA(Is$Kb6fdQOflp~309!FUnq(zhG%;?u2p)(}xlib3mK8TD$m|s>F^RmFoSY170sz-N0e702Y&w`mtxzr*F381#V z<>xjNAWEBUdS#J3Yu>?R|HF=t+2eDveF zrRj4q@!qa)yEJ<=nAqndlsg|RP-?^7Wkw)QbHs9^#tcZAl#&Q7&jA?f(@w2C>wYes z7V(=GUdoloHEX62FDa*>YeX^ofQtm`A5|4@ywhv}asoA@iOmXZ2K+&Lhfm^rOEc@% zopZ)l;nq((i9-#&j(twA0pFq9>8sUBeB+)nFfsGRs{d>Y;17;L3@|oDRLYfG`h~C% z|5BV%25xV23hTUzkjde)o1lQakl((ehEogZ$x<^yf~_xRM2*I4vPIFDr-#_okC%`S z?uZsg4zQdGCQu_Bs7XK6=5d!}k9-qJ+8wZp&i3N#c!~5IuEdj>`NDL`v>uyFICZZo zdHK?eEGL_u70Ut^woq+_#7rnmMXXcB7WBrHh~t6@kfhuIQ0zDLrjI(N*m<7e2Jtw|Jdjar%k9I<9mf>22-pvv;@(sOCe#**b z)r~j}2Drr-*x`N?406(br1d?pj#|YlI!&y3xP9TV;9xcp@HW4H+7RH`xj>h6o%!2% zaeQo)fAMlQoVutpCf3-eS<7?-fNJS_IV#6cyQ%kL#h_{V{3abDAj6Zr1VhRPs-r7s z`S;gPJ?}6L$3Q7*2KFi3i1|(BIFU$GbdQxtUpVxHo#V?)5-EBVWE-mwu@ z#nEy5PrGI@4#7>GjW|aJ*&Y{ToJ~z3a%>|+o1wEnUF5bp)f%&5o5_Fq-8J)%*azEp zqdY0J(=wD|HrWMaS}A8d4Ntnkibl-SSR|@km-1~K!jJ%YvaK1T;PL}Z{O8O@W^4pC zGk|@IoIxF$UA`seB49aPsBpo>ota7FmUVul%A5o4_N4Eda{$BWbW{xo3qR2W1L z^{3AzG>HJPY#4ezpi<{C@55-yzF)h`1Zur45tjG3K;^O^NYCj<^O}N*2v@` z*!q=7C=qNMD> z3UwymGyZ7ax+mb0<~9Z*n*&w9RcI#tCl`GDu@QlJyGzMLAA|iC^_DRRj)Q|kv?&uM zB(w$XG&<7dXR?K_OB!b%>v5F84S_(ZFfg0L1?e^9*WbO2S0;(lWYkY#Htb+7IM_0J zI$6}0CqHD;L{POBz#~zxXcA2_OG!F*;dzLirImmFF?{FA$kt(=ULu6M)lX620rTo| zmZ{+S=1w@aGKRMruHQWVLv_RWvL?_$lyMCN44h5+5^X&-FZgs%V2D$d`gH|Y*1uzR zx1rMxHAdseS;0`6(~yv`zJ6>K8&(%3!VdgaVT7kPXC(?La{50NLO6*cUV7s#z~sX= z`=TNAbr-ZSWJ6~(a^frn?H-uY$f0|12`yelcZPZTIL_X7-kJ_T(8$_9Fbu}tx~w+P;13-NN@*Lj^!SH*D#Df7K7ggCK9 z@6XyN=y(8jlm{aiA;urx<3oDE=S4N}gT}{?I&-JldJo&12TF71OFC=+HF>+`woj ztuKaeil=vtsGe5&)x!n}Dg zkVKU)Vw8vsL|Y<5o#LcxgO>3s^#5@z6(tIHiMPF{fMaTydRbp(7&p_kbHf6%#`I4k z0a5zMI4z)f#z$=hrCNK;Jt;mz=?!T?$Yka;HP3Dx5L8YGWNjFWHbOYr5{h)R4V~WL zDNDcQ{jfFkwaKT~{W)@sz!+Zmz~@kq!0g(7KZhrV^c?T=g#s_$AKc$4jQka+?q)bf zfu?};?G=-@t;$BsGhm=I8_&+Djlo^RaDRplK6AIfk%G{UGjMvU1qW(A=PfP5wG?)F z8DY?aYH6(^R$3^A%wL6JJ-9%OX4c^BSywAE=A@4TCFMTl0sa$Mn}>r>;@M(n&ozqw`n_mmWELJ7>IM^9kT(;diG%&q`aTI>zQu=zE%_s*T#2HY82{K zWw+02?i4AH)`K}zbIiMm*=9^csxCgrV5GqDQ7UZ{PzpN9q%gX4F`~{5SH@q4QB!tz zVa62wSbC5ha7sU<8;p#{@&22;9|Ufdm^0{EhQa1hFzb-aD7?**f2qZf3!CfW%jIX& z=%ERq8VkY%HkjVTP!p_=5utXAULaTcR^{i15ur5wfk~v&Ug@0mUl}Fbk~?2dgcY+U zSNIwK&_GpolMEsS6X=vw*E9{jeqlho+G7y_;mHAmRv6bm_2^7dH8D>!swP85%J27b zd}$I{8{0;4Rpurca}bA?SW|AWS1HXSHTchCCrvrHsloZ%H*Ce58}wlVN^9g=YX2yX zYM9$yhiP4{GpJ-LKb9W?GioThqUfSsv@se5;9o`Ag@PBo2<^fR8a zBWV%P+Ht#b8?d3oq`;bgs-C>#L#i+|=a)%dTe*?tBG`jjMPezGJ|5ATsieRrTM@}7 zWkPL90iUzSm7VK=;qh_AmH>PHAa-g*fsZV|4`1oJ$|s(OCk2=3?oDz8f4g#Fz@je} zDAopa4*Sc4nMSJO*fLOlyw+9v0`nJn%r^}Q%21hOl0HV~rUj%Sf#-X}s-k&Qe&jfs zKJ}aF{H)uxb_P{g8Znby} z^T_pU6}M;fGAa5zfPx<{GbJI{B?OJ}{(2?_B}|5v40}`4NVs0-|Gmc3^ebY}MpPY6 zLP(}ia>}HDq-rHCzLXoNPub=vYCXhZTO`Ykbtq)nXB;PCc2S~aCRYU$na415V194O z_2hR@Up^r$EdPvpEIr6Uut(FPInFQulOf~9*aJ-G8eiy%PR>P-C7|ZpDp9; zHN#J6i!dAaa*YyoLwcHoB$}DptH~QOGYUHSt$m%*Ggee~+ucUu{CEL5_#Ie;new-z zZ>_~Qm=I_(KjbNXQ4kd(~gX#HB@8k1ViU*`An!!c-5ev5OqdkkMeTjZfV)G zqN$jFhAtD?&;51k$6SMG8LR)AfqQ!H#fhLspN2jrWqi{+qyY8m(pk->p2^6_*3B_n zKblOlskgmS+V$Rd+(2k1eC~sQ9XBTnHz`six0^Ht_;_Hiuv*%yUdQUM=x(XMNsJ{7 zJ>$1E_ozA&4qx{qGZLE^bW3J|WPJKfJGn!l!l36IGv})x=TGf_puqyHFn^v!nCqGY zCDon=k!4UDqW|_SV4Yb~rbw?hweFzoOPnK2iebPtD{>w_T;TA}AvwXOoeda5-_&s9 znX=oMVn^_hIDVv}Fe{P}P-2OG!^yAi3mSWKF{|p=3(<7=X?A7>Y06AAxp~K8(Tozs zHW{i3US=z&Z-aBLk&ZhO(v>3+YLtroBwBU6pWPNKY))>efM zu1hw~>Xx&twJ|o3bZGutCBX{ywC$(47k+M?9hii_o7$C5sJ*liM!vQ@6d2ufVvu>C z=Iqz?{0(CU4O-LBZEs1=E|hKGnFyrKDgS<*|2*<~=&{un4f&7BkR{{14qpRO`7>F45w+!5F;=AfLa8j!JZ#Sp@MR-(}c|ke4Ppb0>#|L8;lm#TF z{N2d>Rk5F%Uq=9+m5|NO#mX^-R9&8W zVxeL2>IU6Hk}yr`S0F&&HIzATa-GuMOZRWMWMF z#t2*xe=ZO5kjb`)w=C-UYw_VGv3Xy%>PM8dp1@1!*RlA!)J)tu(X5h68BkL6U~g^0 zV!rw1(UMr=W(2cxa`&x+0rXp1&r=@{aolibf zUkw~XF6=x(%L`UFi$yzlZN+d^U_hdlg1af49W)&^#sN6}wc*Hxr)1R&jSK&F;~)a= ztm1iu<(>>I~H@@q`gng@C3op1bosmAy$kY??pe7Z-Xx;+BL*xzMwZ%g^{Kn+dDBl0-aSB z{u6Yw*D5Z4C`B;!UjhgO+;$Yn@J6X25Jx7(UItoc0-jVt(8>~y)x$G)pSXDIn>bV^ zyZ9mzlJ!Y4AaVyBc|nOhOt?4H9h!59-nB^ONdELXTV@$xVJ(?`9`YRvskEZlB7FOY z2NsX#^#oC=u5Z1eBV&@&AZEmM>-X1qAdmVq;F}a6)_q8RKF*zFrc{GP>M$8x1u9qVV}v45>GEvO1fg&TJ$u8< zrdns)iPqZv9)N%F_IIGDV)^3)22l)oD}8T>&)utsi*ZTm9kWFxW|45y};V zC(}$Yg|jeJTr6Ubw+COZWJU=uPVOilq3jzjEsYXo^$wKHYe!`XUvcqwrPw(fp;l*f z7Fjv=gYZ>%Pt`nFUS$xt-h|%lplOcU6uP^@PvKt|@xZxJr3;?ZF!~hM^O8`94@0HL zr~B~my#KaH4FVuc9t~yPMn0{0dDU2NLx=EQ#kRKSh@@%Jo&7VQwK7^oqZ`l9?dI4B8MsaI;JdV zM(N~$d!O6Z&gD&>#BYXZnAWw?gJOO=2ZjI}u0jJi(ba*lYohDuNu#3r!|%UR9xuJZD~pRMw^<`ie3eR>hOQ+l8P4IR!pYA!3F|$>Tc5#? zBBXnQDo$m}+ZG9z5;{1@R_5Y5xD#D7d;;)nB<>j@mvVu-2KIB1-h`OQ84);v0m6cj z^D~}`eg+?ymKV^ZQBp&L+}sxisg}N{rD46$z6OkJvVDp0Ce)0&#z3s;pV`LQc~%kJ zvK`D35}weo|DR}7Hx|5BhK~z1(knyoR93@;#O20s&I?Kp!h5cSze96Y@-yCA4~?ak zSbb^?UH*OuBJcshaHgvdA20=U&%(T{t@6=ML#3`~d3$iOXAijQ=4}l9J_EKUfAUcC z1j5kENd?sPPS}YZX(G_Ilz6FMF53H^-3M@%g50>nP7Z_Vsl+>qQk~fW6n+D{E@y7>X6h5|$E4DbBqwIIDMPUz|m+8&);*B{A&mQ!4Oa*Ia}Q_5xL zM&Cv;_2NC*GP;(LL6fFkdUtZg^!g>?q8bp-GdK!f&T~f5-TPq0tGo2Zu(77eWd@0Q zgWHZ}t$>?NLCY1ix?Dq@S%7ru4h|?c7F&%maI|b4-(EOr?8SOkI2&_ zQb+B0w%J~a*bOtB$Js1m(_rpZnha?&;aeq-$;C8ftv0C?u0Av(@bOgm>OL#}USLbh zPbrcbV@KcZ&!Y_siGXnL0fkYwq+c6l|bq zD#oqge3g@HjE9LO=)I#jsiQB2FpIh>Cve`1yupWmyrAPgh@j*t!K)#&9lr~!G*PjJ zr=}~#5Z2&xdBDB=@_;HxI&Yr2>DrAqvbRW8$@$cxPOs zu|J`xaUBbeK48_W7~!vyC3(tPLVCtl0@w>KVdQzjUEz zJ##r_0O#76_|lpoQxN>bA$|KXo!SJSXyO0N{zBb7S-XDP6I*1H5W(xuh`93_Ddw~A z`FU6Iq)*JuBrU|=7(7}iWDf+JXEBH-)%|{ZoA(0vUdHm6w6t6X+aC<~^7*R4lDUSm zZY{JKhe!MupaslOO|vU1<_Pzbj;|cKZxFe9kzT#21ASZHq+{i|9V$GNjUpDRWLQ9Q3ECG7e<50E+gWh1*Ge-oestkCD z3_&EW5`K`dfzfD)mCu=^c(r+aW5I_>uC*jcozSp>h8@ao^^t}QWIi`S$q!o)J`TFO z<^Cya{2*c`G}ZJ#P|0g_vKh4W^mF!*H2V=ep%)`*!3c|4OvYQ{KX5=C@aY8sK5oi! zf6yfq@Pk_ML_!1g`AF>TlSLl*kfJ39h_xe|T<93n-@ibm2QZE`+r^F320`FQ>R)KI zR}i&zR_1f&?c>E)X&7!3#(wK8=6MKXLaPF81WtvTuN<(0{C?{UgLMO2pLCm`z|DvE zty=VXqOGfSwmQug%xoxlVPe_7hUbEizW5=q(QfoaI1MX3jvLr-&0Upt+*g`%Dob3) z+yi(}GUJ4`s(ltG6x;pt=}nDZLXmntj%#BvoCV#bd=9&w6UQBgf(N`w*N`3sQRg3}mxr5|h&N4RCR&iew5De0QOKtNF6)=qnUr0* zhW6@*8C_^}%Ff!?u>{q2$AynCez+AaJ4c+fnagoH$cE0=F>Zx>#{D<{4J3Ew4chub zLvhBizg9lc4Y%VK~eF0xj;4McX zvH|HBtlrqqdD@3%L8q!SMr)j`$lKip(SeY?!}J0Fakwf1ll#pk!+s!^-Zst&h@~{2 z6(eRlMGq-)ID*IR^3o#U7C0CqllitxUbv8*9OTTf83ym?iN9r$HcdV0dUwI^Tl#Cl z*^q%7G3`91nJhw7BM@!z1?h$e*S!^S7%G*6 zPy%VdRm@T`%m!Gy?VbW+g%Qir6-?GEcf8do|!$WTC6Xn;E^2=R$k^JB#cJ1Y+y(qFAzF097$n*wUF1v}ZX2_L+ zp6vV*ZHhFrXhJIYN1~{re(q_TXS>Q~Th)WOXMV*gmoAB2Pz~;@fMr?5ZjOG)^uZ|) zT>@KmW}G}$$8pX{sM0=2Mu;yvgi6Zy#Oj3Pk$^(ARZ9@Mf9Y8n^{pMlg~y>GKTVRa z{lm``|NYj3DgoHoVM!Z8sdTt6-DYpd7I!Acb>gTgA@c@BAYB-7}z-DVi}ej1gZf(Baol93`4n`jt8Eb41uh7sBg?(_QnVV_|fdCp%WN=F_}vrSEH zK#K@tWyLS^oG0FYS|Y<<1eyiG+0>-_cH#I#-G)Yefr%zH3#(T)b@)_xDxV$#Lc_J} zz3H-u860E(fa7OvOLP6Im?xL%9%yq$Lg-xqxoJHSOg#!u2|p!+AEMpe@YOl?O$mP- zo}GT>304#gvil9(JK1~B>wbA#bK2hJc`=}h(}zVqjGIj!8TSdlr5xc9=)!oTBd~Ho zj&yFV?u(NaKqGx_!8%N7BAMU44JL*b1&3F#VN9={k z@fl@BccUFELaYh<*TIM7HJfFlBPl4=nT3tb7)Wzo-0Cu1u%o!GYB2+!sSo$?p^d2ELAC2VA_2~5=9Cz8)0 zP$_o(L9EU519r=z8GJmAT`EgzK1uWT+cs5DcA{dGsrXE|uR`k@+vWZ=sJ#6TZc~X- zmFN&~rAstra3sNBo%-Kk!$A$xV}0eR8&FOxJ?;a1FP_aVjC+;WLr~pTm|=peo2AEf z+$!oFwXkd=GYIRm#w2H~lydZ@#{l6e-{Gjxe|m!?CM44_Ve3pPK6fN_@^=iFpGUmb zPi8(Itnw*WVVXNb?GtqM3lNbbGXjo#=og+3nakM*4+0CVQD%hOr=K;2#L^W5Z)SgO zF>a)4Di>9Srdm()LR*XqL8^+QO`*A^UU=oj-AaepQ#X{IDtin|ND=HjsHe%7U{!>E zx>b<3@$G`Cz}a>=MkJOGYoJ&Z%CbKUGJUao27^9E!x`wttWaQ z(wbCEgc!vsYe*R#;N4$=7$aKI0kx>L-z@>mqTbUs%IFTN&@nhnWA#TCYV%q~*l5_r zmBfvuwk_$ZPk$T2@&G!51YURHt${wqrC(-ww)-?E%*411;M&)#7eL&zV@3FCr(~J0 zQqpePPDAEPm=Pt54JhM>xrrhyl%vmf(D1}q;h~vOfK?U-_wfMdg!K-`JOwen$G)Y% zJfgpzjhjVa>4hB~e8PNZltFp$ zGLS>a#4FAd@AHk)jcScGN7xeK52$4fN@7#AYF|D$mqG4z$CcqsBG*8Gfb#jhr!+IYLk}sz}G0{qW&eS z&@RZJSu><}JULGx#LM%ucbptoqznbHLwO$ealEj?b{QEnHgE*KcbzPs&KaSeDmt3X z=19rdE-}ql$#Lg3h4H$_p0qD5G@q=Rk-JS+<;YJ5SIn_M>vZC~q|@Gvq{zZDdQ8k$ zT)Ccfi7SO;=shX|bp5^K)o3HIK0rnW!X}Ni{YzE#TV(0}+qu;P^c_$u7NvcA6pCf- zfh*4u!Z?PO`hG(MskR*mQyX#>hID zgYXz!oW6;TZJ7wlw&*mkVR-b60CXtsw*8aCPY?1t7ifjQSJca=>6#Mz)8JQ>rh9VI zxN_FQSN@Cd&NV(5M#ab_R+5Uq>|Efbn|=~6V>bj;_wNB2vhL8iI1rTBJ~`j}ml?3c zf9gaiVPC5ppo%1tg*q)j#zdc6eA&V(^C1Rj^S5c&h{%wwz#q|Oqwh+>Qy^eUXO_7$ z`|sB}O(KX6CFb^-L~v8xw2+^_iF5KhuF&b^60};CxB;b$fTL%)_px}}ijXEaoPJ6f zmp1S>enl_$SVH|xZV?ny7z7=k7vs|-ig2#A`bZLz`K@dyl_?~HKYGX(*6_M)bY`b~ z83B=jSe1wcTjyaJYl={?v7dh>6@f7sytM3 zz=yOYYzSZs($O_e8M?(#dO!EDz9-BHLu7Zq#C?q7_@rkC#U`qa!c}L zOY5c~Pg_cE3!-CFcZI``#n)xgQYTf|wNe@>OnGRR2cm&C4@K>LvD1_gEX;tbQRe-u zndreP7_p@h^CYKsv+0yhHtE@3Z&zQJ4!TW6YmY)+#UKibmfspr_MIIbA8 zS>15K!7TTE3fnOxpiJ>Xkt93Kdvb5%(!YpFaBe$z6#e*Lzg6FrJAAoJZtHqH42WrV zmVz@qx-AWsG%<+{5baK;azmeeXW_c7`=I5B7yrz{-pk7r*7_O~zDkiT$ds!l>yn<@ z?i_f0r`O+P{X&X8lGb~fJq4)?dgTo0y348OkNc{`J?{%JYpZoL;fsXQOLh7a6c#7V z;S|p?IXp0?U#gxweBip%`#RU+;*OikPISX1QEc=sayr*oCPb|8YMa0ISMVruN-S7u z>9DvD6`_;7Ht~7PSPlMz$8+mbDijtSB3z33Y5fc5jUGa}Jt|Aq2z-91<)sU=ba?%> zx@z+^g;8lxw0^v~XW*FZPntZ!8G!0EHU5@celD>#&0%Y|4qHA~Vp;4llFZM{O-?Bb z2FRyv#iR@wESKqI~$2&{I(Hwmv=I`yWCH7?A!%OS>F0umXRC~90(DZwi(5D0> z6rISws&tCkB8AHx`&)@HHxyER+q@zZ!P54dhPz}FNhs3g5odv~b!x5)ACQJmAnbSc z$Grt*QlZh%5IYh3&`LxE<2ixx<`o&!F^%Vsj*(=EW| zke!l-i?<2IC)`Lpo>=R=nUIspNhvvw4e;Rgr_1(jto>hj4O~!MmPBXBPm2W>c?KUv zQ>+b2%>0yc(4j2{XuF=#NAxbn|6=eL!l>wXG{)x0Y|Je=smM#=fnXmSDUcVh@F8ZP zltBuMgHugRMH4~SY+*V(#K6W4_*$-_How4YYr~CrmV9d{amzt=H#| z+X{oUOjxuMi-!}|UR6qp-_~E_KEpP}kvZiEDts9w(Q40(pMz}$9-2C#w42GhgG>1; zqD>IR7+zH!{K;W(ZI$4S*yBB<1<6T{-yaI}s_l||~2<_aq>4daj_@cM1sTQnR472Zk@3so>h zhSjjGx}W70o=nS@($(BBe#H+YhBm^Z1p+l2(6e28Rf!{DOaX4=V_`CPQ9EC^1a7@t*5I&TA?IFid=5GAiDe0&%X)V&q zh~K`r1MpUEAJgn4(m?kb{mSE1dynB-ZTi41JbV|e_e$G~astyb@P62Mz?;h$3|?HY z!x<63Y~5JFb6E{E<|Kcf`Xr>{_?P2SX_iP@ny5{%AdDV9j^d$=yG#iuo_$7Y)j!Hf z1_lqmob`Iaw#gA*qX_=v)^XsTQ@g3}evwKPv`L z+1D+f!>y$l8t;UlObnCCjRdySXD4-AnK7(@6bx3qrdQV(FUBLdc^*`^(r0SdDM$of z+W^?GoGTWC(gzgX(K$=h1%SmlUH(b}xpkj2bzpc5`w4YDiqVJuJ-gSlEZ3r&a@-B7 zdBSxo0#qx~&F^HiZ}p;QWMC=Ul8T^{7PcXlKit0=#7ODu=ONO&0R<3qd5pug`JaqF z+NQhYu5(#PeZl*t3g}&F3Xx%VV{41U+%<}AX;@^_LIC$^HIDU&EpfOZ`X59Nsbvd+MOgZ!q-ZZn; zuJ24QSC7OQHDCvxwLKOStLJUv_TQIJCKzuTD;1ots+~8m2o6!$G6caBRXHUYsUy@+ zF`8_6q6`0nu}xsk8^|zq7^{s~|MNA7OSC)&?N-ADr$Hc01m;OE3XCZWC%kGGZ070V zP67RWywG#UPwkowkuIvZ*FF8@*wyT8){w#iyI_ARG)5+>{iywo>u3C>KR)=YfM79e zINI?C3MOl7o$7?1^-zx(oC1xvhnowLyo~U=p&(@Zz***lbbMWjtM(d@{l1d6=s6yj z>f`HYMy*eLx9uuemQdd}dCM6X6(}ECY;Inj7 zGrwlH-sblmO#xyBg4aXvR)yerIN_(}u{4KWxmri6R_M0YLC}mqV7<8j{eM+PnU}4l zM3!YAflHv4O$O4)ZnnhA?40can65GQ;(0I zON$QwK*lNwVNiC|V;8oV@GWB@BTf*%_C7oh5qqDy_CCtIX3VpgFr&=i`Nnr}EAF|p zh`hI<7-=hV$Tv(YaDaJzS~HtQeD+Ydlr@m-tpy#$5J%ux3g!i15ir*4<3m9oe|-?V zv3F^LVqzQ;(lTj(#~{J_M74f!{V~c!CN^Yt>R|rCaHK#fB#!e2b3Nb-@$okF10}T` ze5a*@4TMcT0Zv*&Nmnyd0>&oi@+@j9dbO$U>e++`u(aWxmnfi70Rz(&$KK3l*Xe8; zbkmoe8t=#3glbq@f=Nq}_~ChWKqVaXgNCJPnT~_IRQ;u-_uxM5ZF!FAkWb1;e(4Fo zD#csi^e8bcxHhh1*e-2JA8&}7UpF=?AQUCyD<9GhVCTh9MHbZ1LkVB}uL)4Fy@^y3 z5I%%qaYv;e<^8vS^f0#gqJx0CMPZISl*sI%ka6tcg&+y+;=Wg913_fe2AI58lXy$7 zlfkeT+Rw!^$++zHE-3yK6?tS#9y^~x+gS+~Qk1|CWQS$CT-84PhwHxy92M>CV27Mb zixGbR4Un~p-Og*<<>#1c@?X9qxg*#qF6Dyp_6%|y_FU3ObG+*27VY`MK@PoOT z#e&dE-wP}#RY=3mnrQHPiBH(wtAacXQkAVjujG2x2pyTGaA66I>0t*G?&v7s1v{*} zmFd{S@R*;48B9052AXSAf)LB{xo(YnWvL~zLQ)6;_2K?)-nc@~$Xo1$ujT(mZyJ{! zJ}qE0bc=x&7Z%svVVX@+Tvsf>y}Ko(=9%hE+6vohb@c(-L?nnBT>CvD^$&dyk3q>N z9Y`=B5x0|eaNz-|tCsc$?*7~M?QQqOw@{le%ad{#`ohiEv0lU53+-~lgt_z30AlNb zA~>Gs{j*NOpY++>$mf3=TE7T#{cZP-fIdKT^=dhF4bpA+qhK^>t&zZ0aUz(GlAq8s zCpx;ss)t^)&M^G3=}P@6n9W#P&Gp`4_fm9;XAw6yZSOA095%E3WfSlUSDu*{H2*oD zJDAj``HS{2O|LZ@EFP(_rWc$Q7%Tu#C6~h!P6Z!-a<^UHP=@4%^Cd%ja!au9vJ+5f z-Hab>c|Z%cCstjyHL#gVo%@3q-@GOoP$LqcFpGd;8N&#+r&NH|A&~@PrgfeO{PsR` z=5t=ZlZX7t^cYWYmrtQgE>O9kke;hX*AP3Y>yhj0HkcbJ(u)~1fs${J855_@tZSvU zlc_hIhdM&fP)Y&1r*b!I9Fy*j$z$pP&m%?QIY9gc3lb`^ZfgXyM^L(G27Mp0j{K78 z+Rw1Xn*b;Zm!LqCVPW^wYT6P=gnli-Hh>Gi-9Y_R`M(Vht>FYIv!Qg5WjeTJ8R_;u zWdnG7V5F_G_Cy#s2IP@lj2UuH>zumy<3IS6V1PM9xkiQ5wohbAxV{-XvCvms(#&1| z=4hWb;84v**G(-x<^mWnbylOCWHbZ!9sRETLT@IP0bpB|%FEZsrLMNqf61!v1XRp5 zV-KW@V(eYzz_E!q8=v{RHJ#z@;O7~pL`FSxUuOx7$<4BmmeI*V^%%pOVGO_ZW89T_ z=T5N?y-r=QaCAidH$zvq&zB%Z^zL#)#PRWG$kr>uzT~bRCW2>!Oax>9g*2bLlxTh& z;D@c*br($Gk{F?SGD&fyp_tpxVR8YzrQZ zgQIx{p8$h?AZ<6m&eFDdB*yG(t5j(S@NFn{?kyMs3LL@3Iyj6PNyBrh>7(2MkA~wv zOcJP~D`PS@BPDmBm+fG`gVcPifyhdaPlOd`@;Ja}@^t~h@@?0Zem+;AaK`vH>KX}M zOC~!ixJIB|2;g0|w)oV(vbbo;kfqQwtQ;sm!Q-$riHbR`dl_DBnK^~bnM(gX7>22F zlVLmsqc!e{4vUqaZ^!jSr@QRW2E!Pwh910t0xhVX*uBN!~nE!A)L5Ip{G)7K#o zLp`5+Xz(J|*LH!9L~Ydj{NU(WhhlYsxD1&8&A$+rm;)GX z5#YhV)kbDp6H^|Onv{Z&$nQIdU*yv&m#J$KHego$~ar8#GgEP{+_b=|~xnKPrqGh$qE-9~Z^f3n~_? zPNP`@X9SUYr}5;)8H`RSv5laKCE>C>jvLV?*Ru)?wBn$Zm^pU*QQ^JT8ZSOP`>s8M z89?oTjpqq4G}X930!$AL5@TetUPJO_&ikHPf*c!RHpPRs7+g1n6|OXkK*^G3)~bFB zuqFdvw|T1b%n}+rQBwv{u?sW9?>f>bros)-6@i5)QR)Ohyy&rT?%L?NGYAs$-=tCD zlN!xq#>fHSJywwmbC8SLl!Zs~X9pv6hJ7&O9AbBSY{d3|z|bBj#op0}$7 zL0x0HqzW=ihl{Jy=l$YkGN~EzxZ@;kl?M@UZ0}>yE!&$g8b7)L==%li{Et)*)Lco} zLEN*T2}^!yeaKhb8JGliE~(;xwiH5wwQmS!w%-TZ5@U;rZ*rntx{2}u|5!PCK=iJL z95&w+2P1YpF5j>9kB${c=tolBx>7Wx>H z_Z^Vj22 z({SBT{{_Q_cJsqGw3R^+ycCN3s2peq#~*aa@7F%|v92qM{TzB_`viFf-uY>qk27gJ z^k8`DXzBmIKKoR{!zZ6K*gEgMPH6wctUv>N7^AHI`o53It07*c$zvL*K%Py!&-wGbRUR-(1 z?^P>~dXC2nZ+{t--cS=bOChUaIahkbgyTzAstO{0+^S^xcyO9D*HP5X6f5TVYu+9l zib#&A@0q5Fjj+H!^`X*vR{~Tn?%ewu6@#JA0 zgRi%uT9rx(RN5z^f?Tf{&#|NBxvt>Af0{S_qxe>F$%jD8raS9wJTU=qe3C2DU<0`# z&*y_nPXpVNzl@?rrUl%Ro6(XMT)f}5o2xKh%(OLTzXu_P`6(U9hb=(nm*N@UR*>HY zaXH{Qwq1yN(N>pJjM~7#!)q)EYbxOBV~l?9G1#=#cAEsL3cVwGAl5+FmV*$67sq;D zn1o2cXR$CDiZh4rnL0m+g~u(*O>frB24VP%OkysmsCI>%`IRPd60u>O16^>AO#_8p zrPcPv)|=ezo&y>O(FiYQD#tkLYzK%TLd?d3V#fB$Nt1eSQEMA!zJQHgDam6+WcTiV zg0xeZuZ5%c?8S=4!OIirZ}YE;bL2GkMM}>RD9xQPb1RPEt)H$AUB`Ip7#N3lzSp6@ zW^T<`a1nItkVb4F)4R5;PuVcDLY5P_Kg~0EN&hRKyTRlKq32~Y094#qhhY?X?g8ja z?^7GWDL3d6Z9WKsnS`Otddk?Y9K4zGa6R1TDcqy39>kHB2R+;NAW^jbt#}e(RvF3{ zxqz=Ar};O424Q;AKiLn*!NvF-a9%jIkx+QiF78>W>-NovEB{6lpm8`2y>OTx9N#ez zK^LFc5a~sy<)-D3o2P3IIv2Vg*-yAksg55U#xWUelaPS+&cH5|L(z4Jzi}D+t|P)G znA^`fsW4JkmSYrLgNOP+0mX+Ybd~R%5j`#uieF(8Laks)HQDm*SqIJms}JNtKN5l+ zdAqDzfn-Tw%;J<;%zXgin>T!FDU54MLlB!LvPJN4g&@IP0dNdn?Ml8is(5WrS6`#d zG!s_0>Oek3a6kqP?gG417^xJbkh?s!tgjN&)SSRgXLM*8T)RGim8WB7iy`Qsh4NHx z^BC}00`seO_@bGC#ordz7jJrQaP5rS;oplgY6ceO2S1k(ifw+1{Q6Bcv$a0a%;xEB zldw8+5IGK3;=h4Z5=gyjJMTv7#1G)9J82!Ej9Nt{F~P@7zqDX2@sLK_ACZ=~qVia% zVD*!j{9*scAT>OCAIVTut|alhsgQd)NK5dNqE&PL0XxG$y0&USOp9MBKDP>tr~7*j zO!rmHvrKtWOzr_lJ(A(;*N1_pEQ6w|T7fCA?{l^rL%&~GB{b^!W!;p#_y+Zx;mcw*A=;LDSWl~jWG4b^# z+^-!pgYAZiOKZ-KX%((+DDn~BFne1yhO~OzIwpLeU6#*6jEmt-v@tu|fziS)ldbg1 zV4UZzt<%DUftXhogOaBBtoGoN<=HLI*9HY(kJ_LQcB5@F z0%J!65%>7V;)Sp6@Tlwz!n9=r6Q4L&KB%Nw*DjW{i4qfcG1#*e!5WDU5j_YZe)S&$2o6f zb2^q9+_({x&YZf%+N-2X#UT@$C2;#WWzr~GH6#(IQd?^mY58M<&f2dC+Kcuyw_yLO z>-Z;;>zh`Tn}Se=o>9M~ZLPKZy=|BJS6C$l=!v9q0^xE9|X~C-0)_;W#uL-NEM+sG_{QJTgo~Z$z_$!lB zRqhtze|DVzIP>M=geQ!Z-;S||o9+Otqi6i1j)i#AKjAw+ z_cw05$@+;tRSPtVt{Cn;cVhn-Ru3r4cJaA<9>W{}zf$Ntr;IMGXP+!APl8fnm+vk{ zr%B%g-}caY{(E|uawZt*Ym#+G2<1;u?gX48#cX7~}#(e$folWPgMI zK$bf>`*GF^mhOW-o=gN>po00~fZ6zhr}zl;XoPfL(n8quEyNEHD7sbN&#*lCE4 zotXhCditBDrFCdZVY_ zactq5nlKk1_0>J%j|lU(QB)1(httOf6D4;Hww(@g;Kv0~_tfQ2GhQ5vU)W)<6BFld zTx`_}=R+!O*U%FSy!>4|%$0BAkqXbFOv!RObirXvPxmyL7r^K)*%H7pD{%`KRv|cX z+NsF=I?J%)gziOgr{ra$teI_E$EQjDZ{YsWoXs92TnnGqRpSMIvlU=A*-RCvhvd@V zok2vjpP#kd_1}a4J;E^EHdy!^IAzf3a z5JhiIUYswuVws?=SVI|2mjIP~n5TxKr;IFNeaU#6ve{fE&g3b(_nnO4GS5QV@-oXZ zFq+4Ok7IZ)nLvkGc(Q#9?dcn5nVVwRPKWyiANXacwV&=W5w@UH=l4f7A z5#0PV7*HBrMduR&+Bgj{@2d=80ld?3sYuQx`43vnw>Iv_nKYbkJ;Sl+$uAUIggmG+ z;LEo3dlnIRue4n_;nkWd|EaiTTiV5D9I%$P&Z6ir;YrV`5cs<|-O$?nu5)CCPvdB@ z>4ADcU43mR*8kDhestA5j*g3}Bq~R&cm;#0cjlEiu`v{epG%LAkD(ZvX(9X@g=QG+ z2_U2PaVE3iA%sFnMiDf4X~a@RfgW6?{=cqqu$yR~H?gJC={41r#@0*2+~UxQK?3+TaS9cmau!y5;CRqyS@3sQ zSVTp-u5?E6Oef{bYmMxrtulf5@CR>hI#p$?ni?P@t9c(vc=iO>$1-&^`bQWxf_)Ko zSFesI;!eKDNv(YwJaeOKPR!h8)bpC10~Q5f7tbYg_*Hgep=6Vni}}sl9qq779rZm! zHiyh<>pg=ZqDX`q6~|VR zmkh2_C=TD=K!f(p9@T#y!=8Ai&uG7fwlt~TydZx*J%sQcffqHq_*bD7BrP%%8mdk) zXg){sow>YJn2~^sDC1_DihWg1eC5Ph2np}f!ethJb+7o&kbVm}_(%xdUQQX+ZrK0N zm8?V^Mskns5I(3Pl+LC!4j#HM>O~x-R?njckp}CwY^CN+zc(b;`Z^U&o(N$MQqm|( zisI!?C-wHSe<0;#qh;IlgfP0*)%ry6->R=5NDCSpQJ>7+j?xrO@gzk$(j-5d3Lmg| z86p-QcXGvdiCKanv1ka;47?--Q~dJ7xg8SOV}&RF7|_y~%?AvoIuG09cW1g?f>(*G zkZ4IeCPbiQQ%V(zyFZZKv8wZcKPrhWlT|o_vI`aiz<> zsq!slAir0@&RQO0j*+LfueqlPrj6$&?tUA!Ts6iUe{A8yG+$tZMm}mc;*|4)%>?DniQWxWPeMJeaMJqaeh=RPD&WwMnv!XnR5K``fmX$ z6nOeJrp=5w&*-U*Vz}h)oY_)l5_kj2x{)0}pylvoT}s}*RJXpFH_N^@Sg48X3}CW+ zgqL=fcC-8q)C4@k8c&TeZRV3c5;{S>kI$qGD1c)|SZf9OJQl@h>xwpD+2~wfxt(n2V zY_K$G3&bdDkXl91ASUQ)ZFG-?1Y{L|$~Dr&0GD78yecyPNgB-*QmSJHrSpH>7adn& zcO;%=ZF{E7vMip6Ivb~e9V?URL4kU4eSP_De2nS(Q${@dgpqR+f_(*1rl8Q08HNlI zijBEb#4<`GEbGI$$3snYjJ0R1IeKk+YYRi7FGL%6(F~JP;s@Y`nP_K;zLaybE)^{3 zxlww8K59e*e|rMhNRvNT+}t8drHw|EnO90JV5gDnTyg`Z^i5}3%rU=XMNvu+67pl_ z@MzvGxLgk~bV&{{y+`A3FS(PXXB62ZSTnvce)OJ2&;oRHPcj-1OACBIwr34K7Ti!~ z6P_+nt{`~cHPh(Nm$n{(>w(7G{ge1YjCfzOapp7<63cYP)l>ZvFayU&8A zX7_^zeA<=)ZwrXmZbt+_<#z0&7m{V@%Zmsd+E>JHe`yTMF(bkO-}Nyt;Zw$edH5WZ zVP>-=$)h;HOB)grSXpY#ay#H>OJVPW!o0aVf06Y;fVnk*^GWz-YpT+AXPPjs`!-sI z58XRlfziZ=%LS2)MLo-^ArnDodM^)MvYB+1%V(BR_|ucANWXpQan?b#P(ar0yZ>OW zJ0{`9lZD@F(Y&AGqa%}!3`-bPQoA5F3_o@Y1XwQgomC4#@TdMrur2LE%}S3rFN|?G zHc8CcZFs2}Cvp!A24&R+T~$P7ev;O6P0goHfzcm=01sH221+|gP98DKX}&e{@@c0D z>C7SOM1meGg{<{9%7|knpJQk5uN^rsetO4a0{JrDxbzU$E%zR{{f%;)Qmo2n`9&G2bd>Ct?KuE!4BgYV$=M!au-`Zif|WyLj^7J zxJ7rALl%5n75!4b8lP=hh7dMaNF7N;Y7DUM7Ag?Rs4uoarQ<%Tcpsf7O>`GUma2kU z$7QRs)npM`+PZX2tDuRmiJ^=rCa}tSa(0(A^85JW_D!A7cyKCt$d0i7K1j5mRbaz+ zEH&}DHk2IL{qo;2ijEIAb#Db7U6D7=ED)sJxLmMXz)vc0Igd`!5&nq*a1~2k#3C>I zMchJp-$AQh2HBi4ffovu#!1W16?oxQAJ}_Tf_o083>!b84D;lm_0-gA3fb#Y-XeHa zX7Tc4k7pLnkF`LD9e{Z)H6wNR_`5Bh$o#!)a)oo#^V0_6O`&i*fp8LP%@D?rmX6DS zag)x3gSL`%tQ>0%l_eRW9#kV|j>Uu#cMRpjQ2EQC=dJoA5nd6k{Yms|{O1w$u@!~H z!(1-Pfn=B;3fr-()emyTL)!rMuYd5Fv9+a9%+4mz#NWevFzY1L7xm4G@^Hnqoddx7 zEwg}Uiv({@y^V~qxDe}*)E&<0;`Q-wgV%=Jl(Ng(hg@y`3o&4GoB4HA3F z<%4M&M*+hX9N{s`hz`hfM1JN>Sid6Y9-zEZ*trBf55A44L6M!8^A|MEOU2<5FZ1_~ z1Ivi<*xN4J-qWHbqIvtIAk6SuE5n6KdtUyI2pL>$Nv(%Kg-WY_-u6LNx;b6$(ya}a z_gE5`s%iopVV`a54OPA}03cu;zM~4qjAY6Kp7Zi~F_zmWX}83}{h4MR`Bm zGZU%Kxi@;@Zkz)(i@fY}19G!z#Rx@gL2*h7Ay*dW-(_l7A2N;NvF9K=9(;_uw4&S1hT+F$;6Qqdjdy7Lr1ZEUkD-ckxHfMykS zFpk9gV=Tg)!=e69bvEKSAL7XyJ$YD4p@YF&s`meh%u6sZUStuXw|)&;U<^1wbcbx z(99jNxBzn5_S5qbxXu;)Z!-k0Bb*;I^W^HAu zSOktyi7`^L;o!5`4}k7eq=+F~2!%d>s*JtWOfo&*lIe==q;apiX~T7l_I&y5;idIm z;3qD|488rV5>-%%nPXdkS;4iZ^Qb&OFLHPO_5pEk-bTf=A2rcdWj8nBIGlGZk?fS=pb+DUvE*w3II8FTGN1Z=_6PC5&uXuOH< zsi!!wy!K(VR8G~p4k{B2ch#Qf_V?v6C*Y`pY(`4msP*Zjhf6Krf$s(r8dWOmjd6E* z^e|0DEbJ+8Pk6Nr3l0}uVwP!ki`*5^SS_8@!`hSgn1xbE%(%0RSwNEva#4zE9S0u? zN?YNKkp>x-r(0|-Dz&Q6Uo`Av!tJ|DbQw)IXUv}|>CDjo8 zX=ClvuOuybnh1qeFh5~s`f8ddVbS0t0P-_vtJaQk_7F8mxs24KvVzvtdP`GgPkxo1 zJRvA_!v!jXN$?MGJmm_iMX~KMBq}IL;?YlI)G|8fg|wd425c*Qnz&?~pkDP1TZg#H zV}=gN2kV&dD3>rp-~M33n+oyYnprX#D=k37Qu@EReVD?|b96MSXqMDx4p-Io%UNo^ zkOn{ajk5wlOY9gs0?}U8)ItnfAoK*1i;zE^AU;N!T?=fu^qf$HL(#gm?kB5PraV2w zc)RX`FGg6tiDZTtxbbiqdpkmfyhiDo2rK>|%!-AFYyjo~3)CI#XS3`H#!UrfHQ(pV zuS)=*i2;^UE06>H#RbQpO`iZg2kwl3dF=DPF-0jqHcs`J5u6|FdE0mgu=wcaODRZg z4IUCG6ES@`3R#D5K?&ILfy6cmiUIZ*lV>n${we*bE)Bt@A3=_HK1}S*%T6AbJLRun zVNDTeZtaI~0SJLU${!mz1u?$SE4zDsudwQpLo!Il1E^u_Z*%>$>|C1ihm2?r#cER~ zb$pFJv|Pdym}eUo;kQNZ4nX4yWy`2U#-P@=%#+{>SC(UfNzn)l!3SxHUJ8l)dp|HF zTGu5uz+H4DV>y6wS1$*I2N5DFAjH7_WzYDd&H-Py=l4+zj*|pg>IZchTMQh4A6ti) zF&67Y;u$Bj3<6n^5HaUFEgs$GH{DWbBNh?gK8fk}QfdU&naVYP&;w4fEU!I5i3@{1 zd-VylZ6P^ro~dLkc4c%FmzBfh!K@vn;+A+_uEB}U_sH^p;~Kw`mu{kU4CPm5bbp%x z|L?q%UL<=~#H-9Yib^>fj0PB5MwrfdUOk2($WltDTb`*IVy-Hbb^d_(k@kc{+%SSj zeS|XSHFm=obChY7od+cMznu8O4G>iLMN_}jel)?M0-AuY&&j37U?!A%OeB^MqPqt% zqO8Ij>AStclzJE5A1k&pRdOHVa8!rGd%sDIGg0$MkIC3zuy@HN0c~4%;Wf@G*uc+k zAr5os$SBP#rt!7`)*CiSX@21%FiZ&iVorY?Y}_|AEYoF|T)dXJHWpeuE^`k(V~>JH z977$%{Na(qdd1A{LNQ01CZ~5u_SpV`v9+}K__>!B6}4ioAWXiz4H&x2gaD4zECtWI zvi&N0#2y6V@_6qnKA%JM zdAj#LN+ghSfw0-T%!9(ARA6KS4Tf7wkw~zMR7(rUIqs z-+r(hG~RUDK9N-yvv7bou``uFTmVFjj8&F1Gb(A@LWt;Y8&PH-E``s+qTpgkH{cSe&`9R5WH&nU`a$M^<|U;HOt3#K&N)L9JfZ z83r3uK*}BCMfjo+o;?2bb75Y-asO5=v)ltXoFPrEQ#P~@zQVVBr4Z%brYXF-zGe@R z(SdgfNS~)L6BGwu0ec;1ufm1;)UWi}@Os;VASFf6lv%17!j8tCci5K3lf;d6La%j@ z6|cW^JFfJ5cxi5zwEB@ClRnm(JUfn7-VIf*FD>vtNd#w1swbJD__d&H;L~S)D>@iu zsbrIeS7lEaIje4y-|%vMzBKts0eSA&5j%IzE_B?}+09hzq>PM_d3-y=1V20iGPIHs z)n$FUK1eB6YDDmHySg8-VekCi)24dql@K8pdB@=Ser!SBF09z2YvVzh!TQqJHUcrR zNAnvi{#yyb6(s%P0}1M;)D|oQ=a3l=Gdb*N?-8t?;eg2}UkFz+=-dBIAK^!{BfQt# z?(EC08A%x`XlP)L+Qy$oRDHrMX1f`H-3dc!YmJ!?A7M5cGAt86y1AkIqs+wjax{ES zR1X}oDK_bjUu#or()5sb9)GFK-o_uskr6kGE~3tr>L-Jtp*Hr#l=Do3hMTsY5?WY+ z4&yBRwe0KwD~pfo!fe`QP2p@PqUXQfU*s#$0q2asrPNsjQ=QD@*V{;E`v{eO-j>8! z2=Ku)Y56=0g;^~+lV{chy_&c4*8F3nZx%Gi3?Lq_%{)HvYU;Q0k{=xtYvZP$(zQ*7 z1goPjTkcmlS8y6HgsmY2> z=yk)0Jmg(5+0C35Xqwv0yda^ie|{`Ot+}-Yv5r{Flc2hm8Ij{J+0I8P92Eu80v+XRo3TOFGb*(#6o;p!exWicek$a!66sNv z6{GY+h35g9EI)7Gv+S@P(&VpCRPmMMwnbX+L)J|&l=ErQe_&$BnE%fVf50Lbfmw?B z3z4kzN#XB@er&%vxs5$(o933CSKcE}{ZrhVZSc3-kVnWA9V=~4E;kAL!rc0Q*s2b( zeB_Hd4Uq(tB@Bdu=50g_I6&hsN2IAyqW6(S0ZGuK1zzL(E66Z@Mg0bk z>@FHdAB?_}%WHO=)}!M5@H}8~OUKkG#Gn^>yrG3v>@D|qif|wlbv&KENSJ`4*oD5_79{%hG3hgLz91$+%K4S^*_ zy+14~<9n&6;3SH%I}IlX^L-%@uZl;(#I^ybpY}#yv}m=ZaWj#^Ra)@yC;zr^NO2uh zpl~MA(!w{0?GlfO^=-eZ%JyN%!;_`j*XR4?p*I5z8N=1{P}m9_TwxqlOQL6mI4X;6 zUKS+y7q|L~97nWNh;ojH1{gR5ag#76@cKNXkd#gkNmK;Vhf!MzXBg0MXk@hqH%*i| z%Ih1T`F-?#Ay{9U}1uv~^oK zSg>qz5UIL^=c!|OIn>_8x_~1&0|pX#t}D8`7%Nb2Z3r_GHo|`OySW9}95W8Xd>2T% zIqvi96NfVB--Lx99y^@6ku(usL^>*MXJBf1a~#56M=8k=xZXgn*KWRPHvgzp2@x|9 zS79W!3|z;71G)dghf4$qez}j{FLNA{98Bj47q#^Q)LPZ%jra)YY(%8+ zbv^S}5&6GgxeA}iY-|J)nW2Q6E^Nq^Xnx~!|>@t)U ze>pGkE_=82#|6%w%%n-Yn20LBqGJ_Ep zjVS8Z6tB3-;{9YdZp<_zh+_UcH2ohVV*WgWmp<_~hS4evTHQHJ1==>xXX$Ws6g)}^ z_Mv091bF~sH4EQ1{3<PvT2{&r?unWK>jXYgAQWR^oHab0y0ovD= zE4cFGvJ+00E*-UGWt$(>e1sUgRT=YZQ8&5CLo>D47t2y`ui+SPTCLY-WwYG(otk6F zM+n)2b(FZB>vB)&&X%O zbz@^>Dtyt#bT6w}S|@tU%E$e)gl$8!CGj z7@RH3Om49(cRJdqf~1)$NJWd%$Rh=-wi^RYIdbEZ#LO`AOQz66<=3^n`(sxaE%1yA zETt$mWq~yGTs)@lH(bwl|6`{m9pmY$jaL2NpU#WOx;C?-TOnTTdb6MaEDR{-&1%@B zOt0V(g4FkG*U7A^XmDW#Xxd7k%;JR0+S|2sp+&>%77>>#>p1bsmD}mbFCUHcjF_VT zkC$bz<}-FdEky$3z%sp+Zzoq!)lVx#T*h|rXkWlm7yDUuSRWhiXUWR+pO+(Dz`_q= zumQyNgMS??;z&lvvfUzHrY9>2-22fHc2~-Cjg>blnadRBWs1OzQH=B!+xOcpI8X?- zdY}*eE;70Ur2YQ$2$U1k3j>Ur)PbJe)0Vj0y4jzwV;rhJZ*2^SP7A)LZR@p!onJcSxCMm+s*#qIH5A`=E_(*}w59vejV`Kcp3 zXtO$czsCXcQj|mXH5Hl^U?<*^j#gqoEq)N2=%4o1h+ginjhIspuB4YxWk)!N&WBr4 z>q1rLv(w@8!aQkC+eTXL+sVM&Ref+u9~XBZHA8GN;MVcQcqY~GaWa~LK8StU#ZbF1 z`x?U_v zP|{&ql&-CUB2lKs;X+MS+>`JV!IfMctN|RyxJ|oRq18Xj<828|fS-l8iQm5pTdZ!r z%y=BkN8fO^H@P8fK50SNPJz{-@v_$cZRjXC&6sLuoMeGQEq|7eOD_CJVs0VOu*VLb zfL@0B;!h9v#BZ-Bp>uL<6H7^fC$Iq#)_`d z|GGg#>ou|{#C#}J{a3o;>{GRt%kgFW{34-k`sIspV=z9~7}GX2sAEv-DR?0mik00g zEHaBOS*JqA_3hRvf{_imB3{Vwf>9Cy#!~kW2QCpH440US>H* z+0-_dtO}-Sd+}x)h5@b9iTL>tw-dbMRBW>f!yBnA57Xe%kr4DgJ5;mKbJ4inF` zsJF5&-W2+nX8le|a1RtKC1HhCoAei~7C`rd_;a=DwS1aUdJG3;$PNhpFePL*?-oKO z+vMQEdap&5&n3a{!b7|)fQani;Z^a|9g~q_jJ*Po`-aPrqYK{i4omfFM3q!rN_Yz2sOLI(;l5@`BzuZ)bmJR)ul2iPF6e(_?|I=zt#4w^T-={|V*{|}GlYPY~Z zNPY=%`+a|m8w8N6`9XHU3fw05=dbS)ZepqIosniZ`aTflL9p<((o=ky4Fk!>eCX*q zmdO0NoRH_<^Cz7|oO7D|6()o2sjlw@pULwiP{zKk`9JbyXwa`t zl*Rs=xR%Nki|Ix3q3RzheE4VW8u0=Qoop$FcQY);{A~PB z#%=aSg_({~X=114e`CW920;e;{Bp<;jo;HRa%l|7CCdBg;y6w{$E^+VDP<9!;%?xL zCzM!L3Ir;IIVV*^&=}XibN{qb3F#rNQG}09BsKMqat5v)!Z$MzYVg~K5apweoA5gK z%^;4@vRUxy)c=a2Y%mF7QZ7C9v?}`PG1O+A8<4B!71=}k9b;)m6Ua7*vI*3LpkcH1 z;L!m8(vMS`78sX0@EFaXaVzDFxfF5wOceI&KK+-+QXS5%U%s)1d_7`5$24hxZLV~V zhkBouco%8CszMm1B~l5&6V8@v$Wv}UTLJ!Z?hm6f;#g#IN&U0d7pHjCLY9Ug{X=h=HGx(=Qk!c=F0aM!oE1DfR1hU z%tJ|IF&LnGQ_wTyf;rB+5_rQV8CM)_Fg7+cVgk{sXG;d&lfYsKYy9-A?_Kv&a2aN~ zca+nSGYH!jN$^Y$1cfVYf5oL6PB${yJ?k~9KG(E(9ogv5o> zz<(%TrM(GKsfGt0rcNqXO*YM;v8rlut-J4SG#^?tyN?TCOVkU!q0KI5E7{G}XgB<3 z83A6mD#Xl&#!*LU?P&Ad4cS##aM_sZODyW(|>+T^S-?p6t$2tY=C>{F+emlZIBibX5nYK^Q~72m^^z&N!V1DFy+%4$eNJh%VDBqCPzB80NV{Sf6Mkqyhlz_whCgv z*NGTWtFf0B%BvxL20*8?9g~K#}o)l2fk|WvR1ws8odjw%jF+ElO~il zCXIiZdmh-tcQMdiy`qoVZ$n!q8}^06Q>3DSmBAFli<04vQu!ce%cegNpm`J_)Eov1 zp6XEZmQhU}ENg<=h#|gX1hkYd9CpSF{$Y!=nK?Zdy(WIGiVP8sv~RvvR;r8RQp;dC z*FC)o;7GojxyruSA6&yx%wI;1x!KfH3?9=c=RzkZC@;j3@UrO z2n(&HGnYDJW9f#FC6#gIx+6 z*()aP+K};6Yhg0Wj7ZVw{*g_L@4CBIDqwdEmEZ!xpggMk?J4N@M#dpN%axWeR>m|B zt6UsY{{?mOa}##>E^%dk30=$kAc3}2d&)N|>UF{r%T{x5k=vFwxaORv-BMFnf(rqQ z94I0F2RdE&4AuD9`LqO^T6AD&a*Xv(B;PGB8P??+Nx!eUrX3w7HN!LHHC^vKp8Z7D zRHnv;n-i=d>M)19%jLhV3UJCGDdM#w`jn;R*!+DAFcc?~gPkhLU*x&)Q5F|QW(__- zI#r(&s0^p#6N4Y6(4s5jkUy!252XlEDWs9D-K3#1p$Wi4Uvi94qu<*8;7A>tBSwy? zGo;V>ZNwV(Y3A6-(s1ai_=#%^?QQ3Lg4h)zx2e>X~WjQ3f#_@xhqVpLJJdkLbber z;c&p=P#WvH)WF${=54lU8=nFHZ&rp`$U0$qPH%|1-hbx=bAFr0>QFLi;4s)LG+ZN~_Cl9(7EJk<)Ec%vv$6quu*`BvU-dDOmW6 z#?<{+8BjMw@3Y+_G7trLb54AtY)wFtAUVdv=*f{MVWxIsepAJRpes7-DthzAK`8h$ zIH};knCmThoW#yB&%}_>0>=Q2|E_30t7)E47V!9I6_s@05>U?Xznoi{gABf%ChQL!jWtc!3c z_O6I=W&N$efJ^)=Cb~_PViltiQ*fJ*f|FO)DoALIudxUtAKjdkvS7wb|$S%O5Le;iCxbgJPC%CLtO; zK)WO>bg2Y#F9Y2{GiuT4^vS#tv@gheqPWDF{hRnQ}!# z-lfxuuP60My$Xoc-x<>Rwv!!V`O~GLt8zyq-L&Z(^H(@VzxZJ_-ILQb5gSFCeUn@& z{aKs2)0y|x>KOp?vRGDG^fzpx(>|C;4hxrSKk#IJAzezSUyISTt)Zlk?rV8O;zI!F ztAXum;euw(Lr%Q!D^l~AV7}{9Wpe1Wo0u|Lhtt#25nopVJVm(XJfLB#W@`1IiIucA zv0lg7iuV_$?kjU&oROMu(r}GEai+6#=s$afF7`{*H5LtpJmF((mOxM)TcFRiHn?ho zKkE3hPQ;YCgQ?VXVYV+cB}Ky<85##qg?-y+_UZyDTp!%olc`uE)bszi+p6=biZ7W6K=gy7Q1+Z-I|_^3D!r6 z*p{g<`>B!eYU(V3L>VM@)&XeXzl$M)Og10eNrb<=lg59l$=$TW#&ER*<(R{P7U0PY zDc2g3_35sy!bkiouzm%)FHSZ&z-`ku4GBdL>}>gdk!;#3;NfH(y%yvPW*6*w%-sqa z=aDyy;C7P`bzU{E?-wusXe zr&@QqDBpM*1=(vsO!q3X|PCL$ZQjY zdwgJ`#=()Nv|LiqEOJTOza=z;lm6vHrj_9|rXf>htB%<{KN>s`h9iopic7W*+T5|! zWPOd^xM(tBu1ZHE)`D0HT_bQdW?Rs?l=Ha4;s0f}7gzwdtIr^|)JP$;SWonL4lecx z2p$w(_`Y9%S>P;~we*x}uA2X3-skp0F%o@Jm)C6Oh;nmR z%s{*u!^_P4{>w1~3GbUU%|)!whjt+kwG0y==iMR7DAKe$(LI-V6>nngSyliQEp^t7 zJlzR5HN+$rGuwAJRfKpmm%AT^JGk^jrusuU4}>$#Hz*A&p^t{2K$h9d^+wjG0;N)M zN-vF!yg&UJ_SY>~Hiu1;YW818UnpMs3noRp>mqve18OCd^7Qrb&fa(%L_XUv+Umci z{m0mPwCJJp0Rv4YO)K#AFOE`yF2{h&*~|$ES(+&_Y-{-uVjx4zeXsv$cZ&JA+sle+ zYo+XYyi2BXql8KHUxG9oH@Fph#K_BPN?cjLJvlC9{$&b#Dd~A zVb(#cSckN!otB|kyQ+9TbK^4AdoqNV0m~^W9HDfmmS+bge9b?^&WSb&gNucbSP1Fg z@%dEsN(#Ocs4#U~5|!;^oZc-|vECA>pBbOwMJ|HH;5=rnzcvJnjDV?(0;A;t&@1jj zmZhG={wE(V-0xDSs_SD@lG!3Uo*MH=pS{pU`R&=G#r4#vuIwMaO{aLsOprTtiG1~L zK0u?jHC_lgUP7wg`;XiZ0CY0IC>WZj#qs_V+I(ERMq#gdGnC!77`-#@=h@OsINWVm z^s*><==xkqexQThW7G=W3=U~${N_k{ zHD-LRG^RV%H9j2jxX^6ZGDipP8d4L-2Z<`!Y1}0;U(quqe>k9%>#R?FR`vb6kG=nS zMByK-RydNXG7_4$sWju8KC4P`10)PLg~K$`$YxAgs!%Ah1vQzWdo1Azk31}TykGu) zO59IEW*WB1(wfUWoBU3ndLaFi0rLFhf@;~T;@`C`WiQE__05cX?TNUrOv`;Q`kix?iB_B$Ss$(d0ly&ghkdc9ioLF1BB9jcAU6>n`J5qy0OZASkxxMzYu{ z9(Al`NF#d#8*A1g`;{l8V~DJP!=T5b0CjNlSTGJ7$%(3i2J=v+gmDNl*^u77knMk3 zJ21xD6vIOx$5~}@$TPQQoG@9okJ7XMQOFE#0Ep2$pj6h)hOo02b-W;ZuR!Z9t3<4su4!6`22$xSnjcuhK=V-g(?9%I_9qFKY`zM2b4~JZ zZ^3(F4MqOh;kwUpM}632>g5DJHEa3EZK)l~2&Xw1eYz8tnK$UNjWk0btT#CE_@VLq z@G)`4ti?nC&`s%gU9;7gKi-jvNgJqjG}Z_cZSaRrT38ty5I-_5-}^_6 zmO{3X$m@Dmd!LY!&{sHaotG zdkie(lI84%JBkL!SZM}DKJ&n8S@3SNht*6z%K<{%N@<&CP9orHswK_6V-bt?YjZW& znNT9^mOWzGn$kQ=&>L`g_^&G1iJ>ooDYG~qbiNc>~`+F25PN`hp z$C8o4(W=j20Zy`&7=<`@OmB+O^`Ftqf=OkuJEWxpvjy#2jXokah&ClH!k2>j!hd#= z#k^{m!~o~z(R%{XTr1p>{Kvv39yt$l&m5^fw~54+D8~jf;4lb3zy3JXIhFu7_+-6X zCJ3saAa}N01|9>WZ5{KF#^+c%Y_V>;0*#S2DKb3_EzjOUnV?OeOqVZqG<6Zzu$*r| zd)UOlzdAW7#)ws(LY~dC5lve0)Fkej=*yT<<3k|$E0Jnm*Tt1p`)goEfCxQZTOs;( zdR8~E?RBkbCai(3dSf%aO$92%Mzmg*6R@tDfwU!d^3?@i=nwNh0!#)bc7iCc%25Z1WIzC4K%l=*`w(Lt9u(Q$e%uw}7eB5S@tF`kKIIN49Ab%gC#)rp=Kcj+4CPGgTni#XrmgHWlhE?% zF85DWEpibs8$t=}FvcyV6lg~%Q9kP87CuHv*wb$Zs7?o^U;=-H|Afs`7)$}hVGdxl z7Ne745VrUdpHL=!O;!F-dh+t|d&xGgja4JXpitKBGq!_~75Ta^-H#9>SWfkyO3e&~ zoQD|^rnMm8Z|j1_}ELk3K~K(i4{M8ps?U1b7S+8#3E zdJ7gb)GE$oDjd52)pT}3hV_y@1ZOBugL>_5pn!tkj^Q67^6JtXU;bAufc4i2IP5c2 zIR61+mC-ZwM&q~kUutf!fcW~pJn@Xyv|DDaCVcgV$$a^6@I@Hmvww%sD~HRMCkV!! zLaRsV?X52-dXOU~gXQ@tWm}2xC9us1o}bAwy?7s585E9ZJ8_iLlruVrnA{l~8n&99 zvoCYdFu1B*j3AZ=&0z^7`l9CS*R;H~Gmcs<#a5yk(^06P{gZOiKe;WkdGwImBJT&{ zp=%u0=};4M<~!d807$(Q|`SvkUB(4Pg2DCD&XohhPeLSx08o7W8hE+yB0q znY7nFl!J*0NZpnllTSdPa7i1wPnibGgJSsh?QEF<6X#Vcmu0Owb&`YuMnX$|r~qG1 zOjCGQegG}gr-gRe05TFnoty)`@K570v1?`CEgNiOxjg)oMSYu5E?aHH@X!KG^}SEw zCtF>MSK<0;(Da1PHJfuZ;)8ye9v~;cDSckl@(k$PdW8n(}LlTae*`2yy zRAjrCZU*>M$;mCE{D$7FWQ#H-p%#TK1k6Y3kIx-&#$MTJ9h<75tY+UxasMz-h_bhL z*L)vPeomiCBf4qCW7lEH^45s;w(3w?@NM*V{cL7Y;&rPM)pgnv6V=PnYeNxLUM(Ca z_IY&1goiRu>qatS-x!1uWwW*3$xHb5%43bx0%gf@_#mne0Tri<_W`)(fLoe*zmle~ zHkdZLla0(@Utqhr+F4i>>JA?!Yc@KvNt|bT+ZSFI*!UnNO`J+sPuu#FmQVbtPG?F2 zVC8hg{**T|?CY?jR0;DTol5&pBTq^eHgFKzZ_qsf(v{iO8%{sVzyTtL^5S7sWuc!0j24IlQ8ze{>Su}K>>;RgA#<$-1*Y0ef*W4)28Da^7 z2N=R^v?!s78jODGPCivQYxGN>Cytd;Q9&5f)|@_(DlT1d&merYK6ZKCZy{Pdz9n8q zyGs~purnnWQ7IzUzF0J%BgIUJHPjVik2ZkMd;Q~Nm`C1%6cMvDESNYA<%K3&$Z0Ik z@FT&)h`p3qP|?7CnV8$NqDqSqB%V4*NSIF~&4iZuHU|~(UoCC&*2wVw<}hdJTJHy4 z7iCxU;J({|O4=7rpDddz_bo$URZwWY-uV61l7WT+ZjLCX^fVvwU~z;vdU^g$G3BT< zwMXzgm%r11#h|82;%u1}E3xQz`H}6m)Q-9pe%dic7YmQhAOfB8v0CFQu&^PF+Kp)6 z#QBh#d6J2#>kG!0w`1VqbtHgcxkw>04NPn=x{k#pdT864T;jc$Wh7`qV`=zk)E23a z@EtV%K@3GuF3i@oPvGMo*teg{uHu%QQ*ourIea>?f9}on9|OpjT@9J;$Nvw)yF;y}qnV zv*0gh&iXiJym^LS{huaB+;=r`x*E)Uz$F*r#LTpnK|RHlWCLKqAP>`@(u$AJSxLZ+dcSqcKQ&)yE<;UzTcgQhs+GuG9H zcrDGIA-fbsO=E<3{*WZ6Jq2hd;8=-gdm|gr2sH+vuE%XmoUH=NJlotwj!u27G=uR3 z51ALDdaIE_5Ac23@bX|_CD2SS5gvRvfvdutj@+fHDov-a%yeHBghvgc?%h;dA);_S zyUi|Rc(v{;l)&%3A{L%eWbu&HJeR^OA*k6#34Ta}tI`15tn3J`oA>V`s{8yA=2;Uj zZ^Y}ffmXZ%WAFxLch3T)Uy&aCPv|^jqzJd?ekP=z1711XEbK#-4hApNaa0|WNDltF z>|lZXKQnX&bM^Q`>3eMmB8teirT(;ao6EedG4b>LnZqr9@Tvh@IA7ms3xCfrYL;bB zelMl_m_u-G(I<+!)Vhsco7NF3m!1z~xU;!V+|h2E74L?77RvR@~NMR9wJ^79XFX66dVR zStaHjnYOs0Cmc1ZfjXdcB-S>CeOgWNNYtGL4}G`;vpHt`qs!HXa)am;l^N&xvnxLH z2yP_aIyTErq1g^emyODd)C0)puT>Vi*-2(vWsIns`0JzOA0anbIn0)CV&+ZrM~IwE zow}12OB0&HRw073VRdG_+`nIoLVh|$i?bPmHdk_?K0w1^?iTC6Ts(V6Yq0&7&yse} z<)ULM7ubG^{as^r$kui+qoP<#XBXFXo@JdItxTFHo2WQank$OuAcf@VK@ zFQY9Hr*@oykEOSJQ79@U24D1U^Yu5s5>epn)VX~}PGsXw8&$}t-JJN@PNDFrpx!Zi zwg+nY&mi@-V=b?vn z?2!o~s)BZHN^Z-S33j8rj-% zLi^Wu?YODQ6{g(TCG4OQvaxV*FEDwDEe5Qxl50cO$txA7SOUGPq)x+=$@G%u^?^gJL_iyt6xaq zVpl~!2QjDspBjhyE(8+@;b}Ae8?j%5@b4SBZ=ez&Smn^zkS{dSC7g=X;+3v;F zB*rsCaaE@Pd`4W4lc!r8jIXz6!_b1^pXwkc96i4kk4Bh?25G*m7>M8;zOX2=lB*mT z9n^F^ck1)iE4pTh5v${S_}jteo&k<#$ik9j=A&rxPf{Qy@1xCP>T>+x!w?>uGp}V( zhaEoS&DbslTvcTUH37!!(v*kt-KF$mY77w2z-#a@vBYlib;iv45C{mVPu5sNwUly2 zLMYH&3ZBTneJbOV-j`fR7-%?}(u8)$tkMh%wM2K4PfDH2s{gG0`nx%?d}c3BX1=rW5Tfnw$|S#b zlY(}Cn#Z^ek#Ay$Y%<%Q;iff9S9P(AB6St8P-}<|{&Hvg<$>N$i)2F>m`7a!RW`sB zz*2#K%5AM%t}Cq`We7^z5X`|5^o8k@aG*{d^J}S;sd%QIqz0_;VgkPZxBmrsXS)M2 z^2Wc}1bntiLl;1JyIRM`l%51nUYEF^)D zg|iL z^)vd=F@QX;VfqrAF`=mugbo50W#Aav9tc#9_6Uy$n$@2ZoSSCG1P(qEQ2w|j(N8JZ zpEnlbr0oMT+owx!emDVmP5P*`*fM@`4Bo&Hf+6Bf3Q0`FieQ~d3X+p+-%&cHN4C?Lb9gcM)G-|55lc!c4*k+ zWu?J@@L`=LvDa$G;JfbkNxnfFGDp<|Q|RPkn`3$<^i0h{n@Qi>BP&E}Bz~f6zfp-3=V*S6I75E=j8cc2t8%>lJu2=r@BX%6eof9r&4U#DjSfKzncg& zt3|jl%qt)oXrq=M220;4^mZzeM_+ls@J0noh9@O(7mt|}3X|;H#ef-hy!3CUxRNv~ zYuBB8T-AdW@9(992-NEunaB?Yekj2Y4I)M-Hw0myxN75X8EWTOoG}m?Ja&%$VcSJ0 zlet5s<5uPbRVpvnEK@H1slyTR5yw8fcN#CXVsbU9!$=OarAwEk1qnHjq~ZE7(tr>D zBjj{mzq05{D0Q-hAGSDY?cpBoRm94^AVAUyM6F(6^E&AZea6?d0iE!*(j5jwg>6yB zslevhF~X3w04mZ>mJp#8E2ITrCA{t!dtzm`-*u?($GF`I(B=8ySzDVnUz%qmqUp7d ztgU6+=JCwD!}wdlyIT7c?}i2s%nY#yYBNsmaz+m$Zsj>N3>H4_9IXl{_c2ICT%UGg z2e#cNH?_hC>P)nxNy%x3LlIxBeEkpYzE2@2a=Uw57{kLku}(j`{2)ph`}9`BfxPpp zUW8~b52MGW_g2H@nl3kL%|)d^Lc(CwC-HGDF^ErIyZGqU(|qm}&FfiB*mT_b9%dH= z)Wx}Tir}%h!=_eszEFs$m%KSX=gg@BI&@P`Yu^dQ?42<+` zhjr`VQQ*k*$>o)W&hwMw{N;1?fqP^*UbJG}5^&745-&nhZJU22{qDw-j)M#MK4!gK zgy8^Kv>&b#DYSJn=P|p8&ryQN>c4Ue4J~TbiM4c-(ZDHO9~=P%Yt4E6?q2d?-(?wx z#C?roS8#)Snj*_~9#o~$ldB1W5J^xZWk`1|b3A=;7NQTZm;X4%2_Q#9BH^2Hjr0S`|3{DqavUe zmiIQhZ@DognGq+38!CMZ#WqgDlJM+*7H65XFDx#1LnLS0e@UZ^bT>dQu9j7(vu-41 zJ22u1#1lVqXPv0M`MeRL*PnjnwF)l6Yc1q zT^6yEKR{PpzfD$nzkU!SXi6kTJ0~iulxY!d>SUWVY)F{v8own#`w!|eKWgMIR8xg` zy`+B~*ONj&mDl>Qw7R?DQ81!zLl(;7VZCo>GP{p$SA>In-k$ML*zAmzm0oKYqvtkG zOADOvd<5BnX55O3{|Sx(>^?#OJ#qw{4|WV0dUV2v)snGY-p&XL0G{i z?vUT~rnud&&6M!+-N3`&^t#H2F8AQy4g56MGXZA>2)YvVe?EQ+C|R4C)^88#y98S2 zOsQx<%Qf$HA{Abr!U%evZL-WJgW`^rlgweTxjEitQ#c;FS{Je{>%|AsqNB{yPxlYm z8hN$EAC^BU1ZMmib{}x)k7FIOeqx45v$D$7FH`>Zx=O!&GlY3wpHVYoYs|_RxaaG_ zQgS01m0yTN_#mEV1(2p10p50p5mA7E=}I(l8*dLib?>Ed2R3jS=0YHht2TP9E}8wi zhxzlUaVeZ%vWGmkMb78J6yskJshuGOo(F--ff%bOVvlR7i#7^k4(Qx{f%+l(7I_vz z)43X$XX{($3pF13bMVj794e1tz^aMMqII2S_HZ`l4?4V)lFGarLjVo8q*F;@g9-!x z6wqP3W9OCOyKqj6#Y`X6)3 zPNt#|UqpjDa3PikrhdX4N}gmoY04@|_h*Lrs7*;p(7e?^wlHo34x+R)U z3P1)>mMfN&**eGj%)y=ydfedyJf1-hAU8Rr7b(pKCZ8}v4OiqpBubB` zc2St#>HMHn%D50()NFcbn&C+CB|Px<9x7Z)LW8R?OQZjaYz2s#tjq~W#7C&?!RVC7 zYtfT%(f)8j;lWtC{7a7;Wq_7CKvE>1Nvl!IQTT{LLJivDWiix zFbL0D@3KTBkFm}Vd-^w%WYoh)9c$vovPp6%K&LHYF7YyUTjEtY8Zr9>foC-A+Nr|T{{YU2q}*e_+|Kwx+0`l9)oJUv{@dOT0gto!gypaI^UFTf8Jj zi)8_6v5H49N2+ zvLpIj9x?=xA>5mWLOqSafy+^>mV{+NUTaEl-=5|A*2mYDy-o8%aALTZ$*t-P&#>?=EhsljpJ8~g=FVi)~ zNPN112qrQzEnGyWP~VVwTwXTbddAyK+V#xQg zUk$~28S5^P6Zdu#!s>_G(2~zHHhMgcZU464vq}{{T~}pb3958hREd9EsbY2bzOd-= zAow^L0G)E{66>g006P!&++P!%SKsZ)+=8 zdPZ%-HhTT1u0spb0c+JKo5CCM6;2hfg}+;&hmDI#B!GN1|GAb;eKNnw0ci|={cX#J zpvbaNK(&&HPOn+t3F<>=K$HUR3n(vRTV?h1c%JJPx)#o|VL{~T^HU#ydD(hv?cpX= zrdfZ(n6d+Lf*kls;p*ahcjZ^)u+~Ali9?<1^=HO_A**pxp~$@AAyLh?$!}VOyA07?x3I+WWUA?5?hC&y5k_Cg95m z6Ic(uMQQj@pIf7nm+9(yj&>O5Ak(~c6+yzP)XGz8Re(QHIZt&n@tt0D;B(7rn@^oE zghQhgLS&ONH1<#W#ej@gSRnG#@Q8%NGxK4Wpt=hQq{wAHo!t9WrF;kh9$Ggcd%Esu zWNl3gCljt{2~{g69Sn6&;OdtIK3opI*Mcj|Sot?Ou+Lg6jP0(WtAlRE4AC0G&UxR+ z)#QWX^QlRxNcj8P+}`FSv4z3cD;{r_0Y=50c#VuLni(?%p=cVUPc2OBq(abw-8eGZ z>BC@PVarONFjPx6eTl3fw{W?0gfGY~5Gvo&g7>bAy=17TIeXkWxoqHTQK3Y<`6skTj9ApL2H>3&5%(r(_SPr#>{vfP^>#c~OE(md5_c>9v<%+pzC@sAGE48r1D3`(xAx z?5SlXX182o_NCZfBFAjEXNMg3;>c)&!)Mui6m5+DUZLbmM5%Xdp*o$?K(78EAQrQ-r z3v+(;6kMFF#o%n4vK-wz50#vZNF%#<@#7R4muGguLMxmBv(|%af(1Up+(@XEdrfSL z%lpfKbLj7~cYU`l2M9nCTTvIiNa z=z8;6&M^g3^deXG#7Rw?+b(erj};X`{uUh$DUo_Vv*7an>@g@N&a8TAGVR1>>c?Q} z5+jafttM$-ASXLS^9e#Rp*|^mntZI}I4(`jx|+|A0%5r-_~&R(rWkWw`Gd1Hg45EV z(Q33Id9!e9_3gCQga9plgiK@H^IY;>aQFx zvlPS%G;SiLu$qDf{z%3Th0ux0p6MIz?-(ZmFQlzAd3m3E4cuw^`eV|wP}pEt(!ZbY zM{}lJF`E@;3LX_wOl{9+QUs;fHNVN6a>s-bAEjAH)FwPQUMugM$kC8jOyz^^tNol# zR59OgFL+~62h$O|Uhq+yeI&DQjXBHc+C|_<=D-rH@~6DGizTE2SMI7znUFkiN>DGt zcvoBrs^?24ev%*7`&j%~%`%_NJx7mYQsja1_3`kn{+kIzq%M8X)iK7QsNBDfC(4q= z6+V?aVOI|0C)p`CF3ysUt3oz0fyyfSn?SQd7T^GKqP`VL$1Iedl;Ry!3(kEYjrHF? zA2)C=n0Z~!WjjtWTE_#&*`6x3*Gt3n&h@4;PlH?EkuR6RZXqowJdeSnSW6xivy49! zqD0(W9_mlu1Itw{&F)~wZsK@P*ew!$-j10N)z=T>hMWzHFJm%kmRI%-rDCTgPwup} z86YKqMvk7p$Xn=#1f0MBsBtGlyXdl#zY}d-<+4Q4IJc9YejE#g2OIMJ9`4jh@&HNv*d-h zg!ef!{N2RfQ{8>z<)eLDk|bq?quVQJeK-?W8y}BdnUi9JWj*Ccfn&uz=w8+Ysy)cN z!P(i=ymeVf^`UKoqxl@$5wK#`AUQy!ur0t8+{=+`7kR$4Y_Uf!GOly#aXhzZV*{K8 z?c)ypLnY`nHO9B$opgci$u<0f_#ZPVSAzsMKakl809qPx_))&dG^zz-9w#j^fgFrc zbTE;^<)zZ{^5{jfdk zfsu+g6seMy8scl*>Sn(76?X235vX(qI4!ub-6haV&b{~C8Ha{04c=C%Yi-1M@GP2P zX5jXZk&)GSoK!EZ{VIqA=l5aTlltnP;)vm$+++_XcHeaIOfKlt=+|bsNYh|AfkxpG zqqlfhPX3_xOtFJhnyo73w3sycoy{4&uey+!S(j>*xM+s-mbTnp%7+0PxyJg@Z!DT7 zKiUplL9}u}w7OR!o-OqsE)3S>s6{HsUCJr=I&j z53#jPS_PwQFX($9NS;iXHa*~#$lz>z(lJEv)Hw0udzSW>Mgv89cc00p2XbGf3ph03 zo*tH(* zNsl`Jr)28?fsVj$5&)^o9Si>UaR-Cg-y4JJIHhNrH*O}g` zfKqe36z;y7e?EtdIEBVgl83TptNPYf;5OEU#5N^Ju1!hA`7rz=ALy+q@`gj;c--}& z^Ds_a8GI2%D!l@YE^8|{TSt~b3iS=@fEwe&W6a~scCCLL-I9}(0&+@T&VaAO0md0l zdbcV%AAH|D(QUp29w`bi)BU+3HHB1e3S*Wx6Jc^)D_BV>YJdJ2_?g@mXngnRTen^)r+C>^U~fZQy?Q%I2Q3n?#8EbF$~+A34uL&X`~c89>~2j; zS{m{rh>;t+D%<;*YuG!2$2W+mNtIL&%c@e@0)!iqlL9%ZjkM`+JknIu1B7xJ<7b5Z zK3={gn6uYR0_lU=4s-o}p+`vl=_!~%4m5x0@_C5h)<|9QDh)G)q-;kKnJQ}PF@|!( zXphenhSHXW45mG^mM>s$d_t&m$iNS0w0#NTKDiJcnUt;`0(5Bbq`k$pz@GYHBt+Bv zDcTnOdoh5>#al3&DUw~XEKZK-`}xK&0R5cdN?NnO zbWfssP91Yy`S2ZygP(lXSR5OFV$fS?5|H;sR?1A4cKN2BEq|DT0$7K$nf9Yl(tKZ_ zV@)DBDqJ`rSbAMYQn*$Y?OG;QL|nw5)(1B$8{p0TQXkWAf%f@KI- zRD}lqSug%=OQd&tWaxeb0>@&?YlxQ%u^7;BS~~M=2*K!^6l`xYXwNr}8S_C5=bESP-Ng09R+LvM<7{S zOL0MvU*@i_Vk)0-*g3%^b!v>%WH3#xhlsTcLHwfmz6&|bvyO5nKYi%YN$QP?(hS4Y z`%`Q2H)UT8?7*GW)bF%JI-F233~UxLOBbr=h}^sStm$$o(+-L&NYAP0=OUDOrT~qn z$)jZJprGK}bqlhv|Jf89HJh^IzH}uq37%h4EX>YhGeZjDu8)KGCnhWK%?{yJi7Dpk*=Vp;6OtUGNUDvWb zA~cyMKb&*Ku*Xfs7?rC{2>XmENs%IJ2H~tJg##sL%15A4ZAbdcMWG7YT+m%O7b^yW zE`HXI2-#gIw1dJMygS&*=95n!`fCji<(-wp{6VQl9UBVF#MVdx@o_mIR5_fKWlg8A))4)r=)?p(GU|e9DGuoN zmvQ(-o%m2oCcj{8+yN z=Or@PSrhABD+aV9E7mXzTI^Q>fcHSlTe-;+X0CPy&qAa+7W5~=BIoU_A6moL_&Ef3 zfx^Ni+Tf8>LA!{j+nnW#P1A!&&6nx>fw%W>zp2Lh+eTSw9~>F6)Tl}R;MSacPJQQQ z@_Pq8anEzZv7EWdIsyLRDKq)F8&7k+UmW95npvK!sSLdkVm_CK$#qrIIT%oAE3Z@zWA# zKh%J6l<1pG_@t}h#1b)7*cc~MZPEanq5y-p@oheiAD%MeW>fJ|)j+*bfK5$9xEK5S zz%T~-LfZ(g8O@1FdjGL2vUQi5xIgJ$hKfU(qiTZuk5t~``*<6-H)lcwJw_#gSqUfP zNS%=O=8R;iPr_Fms_w?o`iOAAj@<_ieX*fRv+Qre}Vb9JD)bB4Uxo1YS~EyQi05rhLpr% zM;m*B*2m)vd7tAvP^3ywYwD4l&0LL9niPAi9F4_b^Bd73JcpF%?U-g%-s*Z*nW#m^2L2kZOb^iQn$LxBr5B zHA~oJDoO?OQME+UEust`2=y*BuE^yb%RY<>Uke&QrK4c*LkPbRk;CP%ruAHK+Ng7P zqO@V88wo3a2w6*G^#Tbfo))qVr>2Uf$-8+e0JmpPmZc+8602j(-;egFIMvjoHCudc ztI$JrBc%flRVB8|1WU(WfrEYw>I@CMb3avBp|`a(+<H+SLEUxGh-yRDt9rC`VwfAZRKAiCnV+i(7YBo3X zVgABV$!s=mN&D7T@%c+Igo3~Hv*3bU2hUzezP%V>0}By&=iZk)Er{+#V})=j3i<7M)-~y9 z5U|&td{$+Q!^TzBT1&jD-I0Emp+uH#bRu`uep8oPz+kt~XcRY1+woY^hxX%t%_m_A zk|Ff0s}&JsHoQyyZ=)}+i(&%80j+dl0906)Cu^2AAT;R|5y|touED)cKAZ$77ua#J z>U{VGc!nkq4UBebi3@_@t=|WuVb_-XgEFWAPVkoti_@rf3=@^B^R#V~Z_{yqw`9}f zhW{@2_o?R0g2mi0GIeWOY84#MuT6d1)}qWFzjVKd|qv#a0`Q z|9U)%_^kN;Iii?|l|isSDb4K+Ze3qPBxy4^lfi|S{o|6{VojB6m|>nqBs9}>N1LR~ zFVsHgpc(Ns6_J4@vjiIx-{g#0RL2v$LhrMEfqDVG7pIB%QMHio~@G(JE>)l!;T2_4BUxxXi>8b_T+6$8z2Ftqi zKf4iL1uN(=bUD-Al#_ky%~^-@{$8`KZlr*ifs{M<5ek!>c~S1a+D!Rqn16{9MJ#k< z3xkkwsQj^FU&Scm?BW=4A;)*eOq%|EbW0j&-DFez+?^B-sTxe=^CZl52fIX?f2ZT* z7^IcU<`WvNP?LljdWeRplndPRe875N_2=&J*Q@#}odGk!2Pw#y{fZ{3w8VAqB9xR+ zagD>UpZ$_yWJhByni6kJXuTP>ftlPYW!b!AZ{?k=#jdWpSPu*8B#`xf!lJ!30(Oqs*5?kq<}_T=Qj?ff8A zi-Edv_DGXX(_~Mhr?nT!T-_XrZrE{b$T{-s9^MT}N}D-Gi8f+jI+1(oH{&wFm;yDf zAdEJ;0(p^wN!lMdGnZebX&|EF*4gxvT*!HGmxJ7`Xn=wC)blR zTadgVV!!(^{HHNA^~5seXmoWk!9z188)CV;O9+qtIUR6iHM@PTng&-2Y53lo1jn3M z((Rt~)8iV<)e4We?ekSsb%}}PG-J2~)@AZ7GX(1cf0PGD9V)F#E|{s0+Sr;34MoND z(WK2FPl|P=K34*Q^byvkMNfo_aqyb~{;-)K9Iz|p4pqsAY~GzB7XEc}7>S?>?A{Q- zLVeVX$oN*D8R0d?^6*oa4J;D%cBTg%*xSO(4i#|O`@zY%A4pIPK&;Y9A2-p?8ak-j z%xu{KmJaK0wohDy>IPT-!++2xr_VHzIfPF1!CiX(%P*3E4(fn zSR+_pg~-Q#%EXQc=>i#L-~cD2=<&-Uie)UN^@m}H@0VtxJzy(SsZ*)UVuE!`$k912 z-X^}RgVr|4(l?uXJ(ILP{>w}#e&P`^DsoL7@6y+^+Hn3xPRTunU}VPXNfl_)YH3Px zBX$qXRxRSpg)98&&`e{U0&_4_Gy7g_zfguelV}M`-DF}5|{#v$Uxs~E7D#OAlW*eh*LsjuV4%z&Q zfH*Vx^a^lE2syP8?EQagf2-RNaxr5Oev$pr25+hzXZctzYMsxV1M{;q=gbS?H}(!= z#tpb|tp?~iQgAeSp@kp4U~!==OUaes>ql>d zU&O?)nbNL5(0$*5u#>P=p3N0n`CkTZ87_eFo4TC0EW-dUDd^b2ke@8MMu@3Fz589t^hkv%IsT8wGBHZfw5?hiN>CrZ!#9v(_& zT_-VQq#iwRZw=z*3UfOSr>Jp8bi?QDq&I&Dtr zMwYAal;!pp8Ogdbq)iKHT-T2Whc+k(_yW6ph;{^I7C-}h0oiQvj*NB zL6Mcff-z3e;}&=-BtIkB&MlemU^i$ziqtsnaY%fgUdjQ%LSp{Ke>u_S*GAA%)yQCvcce2jq@eP!aF2FU!|*h!n_NBrKQ@f90|)VT5|sJgu}c{o$=-}O>1JUUBQ@XhUa5x)V&UP zHXdV88*Zl<-mb)mbX#jPby zDTCF&bG8UEu0x3BEnCFc^Cx?CV33z(uf|CVe)K{&smL9TRV;Ntb*#5q2 z^5xtJ-}4+`)N;0Y^NSyTq+vgU*iHgo+cZK;nOZpoU1!eL8>>Z+7xiLZ_iB+1(2T(XhS9!2F$ zbZ9XY?MdaVU98&$7kwT-3I@FBDy(Ayj^vmmP>vdtdE%M7fsqNNqa8aJ`!R7^%DFgU9bms;ux19!zbVZ*rJylD$@xXS- z8%E7yTE9#neHpJ)->g3}dmYuCEng%`EptmyyD}YI zqtcyLi&^N!m&Yy8@pI|ju6q%-n*`S5H0+vf*rLfC9#^V*F*p5`_~&r?l1~u$n=)`U z`d0!K6Vg7mahJ5%Y5*=YoS_710um@^xm@3E$Rfm-ZDlzeiVPQ<{v?XzWw#xhTeHJ( z^7sKcCvye`3{r%XM;*pH$0?-=oERS%mVAvLkK1Q32?u3c+4r*K&^PO z#GsF6s24TGDk9gS1GH61+M~rp`PfTnE4Q$l^IR*wrz`VPh2-(h{9$GRIis0|0c+4U z?FdJ`j@h`Jf(H5wJdK2)7V~eX*Wl3lXPwid9O)!)DBW{WJtIq5A54Zfq7g1 zb#VsANeyktQw~^pWAVeRbN}T>&B=8WIfcT?M%%tY4z}60q3XNEWxa~=%xRey`GlOp z5BeNX$h9!S)&N{K>9>ozcZN+kvjoO2Jt>;slq?<9Eu9=aro^UvNBq}TYPi>}PjSG( z+!XVuLXhmcxvGhKKPvIdmw_dEDWeIZOi6?#jsco`trS+AbMH5i1J?LMv3AJZ0$2hT zavc-8P%;B{-XB5i_4q^By-VWigG zWEgc^TfcNT%DkW5(SVRcwdG=w=OP(Na9hQ~7t7zYX0dcJOQ59yp^^NQ--tBZ_mqgp znB#k8`r)%s@1%t%#vDoO#oQ*<%SicA2Ok+{E0>Ds;{eXzASotfDgi>a*!i&H66tjk zr9JWV$c!Wcw<_s=*GE&rguB8ZEQrB=&+@w#il-HhKc8aQnLegRjR1+y_7-|SLNiP$ zNr$QBDpUK*G-np&Nu(bwer32BhgBD09RaNSasH5n*?}%J%LVLj-Sx_UwKw>058G{R zAGtR|dAQgY=4Y{=@AjngUM}vlSz-l^gl*+(G++&O9IhzqD{x-}??ua17HMFfnKxLv zmFXVMLgTwAuG5eot3WBNDEQPw@+yvSe^Dn{e}0f;94a5 z1h%`#Jstvo*+FSFof#XQm1BqeUtj82O9(Gm7SjP2Mk2;pJZI5&nM$zp>`%frqoOyR zwDr?WMJN=AQe~zESZt@&r`yzsF>I=A*N=h}`Xw!j+!c!UR_np$z~5~l%rX|g1nEB7 zfenc8Ns{q#R?D!hVa~^14?;upHZf*52R9OtrOi6#qD7pj5n;;7;|uMFPjSI`sDYpF zIse{P-87*{M9e0XisecWU4T&jg$a^ISueo}6Tmt$Uom$6K4RF+6Vs{nzFf&$gFHwx znp~y5_@4*?8)!f0i=(wE%)&jd)ZjTUj}s&nOYLPGmv1|#>wosRP2PK*`-9A_1pIJ0 zex)e#cCESoJ{Y)eAK6tH<5EXBPm;oCrRbD+L$R+dX|A1L*1bX$&Yl}V&?_j4YDDMd zI9EX#2Vl%!rA*N{2Qv(B&gf7&oV{b@np5-{mjaDYRz~uyQ&jv_WZ}~hu8~8v#SH|u zTXeLNlmu5Q!D-+$_(Uuv$C_iao7lKbG|UMqWYs;TvF>Ufe0V>MDOVD8PAU;#Iez+w z;0|RYb3FZeV+%k};F^3na+OD3ZG0|I=;3g?#&!>-<19O{q!(5+)3Uo_e~L9@y{xBV zw1vboRe2N=;d;?$o(Ji-;jyJdrL|@hu3LNg*tiDaAt|GPCO$|}99NC{rCk%uL}VYF z_etY{A0J0B(^ddQK)Szh?erxc>S)FXyw z1s0QUitpE`BWK;16Mt6i0~b7YL!E{Z6)cT({lgPSC%V9@>bgQ5w@^YELvNjV3h@z-3Y9A0HjTIletTqzjZW%>vi_fB)g4Ppx>Lyj4SAGXFE zz+?d#wL?z&QCPL#6AEfMD4$tnG#x6y#c zY_=ej{rw35f!#QxzVhIC>b84&V~#+m$`FLd*Kti<__U@!ZZ4PALH1itCLuK|i($WN zWfqP(*&Ryw{lliu5@DEZOLtI*{3uOrZ~vI?I0O@0wd9ldnRbV5CNZ^L=Dw9Dx=-5= zpYn)=Z1Lc->^L>;Mo-{N z@L#KrkRPK^t%(BUhxZU6R)JSGnE5P+=VO|yVVV=LZ}0xwf8*jKFW-hC%&qXqjv&^a z6koWMR`C(xk~w_SanIb^S0s`mV*>?q8c?+L=BCoUQS)NR1{ z{W>yfBAJ3c1WCWKc5Y4>F*q|>9dGv`7O`yzsRkJnievmCE;oB>9}MCVjsnhk_-(+- zdr@fGFxokS2x~FE22-mJ>zg7^u9m^*9m*pX<82QZaK3U(IwdupN>U_$aZ?J~qF-JIn)Z1ja*#Rc#j1Vui~HN9{>1 zL79(%s2vuczsD7^ZIBe_ER^yNSc7e4?53U(%`>X+)pOMNPi^xD4f7!)7~!Q$cLV-Z zM!6&~)l4Gy?Lq65PsL*W_vzYOF)$tGS8HecID^eeCk_>8CEM|2_oFStV&<;(+c%Zv2c%N(qDy;KaIH7r=4P`Y}hTEx?P>L`P2;(YB0O>P-)~WPiZmr&z${}sHdtgzc}M$U6W&0E<0*;Ma>e34r0UoWQA zS;FckG1$C}A~|!W!NRiwXBUmReA(5I21o;|F`CDtB!XqA%`Y-r6HgiJ^oJs}Sp@uw z>>q>^1~}*BcJ`CMuNL^GAmyMSS9TB0jHK;1l+sSf)Z4!g6y1lWbO@-{^Aj2qUz#f^ z5Bt(^2hWd>@G)2)T@#T)F&81}P?%?k;Rd3q`i4(HkWrATUU50OlSh6qQF8;>xn4W6 z1$D0Cf-PMz(S$TiIcLvqvZf%${B)=C_`i&TLs8?Xk6eAM#`Zd*yG691hd4vNDIa+> zAKH*^p@Vn?+91*l26RZ?N%Q-u5wNskUFPxEjytMn_+=%M1+9coLUO?G8|gI%8Qn8d zYGo>43poTV>_Awn>4qwD`8Epbyd7qDY}Ns*7@6svYDMQK5xE1OChi}4BI~(L`zZ97 zzXB}ZbT7So%ro#J1;&!&DqOV8C)G1o95|GNgAHa>_FZ^+i~xj^!UQU5Vb+0L-HS?I zIRkNP)p78M`M&thDFWO)QgIal5mPnyS9d2Ysxww`bZUd|cTbqs7yi`E{V<1Sk> z(c%CV*UqC0=UV06KWbTEq16p`t`Z!48`Q)ZMZgkd_bmD)30gIgDF8@%TpdP`G;)zC zJNrg3+G(~8(H_6HML;-&HRSl4S4m4*fs@7r4i1-siqdsK#uxpCJ%03_6@v$C@Qskh z(lCYXBmy*FQl;L@-gN_0t_w`aWjC{)K~E3KfbUQi`+J}3{2&3Rk)R+UgkfRqes6ld zfy$nJ|j|BX*{eZk?S4*&ubX|6;yXp~!HVMKT!zHF}Fw+n(FlOd*u z#}jFC1f>8RDjyPozSn`L@oy~*FF&@(Sp?n{feI}M=STN??D_LE>$kH(_>$)L1@h&& z{kv>z;q+h9`s}7{Z4UaZEimTgfqi)MxrHnoH(6WCQ7zck4LRNX{Cvvr+tpy+S<(6IV>Ub z8|X5UDPUzAkq#je&E?Du@-q&XxPckDKlXWn9uK)(a~}Ep*DMm^uQB!VdKoKGb_;A%o=@- zynkK99tu*wt7vk(nhb`L4q|Aq(r9^mK^SCbCeu@K%_q8Kq0?$XwZiF8`3K#jw|71+ z%PTeFySYN(+mk-tYU@2=s0I%UEDg_VbE#E){q}O5RSrGamjgheYqNraSaDrLw281o z5s_c|nZNipjh=;M(Cf{Lg>syoP1|fbHRxsl9*A|_D&wuM8+Hyy|M_6lXyEy_1bZ|r z3g?Q9IUI$JLB8zKD(`mEY^Zksn^qBJfC{%{i_icZv(I`bvUUz#skrb_A3#uCcWFGj~@@+iE+&Q!{PO% z9Q43!eJiR~X0!bP+kKSe+d*3vaJ+)Pn$?f2ta2Te6R5bpbQcf;motSr=@o*F3EQTx zyY%RBM!l%Le|+Ipl@?A{T+G@HD{nX!)z0*~+_C&5DP8$vo;EsAyb{GZv3%41O9|n^ z!&tRLxULDPsIxt~)Ng6JuKBh#FC&7txUh_@m$xtWkXf~CuE8=|jIDv1u3wlOq9r!e z=~yNRg@f0HW!>ege!|r7X1Un}8e4|ug|kp}6D?~BTr|@MR4~#+GUHu^i>aiQM4re7 zP)=;A-jJ#DLfb|vLv*W7LTydXJh?RWvq0)=&-7wszx(Z-GZB|6z~UWn!*0KNjVLb< z5fso;Ta9)i2pA%(s$1n3xk)4SPLYQ1-F!_$c>U4OTPUW|igKE=?7I2k|E*e!`>daJ zZM0zx4BfH%p!DuRHv2jnmHCDhAxGczJ+QFemsT{2?Cg&;zE4W@oF?SUYi3DZ`caM5 zb| z`*cBULd4WIFe0S+YeVSjVHUwB=`3xU0cQ$pt{imZ=xgj`(41|bejHvAudueyJx)a4pNFVgk`N&U_h?(K0b7)#6%FcGMiROcv(v8GA zGd^A3SntBPKQu55{+O%JQ5H8n^MB~SzQ1e#MFoA7f4-41XYj}WArk#R{i~3pPRcR9 zjAmw9#oBvVq1zx0P^6hDWOO9L!L+5w+=vB98P6vpEF34!D=bcT54^{qr0^;U>z^#@A=os zRaAkp2wKjHFs0HO5QU&)1tr8}L4I74S6*2JSH)^MN*AlMQuKfv@RE%`9}IW&1wTJT zGeVM=?Rm1&p46%l%Y(A9xW19CDx_JD0mA+k2|W9V83WamInNy-JiW)Tdm<3KZ!dzIKjT28 zHABo#Xf(!}xO%Q(Z$Ly$XE350o{~Fs@RNyx>|nEd1XO21UGkH&6!NQeM>2ib zObSc&h$bFPW|Aiw2_`4~1Zc}&V?Cot$%^{3)A3{a+DXxvlC(ni49(qh=S}|cGftr{ z07rf}9*6C7`|gAL!RPkj#?WuW7gZhW-;ptPgYLV#CLu7X6=w`0=^{cdsF`c@;>VZ~ z;26}U9E&hxy8>wk5iLQ6o=E%WAAK_(y^XKlN9Lo35dYDH+x{#wVQ28bqpDtJ9onqa z;7IrA(7av4wA1o!<|G>4y~aQXURQp12t)R!{{NZ?oFHD?SBsI?hvf4pAyw#J{}%{= zrP$TZYkdr~cp3;84;)n@9^(YbPu?R&;%EG~Jd~*86=6oDyCkMR`A70YfUq-pq$nj1Jel7 zjIT6tD6X9vSM^l{AHIP4(N+d15NbTYZd^As5q8__DT7WJlVO1G3cg=NaHj|+AuAe4pwEBQX>YRw=7!eSZn{7Q z;6n&b($lkVm;_s?IUQndwKcOAb7FXqOP(U-S^8&v^n%|!;)RJzo0ix!swE05+yCcp zg17(kDm~Wm*M+I01cn)xXKfDgws*HM^b>J!Fcz%-9wY&Dv4BIf_|H#oqo0I*O+ij! zNt$MXX(?W7YMWcNc5dUX)Z!D&DDc}0g=?}8!c#pHuLWhY7s7Uquoej)@q)~Q>g2lk z0bIjn63!I{&OUJDcN__qW&c85A)Q2;7o-90FY^F!+>^OrVyZEwmSp!1lp=zULBwL- zUlb1~arBowWksDM`*`5z*!SHLKV=F%LP>Rdg7R+yjAiEc!L&26Flp3Fr!g{7L?5}Y zcKn_xb$Ie&znO_5C)UPE=b5`OaeXR`{K}OamFsFZhF}%=T*Pc zrVg7&IVS`rcMGIVv7c`?M1=P6z~GG%TC2X5mx-c)$l=#3<=++h%rvt;4XJiNCCqMqgAqvAI)1PA&j&Q}OLTz#5c;%8iG^I$Yi# zjRdZUQUJZX7bk8EHA>2nX(Yej&GPj=>6kyoEDq)gFY90&dO2n0eJitzA?O*YGx+dr zu!^+n6;=(+kEVL38FEaAsYeBjJgpB@A8z9oLMn)vWB*jB9_{mBgzUbsGNaVcjCgVV zu0{2{((L%f^DJyBt_DDqeb_ZvImI zk9^A;CO9mPf(7d+cBeqi$Hp=tHZFLUWZQ-#bYRtLIIC}s#Fq6r}TExim~N@_D~p1{X<|BlI5uU|w9>{68$4<{rQh7x9WsDa(^Z zXU-)P+9?l|#=lYD-Ir?)RhPt6OzJHotIe$^qtvBE6k%z;_{n#XT=(dVy#vT%&S%qN zgF&Q!*wf+wUYSkaVU@-5)9@aQ%ZhVnU=+H>+Cv!uoukfAsLo0c4!WK#vPhQ|Tl+Y$ ziBPBuW^6LwAFkHXcy;~LSX4NX1YJDR!ZW@x1-jMZcZovoae-t1X&M- z|I@IlK7i{d;eXnI5C)kURk>msYWlJm^7`jB)#hf}BfCGtnyfSZl+V1pV0E@cWKBJ3 zY6xI7t)tO?;69FmHLM>}-{U{uNjXUNpx)Kz!z$0snQ7Nz`l;9)H%L|DENt^V_j=0_WSlFBmy4xztJ|NT5n_dxC${{$qd%F?_ zn^|t^;I{WpQ=;{!8jqUo;-5qpIc=3aqJ#v1eanCbol21Gyn2WAa>o(f_tTCS5eIzfe2Yt8}TEX7Wb zt|i86wv$$TTL5s|G4cqHSk8$1eL_ho1aR82+^7Ib&E=^MfIG)lT1TnLaG+Rj#rt4W z7wqiqfW<0i!bRqaxCNPBn0ZXuC|5LDCC|`0lpeQQ+svtOQz}P`$Q}_jyv?3TqH=mZ zGf#l)?SQvPl)0$06v_iOKib*<4{|8*>)(c7fN35tCCUP?6Jq80Pcwcs^XMLp#XFPc zULuRH5YxS010N%LFIv2xKILzFeWm{l*FM_Djy&ZKI)0S>pf(2Gpp40cg^?~i#mPEb0JW9wk&2GV~fWIhJ*Bba0E=cfat`W%2sN55yA@%)(207JKg zqk`QOFNr+2eqhF2CV4QZf~8EdZyg!1`Z)V)eE&z}tIK+b`Ve#aNpdnvX(CLfdJd{_ zl1}KYlyZF2%O82%b}vMgOggKvm&uj z^9`^>aRS^q(%>`ilwVe$lEH==sk_D5hTYMEq8~&FDl$mCG8^dqrXd|x6I5htRsSGU zNXb!|8ad?NgL;8Ju_pvkNT`qu(aLev!`m=5Cyx4v^5-Y)|ARUhtfp; z06L;|f3%k8_fEk)EAB-2GWzAmV4iB50Aw$Xc(}iHDDDu*tVQQS$|jxc!6MqVPOA1) z4s0L;lJNE}EOOer5(;WO)I!piqT<^ys%O^@&`6z_Y}4$-5BRP)-!1BV6062IC)Axw zc2mAm4;{GJT_W}}NL{H1z>s0?>^&O&tviir9FrVu&;dsEA@U#G_j z<6s#%)a(GW+j5#f=~civRQ?$H4g=l?;v&^}3QC>=LW%X=r87TN&H@ad+xrI;2FLqa zRFm+?;P=>i1?udicu<&Hn|Z<6M*Yi18Bw^1z};EF-BoO_N(afQV}{C`>15LwOHE$v;USZ~fc{enmmQgFg2~g5S=*t)BI_egu_w39&2yaQH|hdKNDo z&hV{*kBXPf9%`q}*{c&v4z73mdFAlK-*Og*{pOkcLK|TJZ@$a!j)zodI85*>)$>_k4oqiJr$qgfZzuy>%W6JyL8B}XPJ9Ndngm} zC6ER0s>v8FL$Nrta!su)%~DIjXHUh{9~@881D_ShrI8gT148i5F709vjaGm6K?&X2 z3!#a%+|@xS=<=9hi#xGFsMeGL+2JMJ2s3d3_bAbiClyS3<|`$qmQpiGY>mwg(gtMu zZ$NtBH+&uVK5^phR7IJVPonXRENImqa$|Vbpxjp0_sLgIB;+W>h3|V9SfLlHq7~lM zIh7Rd;twX4n}r{B#|tn5*IVO`zoZgy>ET@4`I1AD=!yQ({!sEW0+p->^8~%64D-HON^)W}KKvSgXI1J^{Nacz^ZARgzvW36D|IT_|Mq zSy8Oo7^NQBvMRj~zq;W^FrwHcmZl$|$8H$j@lv$*xh&**DMpa9*Nmy%%!e>LcTlO! zeTBfiH34?!GEZyRT#JY28EIl#&}oeQ4utZ8a!m8jm7`=SYqYs9)|;pw9rHeFXR0l ze`jp9`6cKZ;zQgUtJ>ortjGq8GzeIPxEW^Bp#FJ1f^ICCLZXGIAK9@EBb4t9d3=M_ z^t&`AuR0|8`A6jEG+Mjp7QVtIk=%~(;KYZbJJV@0%5mB+{FSvbJYSApT7s$X=7XA;2B0Ch zZe3vtTjfH}lFo**Ag@^j}3Gp=AMxz4xcR(gxDBdS+Ozg?AaoB z_qky!=JEY@(|_V%k*Qgj`lYF3Z#tAyb!|sh7P*e^j`bOtbcmXH`YLO4k_e)FA@&tY zC!ij4)l$KJp4TVTp&cHCLIhMv8v{V3yx3|T@g1#&)vbtHfm)q;@{^FsKOedrL8HOr zJ*F8KqTbeo6U|+_rgi1um+v z0M@=_aJ0@GXyrO&5Y~7j3jtP6iN!x*nF|)E1Aq%LzXxx5ZTGqIe1h!xO)mCd{)g9< zAJY9LPD1a!m=G)rdCa6K7Lvc3WxU-xbQ~WLXEpvAFrQiWu*<3BZF_!u;yRuU*^$@I zPd+#4hvmL9H0gLiJ5jL+222H50$j*g0!;nF6{K zmXY1#Stg9@*p$X)W!-;*TiJ>&Ao`l`xp%0%vJuBZ2jBQL0kMdjakOIp_prfuV=q$u zJKO;yK1=sIS3ni@bO9(!f#_zwIeUF33&8v16EdtPj8OZVPhnyFqt;WhnY&B z`-ho$I#X*QpR~cK%XYA$3j^@MNTkh8@az8oOJYCqEL=Tkmd*~dl|&)!u9~UZy#PdA zvdYI+ngktJECwudqb&5*>YG^n;ob^0pe2@B=Ihj)Lm@cUAZ57WIWxabHTzPW2O#WZ zU47J7;gfK0>a&?{iM3|DonYa&Di?Rd072S=1$OsmXTwv?B_8R{AM7KkFb_u+y@z3v zD4zesx|MTagit&r1gJV60iMo2&kgr>u}AhH2kb=QcJ8{Ol^z2k_-)SRk=(k}5EmB? zOK)OpXlOrQQ1tkOzT;3F(4W;VP~xBtsyMRkdxT$+%LJ?n_OuCo)+-F*HWp8{ut7=h zb3b#2s;SND|6<~6XGYJ1m_PMXGzO`zxxwVW2(i4LxUOz&-0WGfFn~siwGTDwRf<__st~(&R`sm=3 zQoj-U$Iy9l*SBr?C9gPn8OrQ)9xgfOj4X_Qyvv^waR=A=L$g%baO*}+dUaQj2rzy9 z=e(`isf6rVJtI2Xm$VzG0U`@eUKNlZo>_W+u>?bAZ?#r=D0zWODmE^(yziE||K9vg zglCA=h$y}H2Av?ptQM1GSgp(Aq(3?ld0s`)Sy86?X9g?`G&6QPNJtY%#V_X=E*OYn z;oIZ~x4CJK^jTqfB z5=@pGMntdtDe)?9wEdA)WL!cy@9tZR{`vX_#a=^Y^p=zI0H#h0*~uX^T}qmt*Q#5XC) zhLc~DKFPE7o|pO3y;)v)?O#QnuRK)ASfIG2A5dGQemH2gr$x@uHHphZ6QS+bF~@G# zO|`y#FRPqmrQG2K#{Z6KysDpJxUjye+r5c{%Jnag%HkipI0OE7-HQsWpPP+fhAb(T zk)F^s1`}4o;%xW6NxB)vPkLHX*&Cjj?k>suv?LvEWhZ=1|8d}Ki!kS6)0MNKJyajX zgTu0j%Y0e+hCN1MGHQGm_Qw7Ge2NN|iNq>s!XB6hQk&IVuuggvWJ#y>hg$MUox-}?#jfP7uT0JGZk7#D;Ho~pihYjXWW2BQJI~fO z1~*Bz;oyY&cS;Q9Rbuzy^oi``nULUDJ=V-)<>9k|hEK)AMBHoq$uDO<|Ph$Pj5Mf@eQxq8+j=F0BSS4i&j#!Ae8?u0<0dWEb07dU z3SOSc=BK!}@+VfRB+I4DPzn~aq!|+=Nb58|^vAC%+MQrnQpy@gX+5+Q*~Zzg%z-l5 zhaDwYJmL1cJBN|GJ3Gh&yXZKk)21B0+p=3ci+z|W5zuwT5Agz>(3XGWe#iQy*F}qN z3!z$8Y}e)Jp_=pi7^1j^4X60;VE_EL*1 zzNk$oAJ!=xRbg)8KR4+X@hlpe{pkc-6UO(=ywi&Z5cPXrHA*_EC&%ccwN+{Gw{)}4T<$OPG zmdurNxipRZpl0IlX6vMfiDCs=Vhe5#@$({w)~5!un+0lO9ilKDpQrlVl>V1Kq?pN| zQl$3NaH9#!Dltlpihh!d%;f%)U|Flo^Qb5SrpSnOn&u>VFHfQT&aU(PDC!7{>_`{C z;pmD!TDS!qvr{r5KI-dm64%yrG&VXgV%B0HDs!qr^=DQib##UDD-3SYZ_IU}lLyw9 zJXMV3C~&$(nqjVQqm2Y96;TXdGBM-M19mb7Bp?UsT$U{GbVS=2IRqPnJe!lDgMjN`bZ57xQGn@_YyqdgMxJSQYQWA zt{Km`EK5Fma%MU}v;#wF5;2VNclHoMAaE9Bw#A?vvOoJl;mXMDsri9%`(f)n zrB4B-e6R~+rP+L<2$;w_f{lEvPHUg%GPS+wTKIUcrz8fMWw&zpR^O7@sEyjBeoWKr zhO9n&Kf}A`aG|5-S6c8I8M)eP%+5*v@~!{$bRh4AHOKJEqR(*TO1LrTwfF@|Lz*s+ z`2dg;a67vVgLa8;fv}(%x5_Py>IlZGtd}dXY|{M z-{LKf3C@z{9o2*Kom^qfG`d?j(?W>tD@VPw65?{2p4n#>|G-cWT6(n^^(=QHP2w~1 z;36XC5!3#;(-Vu+-s)SMAbVeVvb+3z_*2)9;jb)G=4R%~uH{e92W#_tXZS(3MOpsY zJPi_Ir-2irQbek`R!X$=7lvMiih=V8g3~xp3!rNY8m;HU{BLCkJi$u#=(dm5Es?rp z0jkM&Hj|)75o%F@1L>90oA;ZFuW)Gj?-syFloQfnrRj1V3F$#s;_E?D*#bml0s9Dq zJC^m~!MPeE9;q8ppO#=hI;`c3M-B3rIT$ad$&wIDEMNTM*Tp&XkyP7y33C>r>>-E@ zIMsAsXDRa)_VRNv_Gu#W(=wU=`C8}_65+OqwSMM~RibV+pn*$3O-Ps>4PCD)Ba@PO zA_syyezg?w0YBpn!0x?tTq;v;OHQ|ol^9{khVc%2)0?(9aU+yQU7t0B`-WL&LZZJ3)s7lfGIS=t0IC- z?PbP4@KsXflQ_rxNlgnAdTN+h7x3wvp?95rcuTY5w^DaZuWWv-8=(C}a+c0nKtt;6 zYxn?fCc;!6w!sZ~k`aU4KiY_s(cyRg>k&sm{Oha53%f(;-GL62evvKTK>d*RJFSq? zk9wE*0pYw-cd|!h*^}T1L}&e@eOC6M(%F|+5AT(`H}J^+DbpQP^iJBV6s_WxekG7& zk`=56XPw`;y|8@OB!Z^*fW^fsnlT}PQCas)ZXTq`emf!uI$ZmL-2VrVcI9j`9}v?d zkeOSTc{u&5Vn~w7Wi8u^$AvWN#Z2U|J}~Y&ocdMWcEJ;_H`=cD2qY7suV`H@o!9hm z#q!w0`8uC<7$Z3Bt+%rTY#g%e?7R?2|Bk#F_0kKe4kVCrE4Iaxc&<595CSq5_#&a64rqZSmI_`F8T5DPJ4F!L&&5`-DBkdZzcF~f2J zF1m%xa|q=^G~&X`_#pooYUX{p`cDr*qLfh{5l|Oq;AC9+l!VGt$Q|y`7}C6!JLpN1 zRZ4Au(3wtgDXl?v{#*iB85rCHXo8{GE))Fc(>C;^YbJy93Gi+s%;E;X>!(d&z#%w+ zK7Xft4qhQ`tjJu3j8W@^$?@^#E01U@$$8xD5-~I#3Mr>_XA8l)c43iBQvgp7)?6~1 z7yh33^?PZ_Vn>dT1!|@96TUX#>DQAwTK5@oOlSN;k6us_T()1Cx8P}Ju)nBiVhlqZ z-E8HWrz_a#YBFE$S>=H)mj7nfhSn@ZGs_tDx?DSUJ2mOmiy#jPfN)_+(JVPDC?=@5 zJ*$%<^hAHs8q&W(LR<@@K*qVxg^QUUiK8RO6vXLMW#{kU_(fiCZnzLu6!&SBnmQ)o z9I!OHv!5Klv6fG;CyYc8kuDz4Y8aKtGaDuj4(ysG^`aXHdPfuh#*$2`*cRSm5EFaV zt0Wb-g)zPzA0EsKTU}xh_qV-ChvE*ek<1G$aPqt%$-&~i+auuDz`jOS0e&W*>*A7T zWFgOLH3fKr%BcCZlv7fxp8eM;L`l~s_$Cy_bsiebfZ{UC41pgxCf4o-fi=R=%5=-+ zvTcDwMAB5Is+_af2d%0#FQy__i;5Z;(rqZe>Z03msvzGE!GpVk+ax;L-%E(c9E1qG z*7MO}^;?3idaqA)+ITY&7+6%E3^f@oy16Hvq#yk8O;=d4*r<&ZhyD3!RzZ z#TLi;wXU5A2G>rQ5+}GVfhH#YfNyguK5TpAZn4Rj!y{pOJ~^?ILMmdHhsPF}U||J_ z+8ugR(yjO9<=nu9w=Nj!(rf;|m*1QkDpl=j)C$`0q-^DB{=BMxOkp7p` z#g>ie9rWhPQ|>-RRv(67vt>gPEHH}g2I3JE3HJdev^D4t*2{TUNHXp$952(-aZmzf zSSis2Ral&BeJJZxj`@c$KL+?VU-^{K%&^?S$*=gym zY-^58>^^h60fZO!S5gh{$i-SrCWBjvcd&diJE;jKSS8OnHbu=(=QVL6nGPI7O!b)X zB$P%}0?#^L<*bk9$y^0j%+(j3p!~JOi~)~1gl4F- zTbtY&=mb8A;Xk73JKXnZA)RoQ0l|P2Gq#Iw5?jn~s?GBGjlt~jbCH$Y^d2zMuQj0c z(GD{kT}`G-zECpJc17Thw=6E|r^eBRxuJfM=qwED%)wYwCbDEg;mh!%M3(m+?L=NG zpdGaU<7d9aat@AVd^wME55@Xbt?V*`W#F(mcTBxa$up+og3pllvYLxhIW=+)2wM^JV+B~z)O=(&db)3g zR{b1XX6r|!R^WFm{}lJYCCiZxlLMz&)HsC!76@$~e7GaR5SXZ|Z~(?ZX6xeF;aGfa z2zK$TCOQ-3W$Tr?*_9V27z|wnq~O?@K8C66IVD8TGm2b7RI04R8QOmX0jxGwn{ z9E`NGQv9f5rUnuZi>*Ksqi=B#sa3CSfVG-uVV6I$zT&w%v3l4n<;AU^oPX*|EqAt- zS;@};g6v*ks|_&yYFQj+xp2xo`ZqB)E(@!L#I=hIzQ7|zNxfBeL|@3Q3U~OOFI&0_ zd8oo;;#iRFS7Ti7u=sLV)B!(58!7*{mBo4tVNGl(=i?Pn+V8Tn1TcpJt`y8lrxn*P z(IniDPBYV2mlEneH((h40ex(K^-&j@@;yt9k`G~GHJP{8d`Lz=^Cu9tya=fq)4J;h zmNzNtc@i070-AXZarfX=BIXv5PI+l`$SP1c;o!>p+C-K|^qjo#U6F-F6`Rj+tXx{p zVtNfSz}bX<5_v*{4M4F;q-i>70bku(>qM!VkH4$$(w&T1jK2h1LmL(?E5T z89ql92xcksMa=RQw^$D?R*zg}RZ}jd8H}3SZipjWKxQLAqEksd1qz45u$_KHqoXBTF7)XAZ` z;Cjis--xKs3Ig2M%u2w`Xb^h}S%rTWEr9Zlq4Q!s=8k$4{LvGX{FLSZPTS(d!OQJy$wh2N^l(hZLo>{MxLK;M%*_^=kwP(JOL!(pTw#NYJg`}sT! z8f?2X6!fHPD5_$lA`f({V$n&{d=?mT!n1m8ZHwt4Wx^)}35POlNs2PD3EU$9B!75* zOs{Z9>j~3#SVKpQl$$0MH#&zeJ)HkJFCc<9?Iabc?N1Y>6!DjKslg)OlreOmwNn*2 zY9fOXN&XGaAlRu_%oonX?WF-{;a{aD^<`uJwo&KZt&_v9(WAL^;dM7Q33eK#+!st5 zH~t7xBP2|hE_4Z(*1p3rYm9uHJs8HPd?kj#nbA%Z5YoE6`*(wjCAjYe7l3CBubrF6 z1&I_KuS_pxIADQV{6HDtja|dnUZOh$Ssqyvb6$*_Yu%k?j+}5y^BGQ4l|nkB*b#cE zT8szp0k@ICCzFmM4P$0hcTIp{dE=TflR$P$eFDthq!}ly8wuu9s97piQw?`bDn!eR zs6BiX{zznU1`9YJU{xu|sf^xlfiDIw-XEZeyi(23-wpC8k+Alv)WRLKsDuxP>$%C~cQ6)`@hy#`!W z4qqJ$EXa927sDQYvk765S+ZP8nP#Q659>S;o0y0aj8xLf0CYL9zJUg`nhZlqFt-Ip zv_rXc#*d~nfgCqJ2Am$LPzT9G(*gI#+Z>J)vXfhLD$DQKx1dhT<+6*BX^a&oa*C7E14xzW z6zp&|Hjmx3;t_KS2%SsK5|ZQmE}q0)*;>M7oAq#sDb5HEk11Djh1YUx)9d(aiocl9 zl(37(uY5^WT-k=&Bdo5ry#J+m-G&FrWe8 z+>q#N#?){Yaytj&hwP{r@TIgbH_Gge{bo*uKa<_?n>M)Z%RuKAzT;1U zOe(+D6ppgMpaqdj7LfEI;C6s8k7`0BVp+51hLlxllM9pnQdL$!`D) zzu=w-muK7@)rG_ZVi@QSg@q~9e(DE@#%V(nbAX`Se@>pWE6V4#@7 zO(^eXYQId0J}|m#!_XPq4|Uk$m^n+jTP$(=AJdCnZs7ykM3b4q0@x~_2y2oXuVMd5 zT8akRQ83J%Go6R^%fa|^@u z(Dt$tQ}wKv2UXvJa?8VYDCVa1__XQdhCV2|=5%7ouT&3fDK|#V1ws*5b`q}l_@Skf;-D_7Hw0f4ouC7U!1#<2&N_h=3l<*wa~US z1L@-AN&Y851$r6LGlwrl zuYaGaYN@XStC*D0vH1$v1~nk)%*oW}l2FKQ&sTJhOl(cee3vajZ3~ zPM+ywE0Nw}+>aKYgy=Q=99#1GWE)AvrG-EykaYMB8EQQ=)gW4QoV=zq5X$Fet+8VK ze)V2|O^q^Th^5wpzyI}bpL1E)M$a1xMFOEugwn2w>;;Z6^B1sY?ZmVo zL%qFBrWw%{{>_*DV;Srvzp@xmrPWHmMb&g#vlmU|pmc^h;j6$KNypUW>ER(8Gq46b zr4D6@x|iytO$hU4#%gIvF47rm7y4#Gbo-G|_Pt-AbZj04Cq>}S_9Y_iSBDixi# zkr!d6kpldTf9EU9#nDAoq%|&^Jd&!SF%qoQbj#@*m=uO@b;JjJYi@0X4#7SJ(o&{4 zHbWvzr;veBDWqg3HF7nN;U3QQK_YXY@eviTXcH!v;o)&pz4Ex_zhSE0GU5`!jNb5@tXWtSk&TP9k9130;;3R9&Y7NOqd9bJBKc;B-T?R^agh8GYaRG?Rb%ggkWwYy7Uu6vo*%H5T;5d2#L^R(y4qUei>44j)?EF(Dc!sIj*wmx;s(n&-xFX; zBLjx$@yv6GGzQRJpXI@I%s18TDYiMXDLJ>qw$7u-f4 zE+dN;6bqR84orUAZb?U^0k1mDteq?^yBH&c z>4@7w(OZ=!v$7G=Md{>8xqRSnrQ@0`Puk=9OrGsusHg*?9^OVxa2zH;y(A^6`=I}5 zIYq38-Y8#4mOV>kCvUr(@03RJP#RjN!UPbHQ?HL&^?3IZHBCZ<7Y>)3=DacRl_9d! zl`a;ULQ1F8ddwc2)cr1MXnAAPc%E~S_`^^L+jC}y9Ca^Jpgc`JoCO4Y7sZCfgBBea zu^_AfggdERhNEs#T^@11A3^k&#^UiA4OTW0VlclHj7+{Q?jpHQ2e%RAUhkpW%ZYoB zZiDhPDATR)r~309O@?dQK6^7Pu^WFmc|20CF=ZH=?7+8kW;g}l+}!CtbnIV|J{Oe5 zRulYu9mYX~RJaL(8w-iYRLGVEZU>o1q_7r3#Sjo?H^rM=&2*mv;SCGujSf@V0)2z< zama>DgV7ja{}V|5{$tT)ue?Cgih1Z5>dvf(Ovdc=h2E7E3SiBf#v|Gzh7A0|w+Seh zGfQp{5Ivi``X^5M;5l9})-`%jjo-C2Fbur$?l-sKjVaGZGlI7wKkq@w|J{Tv*12jl zBjv_yz9l%w)J*b_W8({ZU8#ptbEV<_9&^;*dLKJrTOoY5wn=m6%p()|Btei>disr&)U~5tGl=oB1l5~j z$zr+UU&w`Uj8)0v?WRzahL!uHA!^ZO#>Vwp)&;v5%qkWC14eMRXu|3~;ubJN1F1mp zN2}8pCQQMxuYeK5V#==uD>jD?ylmB`lVse?dgnm6HIMndj6)NS6efP5)m|m=hvy=+ zei-GNw;z`dVHv=ZX^I(Ee0|rR@TP2=kU|cY${G7WV2QjeaOepY``cs9Vo-i3V<$rt z4H35T7AyT6FVjF>WK?8XC$0=>zJ`?Cwj5 zYcnDmSD(~ze*ae$DfYFxcZIsA{*7198(ni7sbINa_F{V0%0!#F%h*T`L)Sa1QIXSx zQVInWcz+ZIw?_Ek&bJhAZ1`sqX*!lFBhKN)2O}t)#+33PArGyW5z?v8m_|y18ornx zO?F)Pw9+u^n_ycnji{fa`7xigNVhvc#yUgz`RX4MK^%c@x!W)1>;3RtSIntc>7baA zolRyI)Pdo@Gpw&xqUhSw`PY|=3x8#(N+-cfsWBLU)ziUgdZsxRFG+nkmB=4Z3iZxR z72&)Rw2bk2*~ZBsDZYPMAXD4>r;%Au z@Sj@@N}%Esos z-oZp(ZXM|Y9YUtJGD1Pj-TD~~LX0dlq37T40yE|N4{zJ~oKRc2tU*?hU97_|1 zQ*apEup^5+&5_AHL#Frhz@qjspUp+HjL`%l4ZXrN2^4(~iJgbsbVQ$YH8&Ar4WiG~iGLW!%NoQF~~I!QLM=7F@EXP~6+AV#Z^0JE=6IgO`b$ z@C5skfj`)S1Zn#q1Sj|F+x>dh;w}?uBu=iEiJv#)6u)bS9J!TAQYEZb*+#c1NRg=) zLeh7u^UD@q5V#o~f~IbAz4e}CVnx~%OPBZ2Zz7Hh1*3SF4y=17tT2C%)<*ZKzC0g& z>tZXzWus6gtW*`2WRdejdxx#{XnY@3X`I~3rmmpV_St5OQ}Kg8JgYT!d<%kRUi<%yv+zR;Z3B3p~)TMS?h~|Tg zKuJq@LI$y@*R-<{I0+j9JhDBjyX&!D*GjmDCLgti0h`xS<*-z4uOBUK$nq2|`PC;w zUj_7#5TTEpuCw7t{$z&D=s+*D2fX8#seH}{h_9d^vP&_s3?`H+1YmKxhVY1R!}K+^jR=I$ zTwx>SR+Kc|ubBRan=_fm;ziAFuz$Hpd=S9?q`fwyWZlMCI40h!=3n#=IMj7x{O=#g z0V+ZnY0_J@(h{~OwT`aQ1Sh>cu-J^$_Gax1pEtee4e7uIP{+cX#6A4GiVX&alUoKu zs<2CQTM^Y+TR!X%S7hc&blqbbbOlnU?W4q?0oABg`Nokm^2akIGD>WgGDvucd)NfO z*;>gQ9t-k&?O>dvd0@b%vuTQ^`_+fknwMh4fxzwcySYgx#(73WIhg^;a6>KkOhn!- zO{}10L>CRN>k&O416~9`Z&>!f4}zB)%3|C!($^vKXKx4hQpDMNs4VfRFBu8;ARMqB zErG3b@u7G^T|WtIa;KbgmZN`meH`d5(#n>ic7RRv*R9gwZHjhF9F2p?8ap#tN=`pB zudq$11A(G!?;TP%bxSx9&QnW~0KSQ2t;Wf|eLpwxNZnM4jG1let&85^ggF-_!WLktE-}}P<9OD7xi`KAf7jb*Njt9; zxezss^v^h5Nbp{8L`qPk?wcYW!&**QEv&kCE|jMH^m8RwZu(}r>PkX@^jJ_V@sog~ zB9{3#t2JTjt2i4u_4o=QFy9+IIsgb{cLF+WlJNpnkr^&UZ2}6-b_wQF8zzurINg)mNZN~Uay^G{;! zYKT+VyMnCZaB@ll!@`dmhF0QAm%p9KHuV}r6|**KKTcW^;g~zJSJlb}N-aD?x*~|W ziL&gCI2yNWoFQ&&U{*zcQE=ZcCd;hs8&06O)qm<%$1uNLf&n$}nd1eerp9ms;Pf`( z^`}1*Y3Zgq(nKgVTu3SqpWH_A1^OKp=vXJl@#U}|P;Xup<($HNf!U#`SetROO@X@C zwjZC;&oTxWktU|v6n6$*H8_s_Nnkr?f4k;9BM^G^d5&;4rg*0Iv_Cs@b+oCIA7Hrz zamsW=EBzUkNE_it`Q;<;viI|JSG4(~i~-Ah%4~Xe_GK}i9$+aQ#3#|=ZE_j8R{O4} zES1gewYCU_Xhc(s>YfVUPzbL*Z`|lHQ7~4S_+Y1uj8^7pyJhT=JOPcHRF=x*QZNoW z7)E{HFdvO{RH(Op$J=Kf>#<^DX-E7spVP7ttP>r;x};dYB}Hw;L3CMJdt^l~VJJE$&PtMjmg9=gC*xc2%nc%og15)IoQ?CdW$WA`ZP zyzq#lX`dLa6hs`xHoJtn?2BG4vyi0ONb3WpeOPai?8PGmvJJ^YcR-Xo{V(I>ccl5{ zfI3LgaP6u`v1ao8cf9GaH&@|}nZm4$k#P^X;}(&XQ?EY43z=_0*-L35f@VP3NuHb# zMq20EVc%Ll@k8ncE9tQOuF=^7lP`qMxO7&Z*+&0ya67I&swW#Rff_j&WK`qG2>ZN$ z@2WgbQch@0nd8B-6f{V8s3W`JmM(N?GvP6+F2UgE0hW<0eIBW5S61}9LdY#l2_B{Q z0nc1WZ(jRw1C?7Y2F7S0c$j;|-dQQRWys-el-d8q@qa=`62TpP zh`l=-VK4Jr`Gd$M5RW&O+MO5$+$#Bf)R4y4k1`{gk3Su1{D=TbaT8<&de~w1F!!Qb zx-?8Wp`E*-72fqmUywo0+wvi%?m1aZMXdn{hOz(k^oj_dXK-og zy-(n~KNUv@q2RKC?j8!xwtrf}sR=$h`uTwYo8BVLw5ce3iE4WmpogZ~jXM094f!j@ zEGrVu;rAx~e7V3vcfa}hxC?nU;!bjpZ+sLk4|8GpA*rfH7%ecCgb9>{G$>Hg5=B=F z`x?M~8=h9d6PMGlxvjPUi!Y*UV_-~QB zZ_o+%bd){5Dy+O&Ac^_>9_D~;$FvDc)v%HY$9YGI|G^2P=rbN8p+gJ_hUlIOol_+F z@w39^GTx_q;5;&VFg!+P_O@6C_Eyo78c0^=(S-J7dACn7C1<~X6sB5|GMi+%iZnbEtrc-|GqU z$--)cQfrBQIT1D4^=D*cfmws#QXgXp-M*}UJhgL}0io$_g)X0Gln>$l4_*PsD;{RZ zK~yBqn*0Dhkluw@0(mn>gQnEvi)3s8qs+(WL3$7}WXK&xI3x`VDl^LpQRkTS@q6&B zA}sQ%+P8^$e@qa{QOe@N%HY%a9RW!_?t*T{pA>5AE0QDau(baYjcZk(K4?vXD(JU} zp}u`+(mP~Vr5G;0v12w3yK_ugoRV#t>Y>!X>f?>6aB&2nzQHW!6N}HQk+x@viVo08 zA7JxpsMlc1`{r6Eb&kp(uLFnqJ%`QPLBNZ+VwPOqZDlg zllY8v5rN>0ay??5ER}WeZq& z*0=2!pKgIM?Au1>%sqAWw1Ct?P7#$uiqMNo@~W)CiRkQ~Z4x$?G2cGIg!J4L&tc0Q zH{q!oxBL6;jD);$m}r)YPG6O!d&3~@1`Dx)c2y;mJblO@b1Z!c7&2BH?mQ5kvVY;q z+`tw$(Be48ROG!&baI)QBDb;=d=vdibG3;8R_tbr0hxd2Klt4k<+M<>>TL5Ep&>`- z0*kQX%6w$uo8-i#R_ZlekTEUXq{FC7-?IKGYjdxch?ojj7J{wx7915LOkP;$3Cx%s zssrANHs8K0c=#x1PAdI&Wf}go7GX{X0|trYPnKJ%Uup-%(kQ7v+~S#}M55#og9$@c401&x@K(?>n(sqS#&RADwtIu_*O_2)Z9N98xrYpg zF5#uL49<5drctjj4e(t+Bf}$2nibE*wXUwg{cSvFPtMT~m%yLf`~Zc3qEaPTqxl{eu12aFI*T)2N6a>8F!W(?7ag}&K_Y00B_C` z1nNI!t=tA8R^_}5RgyenNgmPy!UMfp6JQ}=!&Gv(;ahCb$G)kv@yO_N>ZmN|G^W_{ zIRkwtwdhHN9vj%oT70r%Ej}?C$D~dGrnChXi5wN)qgk--7}Ty)$2}kfcW#BQ8#eV6 zeZqob(ON^|z?f%0V?AmKB_8Of6vno`adQ0Vy{^+&k7c{FqawV<>+f1-=Zw&fo@&S= zWY17AJ=PxmltNP(c%`ZrJ6bbxqzC0_#Uf(t+tg+mnr3Vs`>x<_PW zfDWJ8#x8Y#@bLLy9d%f#XI;*aNZMGn7?(v6TJ>58cdI~;ieH=ofjA8W4)c_~$%NJ@mc?5XVN7P{{2(_bHbzjUy!gQPP z7&~5bH`a4Fkz9E#aBQoX29-#RXaN_nCMG{&coQ4DHsHZ3)aes0YzG8J!>D_R3hhh{ zk3ikjz+=%8<`OxBV)*nd+CF5)C`?|5Xiqy=g?|ywD`9uS*@B&~_m>&A>)w zd5Z>uq68ICV0tg+V9od08^^J3aa55>K>f%VJFC@RPPTZfhUEHBpOzypmF$y)mo4>LyJH*29^J zRXtJ*IfuW9p0z*ecjp$7cwqq!dJUWdwI;WeT&;oop2GdfC!N!t{0LaLBf`{d>tf3o zIx&a4xoXJ)Pu2gq@If%U704?9UC~h1;371NoT~AOlG|#fL%nt1qxm-C&)qFdid&LU zGV_2|E;D$Q3Am{6(fqP=9ZXv z3w8XL{IOr<){V`~mhm1Fy>r$rF*S%!biKW@_CmXid&HoyDq)Ud7ab-`wP`ff4+rfb z=^5TNJ^TvPd<$9eL;v7sP7RZmZJAtm7cEgcZBo%cnswpZpOnpz`O%O7ScG)+qE2ww zEXacqJQ-A=lj)CkP2!$M%QXknIM(RQQ*0AZenLalY|H**?|^z$Eu*nd6(SH0dh~<; zQEhNXC)$?lF&`qCe)CLNWZ7cf$u?GQQ&XVIw)sbW7s1T97qrc`Vv8nq31BopWqY>W zt{yAt!42nQOZ*R_==X6xR5~`c;>N1#k!3OiH0`)`q`-Hs9_HDJo#@gk4fiUk4#mC8 zp$eAI^y2EUOCH}Ew=RDTo`2akY`ErK4h;y#hl$^okP>FtnBS5=QpaHr0ND}OJC^)5{AoJ`Y~2;wJY+jKjzjZL_n5h%wpL#6zi+DW`(!e z5CYy5oDux=@}=Xz`n)#`-5yKpB$Q^!QZ%hmTSr5CxuXY*TY!j5rFdM(svsi(RRGwL zjL^P!S}DttV)R764r2RbRFSNyaHs}YVqvK2WU~%w8r{K6Oo~(JE-~3p5GGVvsn{Bz zx>qw&*XQ|MEMJvPhi^JSCjMPF88+c7lmUqb#4ziC`9?Lq2)w4%ng~%MEItOb zt#^8UKc0fXt<|ZZwM<5t5xDR!W;+RmNC@ zA+WsTTnwZhhWgWeVZBHh(qlo&9@!H`&R;+bEWyiUMjBu!qi`2%5+0luTmo(5uX|97uE%*lthr>|Gb(QqvgBokM(NHkA+3iGQ~9J%w^rQ`ca9&jF=;r-Uvwx|alD7yltm<9uP27O$4F?Yx zis_XTl|2uIS#zxQ+3|F^gN>-G734S*&%=ELiIdP*6}A+%GohlvZQSe4ii|YzbLS8D zMJHJTS9iLH3hw1-*c(!Hxk5Y<8Y<|rsrnYwZXMC<4zLz1P54uRIH0@*?Dglw6w+9d zq*X42#m8orPotnyvY0G3rsNyJwm;tBM(_I9@&sUGMJ7l|RUgi$T(X8R^$oa69AD7q z*zBo1G1($L?` zkYQbm?K$8fSO++<0)a`5lB^99EIyOb0Y>LvAUdd`4``+!kC~gIn5O`cMWpV=GJWTQ zh4o0OlTx1U`3~D&NQA_?R7ejqu1`I;Be})4`G++;KCMiORSEG5ijd2Z;~&7iDKQ1d8xzJt>}5ZTmSNqW^(Yo7fnZkM^Y zqu?UUFe!~uX|%%QQZ^oq`$O%{D3kqm=?xfYBm?IpO(y>B2&0#_t&GpC-=G+#fyn-R zClr~I;b(hB$aS)o9r0{`J@oIEDSe6R@b>SHeW5VV&Pto$I^@U-7qBpd{rEVX=#lqM z6PnpaVYAPgp&vqea=`;co)k36pM|O zneS_fZcY(7)Etc#^INbb>xYAU0gIGb&Xg=pWRjCL37fvAqYHJsgCCAWYo7?oj^_P7 zuAoFGc>bi>sZJ5sJ?!pwkeCkv^XGF?pV85Pqmvn$@3e;Ei|~2a#r#2VT)xyo(Dsm_ zogwxo3as$+(wT^)(^nwT)23+zBE8bzZCp9gztNt{s$qkNb4j>iAs6=TY#LF*s_4da}<+LA8^P94}~s$34U zKgzy9{6xoW zfnz&h2}c94WMlf$5uBw&kvSZ`i7D?`0>V@v@bvE=`Dc?uMjO$&R~z>yKWl;Wz`aQD z;EH*jjHy{@AYn=kVn>5A1bpYm=y8|o;C^^*qmj1fP3l;uD3_|NeBZ5W*2znCbi{htUA)DV^VHrEFedr>YF%uy&dWG_}aoKP?i?yxE@60ttIXG_+1S0{fd_IyW2SQi^oRr12>2obMU`ci5k9s2 zGUm(JaK$}px>0`8gj#iffB_4gOF7gprjo6cJ?ejU*qgrN_*es@mq`XvGJU{7E~;DA zTWOA7A;x2%;H8sNS*xlRgg)kE2Y2^gd(t zm~a{&=^3<>m+awD>V}s%OtIc_pV3$bNMVX675cG4Okv;TO$WD<-k(|l@pUa)>w4Eu$-LhnSwa)GHt$|K2(erb57?> zD8|^Lu{wL7>Z}*)a*J?GhznkOxsks-^}x6N$A4UIP24EHju-(1*NpN0aPRdK zb zTJq4`&2w)n9!FB1is4rcjDq~&n0UHxv4q;V;+!Vuv*r8Al$q?IMK@-m8fg2ak~4(9 zN<>IjYBBDwB)q)|GYk1-;}S0jr0hwrJDcI^d>MtwPh2gRvO!M?XouF+EYUrFl|2W= zjfu%}d(WZJ*k;0@!NDdeXR^*ATNd5$T?n0hAaM8(2gRgsb~PZHg`?BvhH!{FAT!b9 zwfmZNFz=HAtaO&;6_a&}!#+b9%{qRFx>>}JPeZyq6B0_;XvghS2<8&6jDoo!TlhA6 z%YWq~D-F=-aRz%6r!AjVwFRIr&-#idhKBGw@jHQlfEQIXdSEhp`m6O7g17x~wrEWM zXGaa%7UzHK1n(lHyk7?1qqklOQOcP&bHga$tsJZmbPgGxQFV1Dhrj&ZAv^ID(HTXb z=gjJ7%MazwGyS{~;3Rq$B{dGMmT$3}SXKe*R(+RKd)-N`4XIS?5cVr8 z2^12IOvE;v!IX9Ue&!*i=*LwdzguJ6NMN*`g78)wtpPLmP`ZcTltULavm0+28S-V3 zugmoU zC-S>?*z6ewlA|{yTZ!z$XE>c_1ECpwu!@Rz+>URD{`ldIJZEX+#-_p$mbLL`^6px; zuJ@4klaaSciy`0#3(q;s`aXqz1C)Y7gU8ZSa}9s!WP7H}Epiv^E^0buI~e4f@5P{ZMXTr%<5e z@IU6$X{tNy75Gu=OBngXtN+Zt7YrXZAY0=~v(a!a5yu9{YcR=1fUm-a9F^@usj1uA zIc|?K>qCFaPk{25@4PJfcoqn6=vO~4tYuNAy3^1ytYY$i;S{5)u)Hi`%fvy~DlL7$G8#Lw#SO!S|-Gc@#E zm6uY+nr9Rar-&I61(9*|p{pKXN1ivx=&|H&}}tKOyadm`qm zMl=)o?a1|dZFo>#1ic^5dJ8yc$#HnsFqa^?$B#FSr%Qa5^{O_|GHtWjqdYSQ$PA83 znlo*#Oe`{imQUhO6&zxcr@}hNoK`_!yfg8Nn!N*;BR-5GJf*iz9dz_^7f?|0kL7?j z>{Icrzyg0iKx4CX(l2TA*O0CsH=%=y+8X|jQaY~vi6;UlD`*WrpuT)qLWe_!-e^vOw8O;G-mV0x{6h z9nE+KvCh)|W!8}6c-7z$423*$ zwdCuM?6I7BSh1G*Krv~tWHw;1MQxafLyo<4nTe=|IF>cB;2X4mYKy68IfE)FG1=c= z`&X8%8_4aGtMP=0wJKs#TBJIlhx+U=pqIlNWwaHUfp&v58RB;)G{L%(;w?0^@~+gG z8A|HRPTeb?j}5CG8d^)=<=MgV7rremTnWhZ9$NLPZ#gL~s;SdLzSjONh$fe?d7j6{ z{FHV0F+8(y=fyN+4W>5?dXLl&-p26(w>^+)KLT=TAPWFJ0~IlLsp>C4e69HO(b0FL_q=5y==*H-O$|) zuwf?t<*Yr3)s+kxeQ%ZUTkphvb?Fj@f$s2p9Se<9TQ9=VuDcW$=;iCcfUM7OqZt-% z0nu~pA3=gyy+P6~$B#AxGZqh{R|>T1N|&h`r`#ryO!9w~cKnuMtL* z`O{M8=XbWpfl;Fd1so#^B_{V)n-q{U!<39$$Wo)S*=$Uza;D)|2Rhj2%Jbnqv$Gks zsF19t)}g`&nU`wX-i=py;w{#j4R&1%$KTL%O3r~p#SOJI?5tKxw9rvPYqQslJYZzT z!~b;Wunf!3btvw;^L=PGiIUEo*mf9c?o44JwskD`TH`=(v~-sXQ*6%-HPUH6&kv7l zlKSsImBHcTDDzg>8SpQZ!Y`Bn7IX_l_%$r1$BsEEaFEk{52$p6rf*OAt5#Lhoc;yV zQ5aV90gQgp0OCcQNRtr*(LezKm-Jg6{TLxEQ;JlEpdqur96GT0tEpl=H|NUbUAZ2d9&>0 zl#HzMXPaR>{Lzyt9>j_<7-E28xrFos2(5J--b|A|eLQuiFvgf0UB?JZ%2d=ZqN=Qm z>}mOK}-lKarkgq0NT^kxKOK$-~A~dRZvPoyPAM-R&30Doq}_fG#Du^kNQu zMmsQ=!#u)o)eYc5{mlr55S)AIOB9OeS{iwWxm7L1CCjAsV!>JR>mt_OL?U98_gv93tntXx3+bSQ$3&Y;Y!G(a2z&AVCQvUL}s`Zc%3pJjSwPYW{Xf}K&rE5z(e zQ7~^3Z@9*1R9qa_Iv*99JIgGv>`1(D&iXP6#!Jg6t&=*NfVCXisK9|TiYkX#^eA68 zP;M=XakL2RhkCj}?*!ElKO-I~TLsTk;ge1V$g69n5y%x|vo76aYws>1skfp-;nB@R z`?ZO8_+>BVyCAi==pW8uHYe2#oGoEjCkBzjzrd<9L+A%j_J!#29hJZ4mhQ(c+6md@{4LhY?w89gOcY?bG` zm+8F*(H<=xuv8C{dIG4E0r*dl^P1=QOCUipEZ(rf<8|g5Fspsq6h7T@w{L>-;fCcX zbCunXt+@fx$_XSjhs^vJ2otCc1jjUZFvc+6j?M1dV zo!FB^Wl3*<3U8mm*%e_FG+<$E&ngeY6WE(KZ8MCCPSRY9!|p8Xr@&=u95`|-WezCt z&?em!vQaJ#3FBmTkjG#?Hm0hmvd8*-PGPeYK<)zIP_ObP?63MF0OLE=4&-5_Uv3!_ zIMNqkV?d0rc5VwgY<8yg)Y3;Pgk$XX(xY>>Q@>5qW6ynJ;p!#ZPk=IVPPyq(%rJlIQj zx&Uyh5$DulK(I{_wk{%rT@=GOR7M_vu^%Nt=XD0S9y%JVvTE_c7#!)qw!1S{dr(tbvL>r%A{%u zP@;altKAS+GDbfHTs$e?e(|$(>EShM@_i?JyAwBtTeffEsJ+BhqJ$(Y?LSd@P?dDG z65HmaiTkytY$T*G`yTyDL6kCv<`HwFRoC>w^{tq0z?ea3exw6aJ%alrs^aE@{2#Q@ zRrc*w;0&n~IH$-ub6NZ)+mqIrwmwf_B}+=u2kYy=h;~vH}c%(p_RaMo(?m=!85epgF~Gj|guUe%|%ZCtP+d8%~UGbm4tSb6UV4LmlZ0<0O8w z2jSMvOs!7YEBp47{^+asiqEqSkWU75beVH>f_J2*soKOzrq?5O7n7haiWYC>hh?Z&d&Z&P}h3d63(ydswqRJu&}J4gZK zq#s=q8AlPgl-OjQ^8N&DiW%O~CkqhB08eQ+*Id~o!-_Hcq{(0&JBbSWmI>8B(}Ig0 zxPMI9+SP2qec2V~i}YkLWvTid{t#BfjMKPd3lJOEb(xv`gL}%;_^jK@q{qEKc5xTl z2VSZr$ME$8zc0m~%7=0zMKlhZ-50h$lX5A-6%LB+wTTFD(?FG5&R-Vd*Q5h@%bL=4 ztwW%boV$LpGaoDjx+)w_f@ti0+*3Wj{9sNp+M6Q%5KP_s2(0HcQ7;NhqaRa7Kh_8Y za})87$^zxS!a#f>Al?)-(TO&+%ya|L_Q%@Q#61hpi^f%t)%}S>#fQYRth4$4^ilhT`O!Tq%GwUSP@FNq7{;i77AiwSZX`+p$Uh^$gnYZ0G6m*wzj-m zbjo+wN%ny2F|1#2mSR;1BC63kF$HQYM+D9eHs(|!qp@?R084h^wh2iwJc?$RHr0Em z^oz9RI3&$~iZbDR%8iFqWti-7KK}{Pq8uy^opha#=nvd=mkMX{tcq^!ZKIzA6xyH{ z20Kgup26+5J%g$N_7J8vBb4=GdqQ=%qU{^Jkl6V28oh{2GNud5@~){Oh_z{-l*m_+ z{!P*-XPhH!gY2tz|1^tXM{pF8vj-RK#=V@}c-w*BF58V2Do@Trz(wj3Jcc!?><1pr zP;`^N%XBSI<74#2N)xALvV4-=s6fhY2#z!LnY*44kMBSx{9$ z^1`9RS%H^J>`O>gK>LPrcJTO=e+3xQ**NosmC_h=JcV5IQ-)eCcVu&~F!=!CHFY9y zI$|mfI!D0wk+5xuMP$R7wx}UD-KdxpX3L!7(Ks0m8J|9XnyYh&W>{M|hhr}|7#`2i z^e$b4YH{Pmml75k+6e``IrgL|3ensY2QL1S9~Tc^kHts;^=wAp2f?aA_yC0 zN8IptKO;JsDH)BIJIoCAD^=rlmotSqvI{7ygwpOy{VPAbPksAw@O|maq=qDBpJ$#k zyX!=4yjE?!b@54RGA{G_;GvZRQ@`wR^T#GFRj z8{+^)K@Yrf3q0lh-1J$&^z2v($)gEJfHSm!O2c|Sc{X_{o7uylw~bCpRri8+@&+5x zVK}62K$8m}D&m|cg-wb@c@l+WQ3Ae-PR8JlB#Hh|7tY#dNAp?tiKkj>4+EWwsbf_- z;|=&qQ_`jUrb%4cQwslklGzvpZXr?<=X$?u$M%`SrTvoJl3}84{oXV_s$P-h4PMgsIz;E{EAVgV23m}#uQpym2eQBtrC**6INcmwf5Ip4lv zB>DzZIMHPV@Sx3+{dx!v4I+d^!eCw*bn^==7GGw?*iBCVDZJ3wL zDzyMBB9K~>lYp8A_;PLelfgriR~VxPV*+_%QsOY7IQ?*I2w8~KC!1SzIM2N@ zm8T<#j_N*CMAqk(K->hF*8@_B-=W0uKynfKaKF@aiHxJ{;ZnbT{ghb1mSjoK8&#T@ z>-kA2n=M>Uk~xzf^!}N1He{aanTMo?<(byRoawDI)63Gcyl>eGB4ba3?$U!dZDilC zR(~CuZ~Nr^yY_N&!t*q2yYeh9OEjg&9|u|FU%;D`HP519Ym_J9CB1VySuBVYw(|jy zk@RtV&o}CW2p$*l_F#$99a}{R(UyhvsQK|=mrzUx^UyevXr5DWrIhAS=}^B&A}pnA8-+YU-RZtKj>sT_WZcd--~nT|wmF&iMX z1Xz3(iEx5qatV5Wudv;LlJbg%REe^mwQs@`k^)iW+2dsiJ7`zeVlzVPiS+feH7q1d0vP_8G|)q zV4oiFa&xE>^^u}(=Cfh~g_*ZkC$5g@Cmh5w+{;q;TC+VP2&P_GQY?)2X|e|hHy^E` zHfjdK;qRLwOqcZ>x7Ha=A#bzO*w`|@uUN65VhYaoz3be~S3LicCl!9)`#wsD(yyX;aX5N81}~!EkM$?4-cNB)p0sB7`=)w0#grJb*pB= zWu4EcEBUc1beRBljzk(Tq=ID!_7#vWl1Y${2C7mEI<5T~Txsq< zm=t&n;dI7YTjmooH0n{T+3#Y7qUBD>=rrc4L?~pxW*Bq57Zsd%|zzJ24Qtt=dk zLYvH+8++mPD<&=q1%pnHG!8Wb7xiV zch)D;)la#NmAiF6w|crKXOClya=kcT)yFIK#QoJ!?__I0ujq}PkNizA%2M}aTC^g}k zVIyNS0BCD`C^VA*@uhYU{z<{jYs0ckP`Ks-!`>Ul(FJjidl!Zl(*)BDY{13T{2t2zF$6iI>qJ4eKvEHRh`1)^4l)xkRDvPI*a_f;-06TMM;yC!EF>$ zjPho~aZINr0Tq@V?-ylQAm@xC9Hq3G;NKr$l-s}E38>XyOsT5P)vKhw$xp6H+vqN9qbZnyJ(q)*ufe|y#>M@M z2GVR+j=@cC3Zd+mj)S&V+GkuB8z=lAUL*@)!P`CZf+t`NaHc%;90XX2twQ=lqly`t zD06Qb(;^LDDc~KX92bSWdphIC|IfUR* zDHuk{fsxRg%V9;FCVFh9OnI&Ker{tLU^=-BCb|s#SuqkE-v{Y`ugCV2S}0_x4CVHO zv`^9UkZV{924|~q!z{n~Meemjn#EYM^uxR! z=J>M`aCrEDT>*t(kPuw06}?$8(>>-f?|?NEhtyJuTK8a;Fb{go?DhW z$AFukh17Dikm|FxM4bf=*5ji1*OCv`6g@hq zF%Oe@MOKvuSoo^J1-wzdRCA2-rXP-0Jn>uyRgm$>66@fzh{~2`yDzL3$P~UdbC+4M zJ)#Yk9DiwxByXFZKk96|HP+ZgANv@1(laEvXf3)hKlfR$kU~>CmaHb)G)o(gf_j#> z?9%VdR}Hpvodw=xDVz`zZ)K(x9H$h-$`{`4dJfLC;u@(P1j_Lo8a_XICx+I`U=+N3 z*b7E!&VXR@Y#56(Cq~aN2}+FYaOtbgkuNG$nBQvdzkb#yo55Jeu!U9qkamk(+?bP> zK>77k^pRKTz`_FIcDBQM!Q*wC3T`#WDlU$bYHrsXVwfGkkv!zZ_^cedkkl;3rcE)) z&x8Xv+_CaZ#PJ>S{*|Myv0us;g)!b@Ri+AadR_lis(h4$fPB97X}4!68!BWq7FRrU zBs|#8o-bSi0VHX%If&;U{oyqz|gogiF3d@-KiO*E@E6 zukgZ1#pV44Mj=9}uBjXRA%vcw1xMM5N>kxJ6{C-n% z#2iXZTeeLOeMakdowwbN|8dPf5~m4Cgp=JWKrkahO{qG0AV>Afr@iL_Id+TxT7HB? z#IjD$I*Zg;h_YozAlkPKmTe2{AJ8Jjt!kvV#z~&^ayk!myh;6tx3$2kSrPGwkIojO zI(Z~qUPiGd5%5b#DzZsjIcTPCofg37V(bf-2M z3%llsM_EyQTg3vWc_0C0z~ZK&nB@R2)j}w#;ToLtzQTFPXo);Q^pa&qF7?NS((frT zqd7Cw&To?!G%y_NxRXLwZa?q*qeq!|_%d(4@?>4wfS>wG)ii*3iL*a+P$X+l(Ff&2 z%%k7rAlVTMgZtBZ#Y(Mt1>02A2Dxr&G{KS5kzBowI5d`9bMB43y0BuZLf z#z20vvsnq^JZLO+VGly2;IH(i#;yCJfBMCly7Zyv&@NX#5Z$lva_8yNe#U~bAlpS} zAj*@=wN(R<(fY}7Z5`puoAajMGY4DU^-084?U%lm)b4Zcct*qsBN@ASee`!cW@=9! zG*KG`LXQ4ivC$DN?&uP&wkm$ZfjN|RHy&P2FtF??h_t4n$2K|esWOg`(wYAFg4oDC zqsCH&!$#`OA=5_0_=Gya<9t_vOG1T}v6b+@PE+egu-dpYCv;6-502K^A`+}g$3Zmv zWGu>;UMDcFxX$Y!Xae2ml;}vP8FVc)ImUKxPo~-DdL+fd(jst=v&6|K0 zw^1wtFkfz^+0d~Y>8y1#L7mbOJF7zP@q~Xyls5#XK*8`m6Y^u`^A`q>>qq#l;I${W z5!eHs%_3De%?LI@yd{_&poK|3WlxlXk{&082y3$hS!SHW%P9F?DJ{P%lZf;5XhS#q z@$S=*Q&w#HL+`vTgk0#3ZQ;l)5K_7VP&@hUrQIc0DYo(4`MiAe8@LQ z>W8#@lydP=JV_&|o9hg_Z^@L z^jY<^qIZvKT)I9X+uL!G9dHRSqEf;e;wAZk=LL_0W zyPCTX6b@P5(?2{hO@E`+O;Cf|P-t7uOQuEW+q&y~qU!2%H|>*VWnR<8`RW7e8_EWl zyhbzA0i(#P$SJ4Mj%H572%d2(QnJ9i*bR8$xa^E#pCl@ye^{o#YCR3$Q9^X&Zkx}L zKMgOKt5;O<+-cCwx7B9;rB!shs9;tXJ^ca^E;T84M{6@@m^u)&Fxx)9(fc`>L4X&t z4K9a{HyvJGPSW~K2l;RU?xD0at45t{N1+j)ugN=Ax4=l+8eP#wOv_!W@dCCza%>aM zy2s4vbW!r6-{2|aRVUjwRM_MSGil4lG0Abm`zsTMHe|mP_C<9!RoG#u5DQq2p?wKv zR7M@SfY!A%vdyyC&+I-L_JoYkjGraG7vKcUm%`fo{s|A|Xwc{w?Q>HT13yC*+~y0W z$1%Qs-)2V1>X@2y(V9#qqEX3h^G^*ael5z$jxe~W$>tBo7UR2$$>mE5 zTF}J?n3V-kPT9h9AW_uq^Lq-3{6fgCYTkr-D{W2S(swqcqWeJYc%@_n)DOf5l9CJ! zP&cEyj?!|jIB$oFB%*2bTuLt35+vTBY3E@dLqiLe(PnC}3CiKHwUUG+1#$fVxalqo zsK*h5+sZwX;buP&7+y+a`fqj%Zhh@59du&ZNxkjf*|%f-dni%JKx{F` zsSV%5+ex7tl949PA%873jHkx@114f!+zEuyS z>xrY$!Uo|gd7dN-KCNBHUx|u5?H-xzkN=}<^7iU4e?<0DjY2$CA>v)BSiaL1LHV?4k!0-f z&*ua;tkQJaWLc%vjIgckFaX|{c8hpPMn?TD@es!RmGajZCMvY;wpyiB4w08MRn3X? zd*9$>VOZy{PiX;L)4En(pB5Y9X@OQyb&E--y&rH|0Sx)J+zRDM%d9fGA{T8?5gYS! zbedZTR+^+%I8AHjBb#5qvjA61Epd+iv9cjMkyyq-K#IYLaOPsT4Q&>f;j)6S=Tq2S zumpyHGQ=1a7V~CEqi3lyYBOX|k=25N*|R#wX6T+VpJ$2RV!xOp`HQ`W$@x7w8ut^L zaCN4)3+RQk@3zB9+Ci=^9J;fi(UsYN%-haaEB6mAd;X#ixleUYK4Kv&*w9dKF-x=l zS`)2}X6F0W{GT!}5>a_wih#x1 zQMnUC+cl<0&q8Mp?ZO#;9>gt%;PQ8K^7n`-C4!@r?e3@CI$UK^y`p?)WIStWU}j&C z2e6Vt{VzRRLxcxAUnQ6?s|XEQBUXP5x`~e_%Y~`}L=$Z&@HKuBzJS9_-tE|<-`pw= zfxI_Shc+^vfE3@tX~ok$@RyOpY=)?Ry&<&x2(+&ho{&<&ZoBE#wbBz~@J9gv z_r@MMh6@NC(~@a0sr#I;!;?)Zf?F(+gaNiHJc3nJG7Iu?e@rkoFc z^7Kf_8zWI-LK+}cr2@XA2MNL>L&P@EJ7DeCw-N%J^i$fCkX6v|>|3@OkVJ&i&f^$zt_lc^NS6z8|kpGHBqfZU8- z19d*zP{H-S<`uN~1-JZOp3M+<+EJ?2ACr)Y2~ec&OnL_w+A#+vl>DRW-p=p|y&OPJ zSD4tS@ey}^R%!q)$S+@JACHu6)Q{JZ1&6PaQ(cX$(+w}#r$PHn4x>sYOv9p!k{HQk zL?U<$xXe{6F%X|??la&j5TTwvSYjEaETnCRJ-l?cLsM67t;SCWen3t(8|_(@lS(7U zV0l*t-J;qvo#n2#oCra7C7k~z5|8vw{lJKWM|-xR+oqANsTwWI8`HeVk^nC+1i1Wp z;X1!y=DbvZxw+HcN+CW_y0|4#3(`dJLN$s$eg2|+?K*%E80@^$DC4k{6XHdO__^w} z>O)n!yB_3knm$%?}3eLku0x`H0W#c~l@Q!l-EjY;@JKl%(q;j$#~7#g6+`7)bcay^{npTWmo3wn3pu~t5?kVZU&C-}!|iZp^qY-8jjh0(J8x|G zk0*{ArMyYwdHV!S(Ub#q64?ig$2W}ES35hdF7^Ah`A@&U3^r9hGq|WXqE-cHQ6s;RtVr|L(t!e3T{cR=^n1KRDqon zLD||Ncuc&R;yLZaP~QF8u|6TtuGa`S6NdeWna9&JxsqOiqbRdJhP`X1vxt$Iz0f`k zKLrt)Y6$jlxCwqy)xGWC3kn+t^TQyG#Eurmaf4hxEHIZ<%}(m$zaG&4xlt`l)YOQx z)J`hSVnSb+Yav%yI(WmXI6NuL5N$tV^Viv?Kh#WJqp(4XD&Rx?S$x=e-V76%{_MJpu8YejvI{fvoM6 z_+UYg5(o~-jE?DKYZBam2|8k2qdOv^_4_@6BU?P`WP(DrDlhL?gZdBER!G0YE(r#f zMHGp`r9cxq2PxTCdG%?o9r85UTMzvc z^WK424u%AQFh?vcS<;-{xQ&B1eRx?YjR~JErXVX@V8YoEagN%{ORnwWJ3tW;+;5?A zWwHY$kjG#>89GzdTJUarWSMkt4ISmpDcu^) zWQ(&JIeKxBK*ddO!;Y@+wVHAYRx zE_l6jwo%fWXpFLu89UG%%fcK*U`Pr+0iZ4`HKSkb$sEdg;%vmswkT31=uQ*W zi3H=i6mX-~p{Wt%`$(Q)1uzIg9?$WLEPp`KB=0&bTSS2qzovVu+h-)N8?4Tjp)a~) z3as-Jf=gf3ul3}bSm9P54AT%9!K1@1lJ8gx#0;=12RQn-XdXx?4c0aH2y-_+l$u^X zb+g^HHIW^4OzrutxDVrY0ktuxd*UZ;dEXs5tY!Qadv4QQ6e4kkq|{E_Nmk6N0z>Ln z>3|3nMAk&)W*9mCjx%okX8vqP&PU2_4B?mJ+Elv{Wya4_INUB-J`2XM%yC$IVRK=H zt12#Mtg4J{U`4{IFz#Mc-Cui3WjHAMdE7)7ULjnY|xDa{%K z)EP(j%lg;h=9aGWppBGDU#89e-IvitdZ?|5W!BH&g{C0v>#?s^mMQanbmG5ySR&Pf zVOqy!kmNTRM9{?NmrDyChG%;GtL`sJ0pZ(j3%E-W;M(oio+;@E7Cji8- zED3WvIY`6c#21-I$CJb&67y0_wAnGPOpeK?i1BT1RQm#=^ofl0yjS*jvu3gCkaQ6| zrr1;aA-almPDaABJb3PK@r5&;D@P`>+{WfC?jzyZzG?8_NTBm;cu~tB=7Iq0Cy7Y? zjq_uAFGev+;&JF9-+N$I-ZH(nQc9)AZ6x)3({Y`}X*TCNl+*9APfPVAb&31A>^p4z z56m-6OkHim;$SiYMmErY&TmWac^*S4HRi8ruchQ5fT>TQB_O`Mm396bDb~-HqE>t} zoQ!1BLk)d!g5d`tO#xQvPoSaS`cmg+T^*|ozB^$rX`G$*_T=2I5?8mXr89CTwB}>> zFbDji*PuvS{LEy%cP$MEh6eM~>^I z9ECi)wkF~TYCeHbXa>X!Q+ghtYFYE6Ny(o^^KQ}>M?G*AM~kCm)ZW3g@^S^#(M*Hs zmyGmP(%X5h+=b(~Vcjx%Hnjq~H(=g3sd?aP9XtOT(L6y9zQ|%Nyx#$!U>W@@g~J9D z0t1(k!ZMP!>NBRQ@=|&^oq~HGJ1c0hpc!6g2ps2`a{SN~B*C*F{BO1=Q+Y5fdH~|w zOe!o5mK3HTd4_bh0v~P%`V+|#lG@Uv*ZlB<9t8wrq@FPHgWTblD=A$?BG4qtYBBzcZ+ z#+K#?cKRz#AvZZ_b5#HZhhl_+Rdm)P$Gh`?eOiGOxrOqO*CwLcHQ{9ox<2eWuvdV~ zH*$hiL5aJ?FbB1U+G$=~cJ)X{Oj<6IjR-i?);VToGlg%zI4pk6HBPCW*vj&!e6 z6$~6=i=d=N)S=KXd-qgWJO3&~Z0Hx|OMu|o*&7G%*O9dTM+>GNa$4mHr&aQ{=lB#` zVUB0c_ekLg^4aSL5Tl&>EOqy(fYymZ`JWVf{TQGMuGiIaWwNv%u2P1!(mLjbuzK+I zU5R$lURxdtUixCzug&<#CrVk#9QLhErG?TKOmXiG=J+9in}^bbrM#elHJ&;zh*}~T z*0*7{n0ofQ-o#JBzlEIF`pJSQTvKmF0i zSYimc(H6oWrME@&g{U~n7);9pQCXvFQ3Y(jiin;qy3R4#?~6*3KTM$Jv4?3L6~Hht zHe}#-#gs3VrLGG)x0CPRGY;L35)dlZQV5{AMiyc#b%6Atp(}y=tDXvvk^_})x-!uI}rCI;8{Z~7X+M+u< zyP@e(R(64#TF&Ss69#8z7AIKv8*Z~>@KW`?7jov!ThpRVMOFr7IU}4O-g_Kqw#31A z`XhkTFi*P{MzZsyLwm$XD-_`hf+qoxLqCq73#wRF_fmOGgGVRMbPXGL=*cZ39K|}C z_i1{8*N?smy?a<>(AVg?0OP;SgIOCAIO(E-CqyO>}jt#hiOL z7dL%3X&>BHX4unu>~+dG=tq-jx$cIK#S7` z6NL-N%0VR)F!b%Fl-4!npaT}^kp!i;p}uB%tIviS!1Ufv|6S+RJK3xpI&6O9V>0sj z@`TDaQanIK^{FmP*HRKdh}6g%-?>fXU3k=^_dqQ0P29I0M4=wE&%0Lhqg2xL?-Ly~ zbw*G8?IhW2=(i3o^<&uW&J9((xYboKoef@=sUgJMm;tYQABnda=GN5r|e}^*KN_^3#3c*_N1& zLa$UY`4;g-3LOqP)+Tglv2h~?v4k67GKr^=gcpbrubL3i)?`WqI`24IMa)4ClQ?8Y zg|U(NdN(DPUG@&g&@{QKorF`m2TDyw*%XJ` z<`~Em&ONx_M3MC>2k=y$i3K)yFG3{M^J06NTi0ZwhoXw$rue@ocd>YEx3hI}W_kUUCpghjB3?D}AN$oV z>eyBsEpL>|uYAt2q!UegpZFZCy_{<&pK5f>miw4cl7X5mP@!nM@cQ+ahLB=^@eTTj`$HfNk z$dKHb?TdfPp|FFxDoVGkI#H^~4c1&FnQz1TjUHMv2*fRTQ1EC%|L7!#6fNIpQigLLBKv6R~2BNo{qt`(~#qdkByTC5Hh0DOpo$o+n2p(t5acLfLUDwSJM~ zxjN`jhI>mzh$s!M%zj>WB!Q|ei*DZB1jg9gom+kXI5NPU( z(}^a5PMNWyJdrB6$eQ7m>T{!VFrnJWgf2jSLkoIn%RX`*@N0+Q)-Cy=fk+ARal&R8002 zIIJ=(aV$Pbe&NBe`ikh1b0PkG2$qmx&N<#*sNxF0dXt*_67-;Buv&@-&Y75nzER1{ zL${%s0l3_ogq8|zjPsKoZ_<)3hxhGmTt$yo4Sv^ka5aC4;Hy)CVD*3PDwm|)P5(+= zvpiBJulL%Qz*>Eqn%pg81d^z9<^-ltseE_?RxK}TH<5q73XwB4EYBmeP=^m0`6=jf zy$agY%c(E~^XE%>tr3ilOF4$E0Y^!4HR;CF1vruCht=`ge1~tRvddrs87CsE(o9U$ zR31?|p_Yxjd|a0-ye;zeDl>Pg6;|i|N3PE?q84U)-fV>W=*~A)SX2;?Zq(G}e9>M0 zG5~Dl_rH?rbtoB{BF|j*mkVF;=^ zk=fG*8xi4Rhv^&nMefau#M{$k=~H~~Rb50LF?HhDSszD?keVZ47FvH-Me`)>h@*iD z9gaVNxY1yHljntibBlk>ybhWgvDuxWJ2XDem1N-jrH>Rp99H@?5Ko__`n3cJlS|?d z12K+PSU8LFNRblZ#1LPZM=YKiVdV)YlP0@wfsKMOCca8-H3~25 z@EQd?b4E^Xb0joS_`95mNc=I=+8!y^nY18RA-pw5Y4~9?#AH`=()v8hE+~_8QSiG= zHFhni`3$Oq@VM|NU5zOMhkz|~oN}r4fF4N}mzw*y7Cz$ZG&Y{6qlx(qp#D?E8j^@drYIXt^hse%^`N>0;N=?fOi@wS>B?0qv6?dET*ixH2w!1n zkMeQ24g6Q~A6IYBbHr-t~$#a(ua7+OHcve&*J&JhS2)ajLxBP~+u zOIJotEF69$GvX!8=rs4J56Db4L~|kt+6W|BB)WwCxi%OS1TJ4=3IeQ9x@-{l2x?c| zK7ab9?S9yl!QwG@W2&dg693 zZFDaiNW<$#(2vN0w>5;H9udHbz=bk5;_8)yj4ikO-LR!o*9+)XB>UDgGp=~hk*>5oQ1P_xq-l5J(NX?3e z-TyisqpiLYgTnXQp6M+iy&pK}K{s45W53t9L7c45`ea(7GOvJgV>@_NWrcgS>aI@$)^*McgPFWZ`WT$LrOB7 z>T{^YSjhJi#tpsRqsit))``mo`SMcRL9fkfhPU#tuo3WhEs$3TQ7NVPZ*kZT_wyv`uWSGkY?|OGF{T_i=^XGumlrfI&F?t2N}Z# z{W8o%oC>PGy_s))rB4uN{hM0U`4A0aw>(0t3glLfzZXWa>io39d`hG36gFRnRzD={rzp;2vVe8#RQ?qTocCWW9o z_Am4jT-`Mdz^>hd&C(qeAaC}))6i(r+7cY6c4X}tju$r?N$J-L0i<1d(6Or^x*t&y zdyFJ512R5m7J|_Xb*CjdTU2uOcsjZ6nb#LB(qgDuNvq9!Zk>(<>zPMbGia&{d@8B` zKl4-Bp^{%MBNB=y1MmE3C03!??RY&@iG^z+qmY0;kCq&=) zk>%YuwC1vutuPH<*j&Eq3=f6bFErt&GmE#^6rca`pZjTS&^?Y*yvfzJzVm1YiPSk< z)d957wE=9PMX#UWr*2s8YiJS9B3@eHG$P)E_7CWoJY|NM2y!@lvDU}0%gbl1xS zUew%{EKR?2q-53{e!k2X92$84sFjbnMTs)ycjIP8LwsV@$CG$-K3>e4Qz$!57&q5s z{3|bm-6s>%A8W;W!l(clyylyft$5Bhrdi7VjX+fNSyw9GJA^BWkLlW(M_A=TA_jCn zoffFs*uZGN)OQ<&?l1f0rw#|B)p)$RmbgS^a;l@CQ(5}Vg=(D`!raf!M4N|c`ns05 zs(~ToJyuOhmjh3t7L=ZyrY?R&s7&2Qf0tlO0%-yuNMH@D>J7`Zi z`2FC|5NA{u0|^;8YdQ{-qViMw8wZ(Fy9R$ z1@AJde&3h~R=_*f&qdsPsgLc%0-D>S9%56&x$s7J9^zx%hI?nWrkY*#NVF#6NHD+( zB*CtCz3|jm2pXE(g1bak@epoDVdkS){1t5+o4}5mN=NtY<*$Kn!phhI?ER;G2SU*R zrAN4hd%D|ug&&d;j?Eo(YCwE1=j)FWp%u`_`p2542}M@&I7W~9yE5P9+p&P0_QQ&z z1i5aLv`V9qY$DWnUZ)@g zJ5#JN?}UZ-%@a$!D9wF9AK^NDy-{)JWF1}0zOZaUD9c*Jxtx0@05`hHh4<61-KXV~!{w zH8kuKn+2q^`5dBa(}o*^}<^$TNRbxCs5`vii0IYTSvOF z8lgY177?GI2@)`ZYW^l(g&u1B5a_v6mzP~r5YMj17~p8#{3{3*gCXpuR9O4`uu?)D>ntc91!mQmw$=%o|8}%q!kVmf?|G2*VD%wX`R^y)!hu;unX?9d zK4dy|FK8o4CG#sQDO|ZFLd1>#z*bKj*H)CHND5{0 z+ehVYXc-s=2M9ec@6airzP6%C2%m+C9CW_mCTk9cC?3odywvd+ZEiPOhh7devDe?w;v@1jW98URgr5N?z^2e z(w&sW81_Jvz?2W88wmiSM=)1+Qn zAIXDa1+t&;?FH^V7w{C>^upt2cv~iknqKG%2?6B0eYil^btCfxYBz0MQF>$uTF~93 z`WrZp2CTFs$CC{4Ct z#AI1O*pa^z-j*L0DXt;@-w1Lrf%FcO84|a97KmlHKF$YnbDyOe@?B2HiEuZ0@>F23 zQX$}mtG7`DsaQqH5D`w%R>{qq#xl=ih&RY+4cdP?V!eWuI(YK+RBzK>=+0x9VhPB! zQTzr65Uv$Be_chMt6i~ZPG>Z^!jEHR#CO&W;Ulkn8d&L1X20dMt5kX$xJ5avqWmJO z*qlw2am{Qa#YE7QdWR;QcmJ#T{&a1wCOSSY(NX@IPj&&ag$qmUgUjG^4@)HvNeoy! zM-uiL6K-sFZG`g4VQ+JYP4JTf=qm1_C*VvLwxyr@qfN*pZqzjDWgWXsD)(0x3p|3s zw5Ae`^gURz4U75uODYMe@W=cu^80#3|B`^byiL4N5>|d{2bunZHN2>aGoM$3Dv5Z} z=Zw*CN9V@OIEhb4^4oI~!A7oCN~WodFwmISzs9IP^&gaO9=Y_DLV1p5&1!4C9IDOY z1A;e@|0GGNR=(BcdHv9WYaB8T0B>(^xc1;#R#V-6r*($E)L5RQ;g7&B{-^)y^Nsz> zANl`@fB%LzzfmE$ON@SK3AKepHl1Nk$h@y4U$GvIvtrjXJIi!1XGPS)J+gCUIVzjkQ5h z+0S2sE1isHev~rTKN4+(^KPV6QliM>|{iUA@PKS6#2<3o;BlM*9~ ztJTy%od#3t+Gh#(o5Y_lwUHE87i;$-{wUvja8OuyUgq%XGu*Vmo_y)W1@OaVYVg#b z0teI)CJJVQT=VyzbYO55(9Bi+Q+Eg;sndG3mpw`M9ujwX&+yA3D=vy*82dXkN9+#i z7S>c-wIWY=V-y!0*wB@HpFT3rqec~yV1qo7N5Zdj5=~$~IS&Y~iAHMEdm|$=4>t(x z^{rxhGGTTqGig5LxYb@x{QbO)g4$n1?mPM)Su$f=ZPX>JuV$(?ZAx3x#L141M- z-Pp|f*GneW8I9vzYzQ<#o6K**`;d;6sRH|j<`NRA24$5%*v#X?=v@j8(Q(C%rGW5` zk={-`9uCTBUuYX2I?IwYwfZAdr$s+GX*{opmsQ{!@9)ez9lGg3d56CFr4=4-n%{In z6b*r+w#5Bqz5j%cFRY*t^BVdEXnLcj(WY-RKs&p4q=wz6%)${WiNFm-eA)Nh6-`#v zKdABMIeB}zHnlL#cFB`n#`~zVKWH;RM>sTL+WYbrYkwH9i%NbGU3%DuQUYno))v{j zlLti>_x*$~wS!*rZ9o&eNwk|ye;CrdExl9=%WyY;0+J2JOn1U?|L?OMU z;;b}#Ir}|I&A?Vz{oyDEkx5U=8J`Eh+vE#g%#1C_!R{Q4s2gA5*jy02Uk`>{Rfj$T zX{$b;qx`Em*2Eue8&pklk^D>122kVm!&Hl5SM_~AuP#ZB9^%Ql-fW%{2h(3atuZgF z@+FQHf?3TiSP-t!i@LU^iPIn z6RXdUHaPun;3Q5G(;l>P-I zl+2qEAIU;2fuSO?x{&p`8KPOr9_)@Zz&K#BPb{`35{o)~+4-F%7&1|t*?4torTI6j zV1C=_aac7`gK_GKdIfy%;83aRdSs|QT2V?h29r9ab=4Ya1K>0D4lmk(-Eu#-l|4K{ z7AA)P-uxs7BQpby>n8pDDR8Z)*+mSxLKxF1%4tuJQunds&bP_eilF;4bvd`;dm<vyNI1a`(qR|$tc>D4n)at54F%nRlZq;mk?bK8ReN9T``fGRR*LVv>db9u7eJD7GO zV&#gInq6TnOZv5G@ng@T&f_k^sl9TFabz`&tSxpBCcKcnPczVKGk0Sox5{VFfBC_c z4OZDDK#SXy@gsMJNok21NG;C%WGOv3RxEm?~MQt{M}KBb%NI!rV8cWNc!O-rV+ zHKu-q4U2*Oa7C=a*5S}?960oC_zwZr2JRoF z_WyRBUPtUtB!NekdL9h%3*^mp#WV8%VS;On0dhwB$KC9Ch>}rQ=)^}gEa*%k%8gVL zDg8Iuqsx5gnMVi}>}Sarwl!$_g9%qxP9**VMfX1R$dPGT0^qG+n^qx8 zMG?+q36FpKe1z>Io^N&S?&F#!p{eGXf>nw>(7d5Tf!8ABD=QyTGg^|Gq7g(HO#g>0 z#ekQTA+iIWWr?oO;uonR0)2p&pjaXl=9sk5ubys+=oOAzhgYTbe-&Yxp0|aq$W~B5 zAyJs4-G0tLI5Vj3QoXg`#2&7iV->!I=c>o^1-7H>vaB%Py+CT~ih|g2B0wXF_z5mG zryE4TSFzvkH`Qri#VK^-)Os&~dfdCS$LF1GR4(1uf_8qx_ z*;WDz=Ygc;HaWWzNxN5mdLOb0;>ZI3)5rbW-vIsx!RlF1?T58h^72F4%Izq{ixl>g zCp0N2A z%Vjar>=aDRE;E2n%$%rxbAIkLT(4u}FKUqM29Y67%s9$Pk0plK=Oi0K_&Oh`bP#Cz z_;9pr_pgWP*(*!>vlPK?vHI!NgXktP_oek1!G{j8OKZdN&m@E+PXZed^gcqlx&4%% zces4Gy}w#hm_5PfZ0=H6Ro?ZvOn4Y$=9pOuC4V^8GGeG9HCH;Dy_n7?QW20+-A-Pb zX*n2QH|w~XQ2uurVQfW){PEC-mBdJqI7ua?KLVp= zoB%BIj73T%7o~=G8BKVKM6isz!skcJeDN-4bkM){=+9T73Cm!iC-y01^Y3tF7SW2g zSLMGHTf|8?kf>K!3^zET?N+7v^PiQnBZUy?VCih(()V zNDzmghb9J@%yTZ0(mTBlCp^7lnJZ_wdi!s_45N(Z1Xk_3Yp?ITV-M+yh3Uj$O)0QW z6+v6b!4-zhdmG57EHn4wLw555<-QIm@$ssF%hRhMf~ulaI*=&LHr5pedUU5>pgAjt*Ghm*tuSx7OMk1X%rdb|Ot+3V?XN+vX6lx|1P z$9&nGAQlhetO;BS&Wh6p?5Gj`gT?2wO6cDpcO#vl!OxIo+`d~%f&ZcJBJ3w_shRW{ z#fr5zs0SXX{Hw2~LT%d|POX&iHq)oeLsKSknSQN~@qFlks8@;O_RE$Odlcebp5Jar zJ&Qwb47?`r26Z&;euM_f%DWZ*)HQ0b3Pn>^jgDzbkX10iFS@cTYCxkUXc+%s;c>Ak zcwzuJK*zsc1wB#>snmy$+|qzX!=b%}M#T~^>K~*{?-KyYFt@@NpbrHIAh>(2(dH(o z%S`tQhplRdNojAT7tw0z*mV(mj)%uFAFQp3L=;GDrI1Vk9@$JW5PhM2SnxHdH|ILv zmOahK#XfR^v{=rk49fo0yXl`(3D&@3UeT}dwK@4C`KchVTeYt$9x=7Myv<^uDrIVe zp4-vLn=bW-T3r7wGN>0eYqsYAX4*GajUlJ^PZhxVWb+)bc2^-WzW zfxgJHmfre*&G&fu(Qx^XS>$Qj9eUD!u03i8WDdy_pB9t9+T|em!_g)HjQpWw)$1&( zR%NP_S5hU6#u?;952MD@s&-+*aLMB}{@!r^;RMG{Bk>%5*Y~-YKq@dxYi#Zboa00Z z2LpOR>8TcM5;p=krenbvFQs7hEnpaBE_j?@?nN>@qw#+M}t{WU~tVG#1E3l)NB!{7oh1leG+fu7zg-O`5Q84Km(KE)9k_8&Be}&DG?Y7FoOhB)&sd zKDlLK3S6RTNkI=R$F5EuT_7Xi;luNR8}U;xxR+`^9N8<>+)C0VN?ttyzI^bvC)A3a z;hdyq2A0}t+LnkJ+<9YGKm5Y}Xqq5JJ2BlG(HI##VwGzE@wm}f))<*9!J6x4*4Jrw zY`GYS+-0;y+Kd{Sq>NGh4Vzt>dV4=~7#|B{K5>&Y=l)q?(-bg}jyQ+4D` zc>7B7_UhlqjPBX*1X5e)$gn~V+FYK+gPcHnT`|nwLI^>KQ%a4{Q;r;Ova@FSnlc!; zMREmT@OIg)hCsT(BdaS^#`yMTFzY4N>VO9ldRKVN(QoMAVLxK z!BvOFRPvA-CN_kM9knU6QCd+?qe4BPzO8Q*X1_AeNO+1eywHBnhi!T zCw+1gi?ldaph8`%(@u*(7|d7L9WV{_k#oWY3%{*jI9U3s3q`R}3&Jc=A>>XOtQsF? zdZoABVD?BO9wsP@P;oVrEsPXWtL=dFyb^>~tq?gIoeY!rOkbmZGNOq8Ns0TPcxlv| zeEB1Y^9e_Ac^~p0999k_V0`Q9fGF=i?v1F-!OgUqS=2KyDq*)y1)L&u+Dvc*v~dX( zt;Y5(92#$cM(x2kD}ePHQ&Lu1{5Ea1FzZA=!axFXllcy7Zc2865nN|yaSkqgr$_A4 z+XRpbo5y7V|2_K)W>i*9$|vR@tcg>FVW1XakGGfQ`~7qQ{t@CGw$9}t`7mVsN)Xjx zo+|*{8C)NwPT*#vGB5%5K|mmt31Y@&OOnx<)C~2?z~yhSW74=4&hh6D=e(NDV!Jj2 ztFVE_noDJg+Fgz}s$l?aTA5#WR7ncZS+Y}2{NQI1_rVUrN(2rch2d6O8dc%ssD9@a zr9_RktnFwKe95Ky$hVeL6k{BntO(fAIsv{H_YwK}k=qR+xQ#x#wKxx+R9O< zYmDClnfIgEmC{W$aP^6FxeNf}HjcjJQ@)K3%$)qtnm>_GlEHF>5S@`c-MUMb_Rh3$ zJoZo;wN4jK2jgJF03%^fU z3g0_%wGG(o2JCTRWp42MR0)9{)aeO}`(WvJ=iorktEH+Uj&~ad;eI$rwhCcL)@~OR ziPXNar12!d-O-V;#AogC{pkY}v!XeIDk>?g0a7HhrS7{eP5EgwH|?7;Fr{oz*c*Z; zK*G?n+9~?7M;{9bAshz87h?T9rXn5Nw}mmOkHP@u*(hzwU3oWxWqH+-T#ts#uTI_l z%08DT<|%hBoevCE7j5`u3@$Ug@!rbKkH`g=r_>b8lBg?I!-b{&3@Q#sHX>q*5B?ls z@OH!d_{XU#|8*JSNk|a?INEp<$jP1UbzsiYugdiMip&dCDfiIG=N|vflP?8b1q1jr z3-T@QnyU`IvjQy1iqFlhvgO%2DR`_?xe?gzdjf}E$rDL*7#m^Iqh%~AMrMU-+!213 zSDe*QeRLh9FYxrx(I9MH6$C{1)OQFYe_TsH79J)WBekBAoR@H3KtM{^MX2)JIIjT; z!gCo>%*x{7JQQq=jT}I$N9umfeYxvBl&(X$M;2>Q(7gsxid3`P$Y2Qt?(v=SWuiRv zs}VXnDgJdzhFk05VQ11OTJY^!=e}i-SyKRA&&c^UAUQ4fM(?;`=XPTeqS`! z5=L0MSridWjWU&u3|w15^~E8#5Y1a^8yrgp8!|)*3CIHlP!aKMboN8pa05{d`D1fNtoX5p8s%A%1TyH}962NGPzzFgt zjmPkrFbR-A;;O8J2MK3k+vTp8A3T@} z)9Yph>#bYek2@S67xD78Cu>*R9qfU9>Lgic5hbaDY%+=r3mSPICJ~IiVpHh@W}TR z@ic5OiD*Jz&Fb!b>>&ZeB!wnxp%yn}2DB;u5V5MSO2K#FogO!ZU~|nZTC6aoPKLoV zX!n^kp_lC3AqwdkvkZRLL01%lT(4N0P^fIzVW%m3oWpu%f|nMIDd3`mF?gAjD-e8G zT(=6DywyVTo5_rU=TuVh?aGz2FP9$+JNR~rz;+GQF^px_J32tKa0SBKOQgBI74H4|gU( zS=b8afq_%)42tumSsF zus1CKgCwphKI^@`W?~o&GB2E`s4)VRbUxL1lidfvzM`&MIqtWxOPPf?t43ClZO^RR z-90c#lA8%zDttcLd)l$4lcLd~ViM335dZ41DB4b%4nQ$-kitAu;>|LA7^V$7GCwzJ<=7z{+GA?lT^jh4i8iVGh&?fT{VAKl{31QY)~P z@{``sK$|)?IE(l9i5J0zW!za!LQ5+8-PJ+z$J;@LPg+#Hl3ZT1z>zNe^-Hqc>wrir zpc)%~{R4$Yz{Cbt;IvN`e0bb1PaWV91FblTswEkjBRkc81i}@*c%RmpzMv}PNxhon z6`cUTI!V%11*|jf?ykRzr=J$OD6Ms`f_CXq*-(uB4hCUxqWdNyI=>s12^cU={N62} z^yLyB4-MEMYqvoTLBk3_js8ASHC}} z2Zj~3K?+GJvg*T1vxGja6Y*eU*`&wSgi&I%y(H7<|1+ip+dc6HemvDMtupbr^og`t{Y(k@O79pDN11E7d2HIp!c0Y(#J zR2b);wiH$CUeiYzQgc2w}UW&GXd&H)G0mN3SB`rcvZC}rJtO(xm`Au=@S<|HK9xmbZe|o=TGG}1^L7~tx0u|0E zr2|_iZ5y%My%(s%uEyXuiw+M_`b4Y2V(>YDKDBOwbdRsZ5Kj=ojU#wpro$t+D3pC3N451Ri`E?R7`H8_&BBO5InIWtiekLOID{dc&bSRX*n%~H> zL*0Yrt)Shz@C zck}>ocq()ajW-KC!`jZ5U;GlYwXXY?%CPwt%Rr7~`C-vb-nm=AUi3uF9i7tyI`PYs zE>8v+CcT`W{d-7wRi~CBOhj5yml65{e|q7iOYEu3^^!bPNS}m+o#r}x7|iqIcWDd4 ztZ4Ir&HY-kf+4&*$Bs5yH%KbqrV&~!-xuppj!l+6-cT1GZ(w5$jG@seJ7v6+GDwry z^PKe7CykfsW^WHQ$xslJ?g@&|IY;Zm%_LwaEbt<;)LAjRkgg6IIw;1es{qQ=#zq;Q zDR?{lnfzq}Pnm05TFSzxI0S$xL{-Vlo3;@jV^VqhOOs~->^=^vi)~m5|Jt>OaX)HK z-{YqWu`;+c2>oH-9$V^&o@p9J*|<{h=Nwa{dhin{a1($)Sv2$B3@1#Mq20t-Wy~d4 zQaZuSvg-9@~g>kfEt?ZDd$?G0Pgu0U&hd>l>eI6GlA<~4@h zaxDH3WWc-yXa}5ZbdV&IVI+W+f`-5cb+&xszVDN!KGakrn5Su6-$f@O0p**U`CU-; zrJ!`e`t{=4s7?#8ldAIhWrt6%$lEWVPLczkSE;&XLZ?3o`5p^+3>U8zC>q;!`NMxG zwK=mSQ3tmph028A0anmf6O%wMjIOE(1~U@wHLnKegc1Nbq6^j4AG7?J4!jc~;oqCz zyM%iaawU&_B*Z}<04}UV$sHK%-P9Zfj%SXIAD%+Po6@$x4H;YXYIGPQMifU+n*Al9 z28DMpUC9|Ch}KaAhi_ayBanAYGTQ4}BgPKtf{KEnLefXm{$#J1i;P-SyayfA!Gnok zlpgz$PLCKI`PSehC~pA$%Vhl{+-H<5l*qMfv((-KTki*9VF!gb z^Q$_08$<{X%aP_Rr+U2g$p&P!#z!U zoYGCihE8bK?#4bPfPvwn4HWEiqs%+Em#Q; zXytr{6#`*QsBJMl7}uj*Dlb4L^FF&FTa8U?-txlvSU~a4+3tPRc3#%*O)3k>gNYhY z{sNpU!Y30E^9(^~krj+xjgvewirJbGPpwB;zsKs+v$-jy)NBA6Y89SYoZ31CZo}>} z*cABjwwI8Y9=d5qI+OmvnI`ZdR|Z?`$&dl9Q3LrHj^D@Z%kFZws*{j-;RQ8Qcs0%C z3+u5M8bd5Ng^cy1-a-z3(rK(A02LTMAFESXJUen0GTV|Bd6RJah5y<7@vd2a2eVZ7 zQGJRunpciy{ms!8NpLGV;a&K_x~!AdD_eyu{WB9>V+Pp;__&wHHopynUwP^P@ev~` zM;t0}zLk2Thd{G)knRBX$YzdRV2!L>E6u5N@SSbnZHVGB;*j|y z9ciiOFw0cZ@K}4M++J9Cv{CjE-zj>7MU`Lc6b+|Eod8 z9t#F0DBO)6OgrQ!l_8n(KGXYga?MQTFsl68y&~Gk5%|IIYY1%^hys2S@_HVR7jk$+XQODH6m-(m<9Dgz-WpiF|gc>PA$`4 z0Mir2vB?K2d`N2trQITU+#H#TxkAbCz7oH)7?O<8Y?m-2I4=JJdP0Z`>&!(~(GUVE z*oO(lRDGbdvIc1MZKGU7+i+DK3XKibN%ONv5tj61;A@$m5KU7F@3tkY*MrL|TOXB) zhIJxToOMM0@JP<3n+w`YB0uu%5Z&M6zEyUa=0v5Af7Py~=X6l|6~d9El-OtXfT{}o zd9srFs_3pbm%wXg3_bu-AD4F~jeEHoLm`iB?ZG;GL)av+8JUEeI`n0~3);C(ZPW=o zDhxjX5L`6bihJUrCUyO8ytNf^jl5?)L_z|;X>YN`gElaHi&nU8O(|QhN@?p&(H8j? zpv!YC5B6EyovyQV3Edjz08XAPYi8zHYdVgyLr&_{R4V!+n;_IwAK*U^4c)fqV z#Xy}(G{78`bz*Ck!1ztj0LPL{R(4Vfu}4$xzQa;I#*YZ zRO++%`gkD1k{8&SMe|k&G5qe|1CP=cKgHMBrMuqDclq*gyy&w(PcMW2$ioMbrU;!> z_qORWu)!! zaysL~N_A6~NkuvHK8A~GiPA`aQjWJnMErnSRBv&ZiaQO+NRhJ?OO==?-k?tG1v*qP(*_l2`#{By zw2Do;0Y?{?rUbs7A%khG@vjRWy*-ukzCQ=b<0*l;kV4?_rhwdDb%g&k3Tx*1=CJI; ztd&JDg?_6kN`4QvNr2zKf5~YE>t8Lf_+ri$z?Eyu1t^oe6cS!Bd~9G+k)JVfrRRXEQ7Cl_7`8L{9DiXukt=`$ z@dcI~m)~9jE*(~kM*lddf)YhgzRFk*Sbx>GVc3xqaHF@YJ%Ugpr*ft|Vt-QNxYLI| zm5qR^7u-duMo?$EpLID~h5BI)2*tvw9|+3BVpG|jsz`Z*T@nLLjabn<#Wzer^=*a| zt?ydBTLonHwDkxR>yQOsvt4kx(KWfuJHcHR*FbE`sGM+{?lbV^4#(Td1$b~Y$po*Q z9;YcnCKMA|%RDy-ZyBj8ODr=fW}z$j`(fC3$DMd;%KYjk$?R_gU(`^U{#%09kqzRV zS24+3UAWgxCiIYCFHfh%H)D%mKfo%Bl4Gc!!dE5efnEYO)I`$RRT-zRarHeI2e(6qd;S8S=sGr5J(?NQ zGAr28bx}xe*S@*Xsa(n)e-#377X{sVis1Sk>J*s@6?5G#eEae5w0U^|0I2D_vuPOz zwulbVdCAXl#E}|z+k3r z<_{dAf2dsb>GQQoQKGO236b7pM88Pv4uWI-&M|zs%A$=y-d^arS^Z!>2TFT)|DteV z4Nn@UX5N`#qjhZ65nFg8DR_MK&j~eMGxIjJ+Ke=5`@&#hC6lvtU}e6sON)08;FoV; z?kVVIEL-?HshTQ05)e`ncdCC@<2-uYQ~*K?>o(_XY)hNSN62vMD*3o2hI#S=Glle+ z8U@&&@~0T?d|F860nxP<2>}Wj>e;2v6p7FG%EJ0hx+Ihn>11+EU8dE#b@j)xQVg6w zV+nAPO55%6Rv@<@78+p&a;?E1QK-5|q>zn_xcxjX9H*k9 zdK!mr_^y1Nr`@rWx5(Fhljh{RkO7E25gIgaFf*7;b&ymFVHBCZ#Kh>w)gyNhsy!H?XWG=zf+wuYde$i)xiqS(1(kls+iaum8b=pJ7#v zwBBoYDgfxJnNba3touvxcXuM)^n|tEXOoi&&_aa0%j-7q#&Tte-$5RzSwDH%if@$g zMUa4VfJmi?Khb@_L`HzvG;dI|I3~|!sCn!>_xFRdDvk-#++tEg0A^;jkM3oRUZAQH6FAgz&|=K@|7}iky8ytmjhArE@uXkR z2B$!pVPhm(G`-tbJWG#}$I=2W#G4E#!jz+rOWp$yW2s_bNOfWLylgC@?WtNxU~&+i z|ImI-PWj~Xj-%*=_HV-*Q>D_O*R5#8G;sZSy{6saV}3m6_>VJIToaEk}IwTSL%0h*T?*4!}Q#NRjE zUTp-s=w0cTr|N6^hTomU-ecsDhcQr8dh3{X(Ybkli*ySYo!bBVX6!0hFo}9!aNLU@ zea3;&t^XU`Pu^I(rk;8-@=P()3b7swra9wbdLYTp12tPd5PZsQEMd-#AxOM@eZl2i z>lmEU$6L!E_=P}ySrPGiq2IK)ex8Tn&)4cu_q5cJv2}}hRzZW6EN3merx#g=sRI8k zY$u+CISXvUAQjeM(J#vNNyb{ninKslr;pkrkHK!jCMh8s4;Iqm<|70?o}{Q>VQmW^ zj-ePAPU`3XVU}D3Da6rxX|v{%6JBZ{)o(aPzMe(PjXms4-cE0{xH)=3S#=taoW+Qg z8KZ6B&uu8eLzTFo)L%=sa%5sG(A^^~T8N|b>*Rk>3zZ`k$-xhevq^+J>x z3h-IKi_29DXW~#?J26IOqacu2TP!&;}#L!}%fS5R)kZoKt$F zzAlXqs7GaSm|mGAzg}Aj6X__CEQoy1wgJruGo#4!g>nR8WyKqxj(2`~m-EeHsN?!JxqgA+kyYapfwwMOof&D^>T5?9bN)cl;pmwH7`mu_n zi7jCN^%zs0z=EC!rAWXbgngCiPEVi0di5DZFj=jwSg<&Y$=jh-W%9zE{whhL#jsZ{=JXtp=R1*Czr!IM?oz!oWf#H< zi+Km3kETL~)LyITL&H*;`F+IuurRQXsR})gl^^ee#%cJa<#VS1u;XU!1{m)viYd9lps43@2d4s{SsOXuWfT&1sk;3$mup{ckbjZvP>^U6I)gK z(+@!R2M|`3mTq$mRjuI8Y2S2G16gcXxYsIkD>YQ9b76UX9h@ZlCq=)ftf*E6SB>0n z5BY|fV&;F&4-1x3d_QR(V5MDpCGW*^z)Oww4w zI%Xt%%LmM0=FJ|q;`!rfy500g_>FjjoR^j8L?&a=IEvzv%RQAyF7Fvve_K&8A$&T_ zIGG_G7BEf|xR`dwb9>VCN(2c^@r4(CO?~kxVu{OAcJE0<^3Zv>+Y<@;wu{cYwJg z#5?a8JqZSmkXcp$XV$mIn7V zuQf^*^OY$~m$l&Tdt1N9%4$If^z#`WY)f_6@YorOdSKd)rWSCA=LIeIO({@^1!(-t zb0WLXx&uLA6qx4$*soGj=;tZQA5{z)LWvXuH#DM@7$Ol&svZHBeU*B@OKSab#bc`* z4S>Ojc~ZL9rS_DQjhXs{y0(0N%SzCbV3NU9NI0OOJhg^uDHwp*C*kMG9wL?pXeHw- zm8`653Qb!X^a-^5e4HKwHcba-4=$_js%Lm5u(v{j)z|3o7ihaP+m zooVLwZ=8IWiJm`|_!PjATeE_E5^VXQt;8yxbry#BFOGm&( zV*Z_%L_SQT7IJ|g3_r!=G0+N3E(PUfn&F|(S*@S&^;&5{RCy73$XQR+Q;b(n15)W-yA%-=*}T4+FQuoj_(c$iPpcQl>La+fcg3-4$Fg4?i5utUY^vuR8| zGZc3<8(mfyCv0BRA1WQTerS@ehhyTCfq*S|2``#&BaO%!-*i7yT;AbDmKnfej97ht)NZ11>k6jTJicSQdgF4Nz>IEG;)XJg8BJz`d{CH!_zkjv6xo z<4&@y{W$v1IuZ_T7hq!H7bF8Xb+o^{Vb(LQ_*^)W-=pT-l&}^&w~ksC04IZ})5gSq zNL;eUa(Aa%nO`<;1$AC2@9c zln1w4!j#u#AIY4ryyBF7_(3E45VjNx<&|e41j;B;;uvc`oac%6W?9h$x%P`fq{0}! zJZ3gs=5Q{QKKoVjiL*jAC-GTsOK*7!f<;)P#Kn{G28L%;j*l8jhqD3a?}LHswH

zKDmo{nF!VekUy}G{6NZ5zihV#qD%)XFOja51QR{^X7uB`?jb5jjlp<$N`+4<9hnMh zAXqCGN*VrIxxjBdo_F%K?p}ai|nWe5eEpMB@k@d%ryVsMU}B!*9cT zE31J8l#tl7{@1+(t6o$qvzoM?KWa|Wsm+-Hfl#Xeam1t6I*l^z6l6}}2BG(VzKZPl z15x^oh`8^GI5nNe`caPJ1o{I7%avzN1n==YTbSoqI#5VO(xa+Nt?^{D#+U4+_l|v7 z5Ai@OjIePFEyF|&j0GJ5ijxj)@zgiPBFGVUpzJ!cv&ZsN;9^Op5k~(j?AN-8_~pyy zD<1GpS$)T>cMs2&_?3?YyEO_vbA@&5Q4Y{6OTA8^D>oQATzF0tHDh*6o~B%(*j=Hz zGt^+qF@IDG-vF-4&BWPz$+qZt`ryUS%m_n4{+t{gOmDuPkwWUIjod{=P_KSX{(|hf z+w-mi!9#0-fbI>#S~onGppn5dGtuHa4VO$d>z2j{G%)& z)GC`Y&lkcrNZ%((lV|V(grh3El3R6+3EFM7JwkyFml#FO40tym-jHS)lT7kOvAlf~ zOeBaMgfy3saun|^^)JYQiz|nC|=8Mo3D zJXqic+*b^)0qZkx67h^r(qE^W^lkDd!zONt*Kahbji6#RivAZ2i;v8-;Il z!F<lAl82wnK&J}=rO)+yz98IHWAcHX-2ep5&38HefbU(0d5)( zQTxGlcly<&D0Il9in-pzwXBItEsvzO(GGoCZT^;8YL|oOQpqU3Cf+Aorv{}RvE(nt~STjlpsh;qtzACAC z(gNUNBW!&S?#gO~!`B8Ez(K&bkA)`_I4CQ#sR>tp@IDW1v`+c;hL9oAnh8pV znkqPerfYCLnajUj5Vue5$}Pp?e?u55vny);X)E06vdbh0cWCj4Qc(Pw>)9jT+~HBr)2GX2M6`anSX;MK3kFXQrET|>K9j&&|K?4)_N(u;iRPyAuBfqk zGEOFLS+08|1F=TcHq_1Ha6qPNhD;o_#Q;$--nPQA->@H?xmMw!=*mqmuh3YTX4r** zlHk9@16`6FQCI4QztIz4o--3EUnmVk=p1cRlv>A*w$i=D6hlHw^eM!&O#ddurUr!5 zYEG}7vqB++XOne8(7*A0mjU&t?wp*k5q#mmtccZ_+I5OH&QETT3jVsZ;8|L1@s0)o z{KWY&jleFoXH+}~+yYU`Zffj?+PONk!}&eor%M?w{UKH=n^Am&XfLb& zc3Z~^To;UY)bwdCS-pE5NYeQ|K2Z0Y+*t`Q7XduMX?ZPg*E-h7)SqfMNwosB)60eq z@IrC}n5aSj6Y+sXhoXxXnWap4oCsqP!Sg?iz())8{^VO`&^?`{pBY_tqG|kl@|n#E zK}!>O-J>@a=@~m|4HE4-{vTQUHzB3&*6+Fl+S;o{5|NgvN@+{9L`Y_>DjGa>Q>##h zhsC1op`e+i&{SY2-!M`(L&CD|Tz&|c3!{{0bj?u`<~p6CxU#-}`{K)MeR_$bzGifR6s7?y_*uNl2m-e1;tM9{F3#Z|TE#?~L~wYI zCtR{a#{5TX=N2>loOLu&9y#S);@#=q0Oyg1(r1=B5()_{rHWO-g_Qg42W|)Kowq;v zF&EBovS&H6gy9lO6^3t;PDIK<+zY(@czl^}F_lk;7Sh{vW|D2A%#-dsZmRNXE40x_ z%4k(@&U|aqTDZ_+v0z_@i)SkS$Cjy344`?m8`a`#}Si3CM9+Nb3%;q*4EddxX!y1GSO6)!;0i<3~bunP%B>?sYf)Cohdl5 zA75V?%pj^VtZ~H|Nr357#Y$=UIzG5NGe9}!u&nL88#5-7uh$qzqp?^xL=O57+p~Qn zEtf@wI|ml3(Q12oM3R+S+Z$IQ>*JeLW5w8%cS@7fu3C|p_8f#%)yD)*wJb5x!o$JE z`z^xT8ylzn60%saA`gW1?|=|!36y8e=+IR^wj?pU{D2piAd=UJo?5@~$cPuLM9Uk8 zr9pOAtxoNi%z@%7cl9&D0L`A_d84U4WqxstYk;BHM3+`#i7lqp#2Z}*A8L*-{VYv zoa68<6rGt9f)N$}$T#q7+Y9PtV99TG5_MO=20oU_Vy8r_2n8J?$f&Bn-mV|d%-c=p=(})*O8@ER420&Tz z1ttL{#7?j@B+{d6Km}(uKAU)2806_rhG)Cy%pX*Q*KjuJX6+i z3q_>awTNa%rFy1SZ$}3b#|C?0hw3JN_780^#rblu_7G%9y##yw3lyh_PbLneVSK|CP6I4x4+x58d@>Kd4oC0fjEX#tD zy0~!?T3|yNP-zK=_$u#ND{gqx)E)NpEKd`q10}J?AR+YnN?TfCbv2bA=~homtzNXQ zt(BMZVXS;%<0svU^$Ni!P=;p;^KJpHHq20Q`!%gM5csmoae4n{W|rAeIfig{&JtP3 zwv_HnF5Ov>iAL{Sm zMMsw#X=sY7D+;! z%vOLX)vf1$6}KHN?1kqZ^}v*+1d09YK&ZQ0SgY)d#1FFijJ6h}C;8M@J?tsb!0)siN4 zE-b(l7uUuw(t3;Kk6+g>SW}By!i(iqf;_S{b+b+*J&g99N^VA+0KO_gc!(DNWq)Mr z=NMTrV1#&`>oY6vYSTVSd#8G$Cs6hIEkVDity*WtjQL4WgLQ(lmIQ&{1S(F>EpOP`j9Rr?g13xpe`?9NoJ!~C zcCRq@EX zG%KBlRfVJhUZT343^R7F(X`EbSp6&oQkt4Zgy&@~FffK)+NaurL-;ps5q zJ;80}frO=xWn@ns!byQ*BGF-F80Ffc)V@gKD;H!h&MoF8>(hX?NckW%E{DRHA0SBa zyqWM+=LDd4m1{tVlO&*~&I`|Uij|6G@*RA!`C{ zD*dsqq;!T(G`YtSGzM}x$h#v!^>Im27#x=Yr%C*5l-{+I0`?h`T-nf=5h|5NpW1n9 zT(yUHh21P&oIAgl?kOpw8WO^t9GGkBiirC5>f&1jM=f_Yb5bjyU1a&{#wg{`GDMYD z(W=Dy^c7O>t~ofR68%PViOdyJPtW0*h6X`FmdLzris+A+9G;f9 zPF95DO3R+1$_q@%#7G+!5t?sHl7H)2+t*^Ne-Ka>U%Qco3DFGddFzK{kIUn3svZoOUZ8&UT-p#_)6i{e!E zXu&N^6NvJ`0&Ccf@*GMP9mJ5xmXlfM?w)923D~TVqsp{qI=V}?T^fV4%=vM`bR4c$ z2owHRV^?P4<0XfL$YN}BN|7VMs#TX3?fNXp1y2Kl6tVshNqNm%Rwe`*rh2+Rfm;uT zr6~~E$GWX-4!O8VX&_M)l)a5HQ@$*NjZ$Pb$h}9fVM+6+Kk|av zPDZY87yZ^UXLzhiC^O$0oQc;wHJY$E0uJZP?!TABbV|N-Ie>~85k2xOjQd8ntUWzj z6S=dpe?-eTTyf;^+#s-N&kZ^cOH80hjoW1}>j12cvh@s;(D&&Y()%fU9MgHT&bMLx zToZ>b3=;;|fIp1NfStF_b9BsZan>C*sdhMm$XLv7g<+S~Rwl7fDI>*ERxFav-4^>z zvjmp88-+!t+|~un@I2RJ4{n)_5a+tPKXXp(%(-(Lx@Lyfu!<#*8?G+nbYxDLpeCq~Wh5xyh{X8p}S<`l+lQ z%G2i9<^d&@88c!oGI@sfy?ky)3qfIyYF0~_V6C>lhGI|ho(_nfF6mDgN}mQ+svsw^ zI!A4xszE9X`>klIfc>peo^lw?9Y<_wOg{u^SrsbtU*6O(eF4Ocwa0aIC#3ZrqZmiOB7nu8$m(ek3amfC?RmOxe&CWdjzh*%fH~ zlHBj&^saVrl=h}>=A1oHhx_b|r2P#FcXV94&Oj4~%DS|qvyiz5(p7We^+4=Dk(lvI zo3$fxEIT7(D}*I*NBOLoG&HnVE1r!h6Z^@AY-<3_O!k^oRl<&V5UkkmD|+sn3^Pd1 zBR*3`X+@`0XSX8OaX88OjDO}(Xw$-wxtxl|68X#rxlA3woEpA|fj5&eLmDGr?Pw+-6@h~gCYvj zhT3Sb$VzVEGLIgPM&o}LM@YQpA_LI%Q+LmeGxA-{&7fDdG7T5vz9^W+RUQ?Q@)um$b2(+^ zfJrMUH#SjG+y)HIAy}3TsV?3yli~eoi};xmDlDwD3z3Ipos8kYm5^PC-D8q4iywf? zxzNU(bAG=`(9lVO;?8Y^#z|NVv;%GO)lDrjPp%Zh zu{^KW+X@={Epcn3h(e-_qCbaVi4f&<#WPV80W2S~3JG04Vx@PMYp^(@4#-?kc1&!9 zdN;N6E~RTqj!$}KK?xYaCZm=Y2bvL&!bL>vNu!8Sdky|yq6~uq4_HHAh;i8$6Nc^X zJ8-ZirNSWi-5zaEpjIs@?El~lh;PCms)EI zC?Ou@XHiwD5Z!aSjIvwmYRjobnx%VUR9D0U6bT}m_5t9avMe^VS4@CZevj4E_QZKz zghU!>Z=LRtv60f#R^(BooaXyyKYcHu;Hr#%d^AvgIDX@9>D#7XqfyiN~ z*nztEn3v_yFmVu;GqM_n$c%v{@|KtOOKJ7vuL~R*24$u5-TANXe0@3fl9RV0ZFaTz ziD^|Fb3ADW2|)MgmV{Z$!zoAY9_z3dT`YQire{@1S(51^l#V|r$yJf|l=>ZrFPT^# z$Yg?EUujKdN4}JEtjuQ`E(DfEsb-W#wzm0)8KRM3O6rhZP<4y`@JXr}pJmmT>zZ** zxMUi1nwR@M@f;)eG{p_ORg*0j#vV6u<*W$1JSgH-aT<)2o0XqYG3m3y4715nia@oj zBOg?b4Lz1&Hfk60!lx$@MwJ#VftYisFO+jo1c%AuUZ}h|@Mg^cKAHsh7Tm2*SEchSAtVs{~F)K5`chx|y-AGz3=es2_W zST~Vp#b9Dc>C3FBkN3G6Qi%WIR`d=iv1m{gDh^hwshmD^P|@q!)0jbHDsgtH8`d>q zC7E8pqtpZ|#y6CFqQnpKR8k}CqNo;;)a%u9<6CBYnr2h`5E{O-n9=5hy;)zesB`eS zlW5dY7=ieg*L>Sg37$Jwr8AaF0_GOQ5=)I4r)Q&2TwV*&u?o|uN>RW8wb?9VEnwKq zlbwpInd6>B++!uGoNC-`!Wo>RYSPksp_*s`S|R+4&75`^J3_h% zb?{z5T#BH3d=oA# zU{+SF zn`~M7z0mfqN|GVFCg{3REJ)gGJcS~TE@xp>#D$?r8GElLA6@=fAXH-$$7-Y*dPbp& z0B9=HbZH5Jt0quH?Qc|LDMJ-p03&Ewtfz;v8(mbLaA&3ZQHh!iEZ52nApj?-#b-Z ztNQ-wzO}k`@3T*JoyzvT-&%*pTD3Eg7~I9%Q)54D^IZQsGS9_aen?EJt)wPrA`7nH^qNZX0 z{_Rn?OL@&Wps^fV$l_>lWk1u@FSFs>Pu_FC0ymQ!5GE$msZ()}E zBzl?}b)eNOKC@ce1g02*mlhM1Xcci!-7hy-j!MK^E8ubl$qp5kEyizoNhbEjL`I%0 zGX~HM6KpX2nn&hEMQ*xxY6lI{!BVfZ9Y2Ep9N5YYm%Q9i8Lu%*Sk8@#Z zTcu_v-S4aHB10rHD$)#vQ0r&&*w-#Y2Wm7~j>X6~=`8RvAIZ(wqRjNdxNDfLQ-vXi z8FT_Jbh>cR@-#5wA*h?l&_&;WZ*PT=$bJKLu18qu?}p;lQYyO#SlnrCm_i&;=3y*S z#j5?@R^^v}uJo$?{f@p&i3>}RrGsptPOcSOnXVD(s`-P6HR!g$6qybVWP2f99bG;- zA59gubfCW45{PJI(0*0ja>N(RO%yI7gAZ_pS|k0@O)RyD%^s5v-1WLV*UMv<_kjf3IIJ|!FWo{U!JiT-pxhIWzTJcJI@!b=X!BFEIg;>~`*QzMgr zLLu!@(fu$I6_IQvGp~XI{PJ4wCDAH0NDnd;ZrLv}k1d(F*6cVxRO`sigZoC{fx^?$ zrh-j!=mo(f*bL5>+7X-n8%W^5u{5=gY+{h;Q3E0XxqMFigw4oWy{AS9@Gq!P!h8TX zIK?+RF*&IZ!qnPp{%sg~J1TVN`=DACBw@)=CW>{K>7HWh$Eqr;T zrBwhuUt?Et<-jxbzhwG_a7#VFOR1;QvX6RBM{b(7g1@36EN*2R+mDge7#=xL$gF#` z9Q75mv1UA%RGD~CuasgaOHasHIeOMU*j|VJd&R;vB#2zyVq8Lja(eA2PqG;@Q;7z& zyDDt)rS8Q(eb$2#b+C+?TYXM(X8_j6an}& zFib3`e4QA5yZAHe2w`#hsjBqAsB*E1FGie=-@hn{sejV+vmi0paf0=Ihxz@LUm0@} zUFp1u^-q9P11A+K7Tq7QvaKy4J!=8Ew-v;{uuxWoTo304=UJjtXZXNGMMQh5Zr(ok zG+9hPv!V$zj-aV-EpcDd`=@@@+pKsXAry2x5aH*|)_6evre8O<29o@`Pu-`Gd4}h# zgS_3C?FH`fR;Kuv6Ompc&e|bmFi79-hIqgI>(o(wA@604ubRoSzT<3#$nbHW&tian z0#9yO75j$tQvfyN^7oOl{fpzb$z+{7E*lYEq5*b^7%^6+EyaR~JmBvA4$xnWy)@uD zE06(|SRMmRZ@L+XL&C|q^DN0hiIw|H8g5gR^^@!zj_lt3u>fIMghiE}+K;lVt`l*A z(XPG4Kx|-;+=@gjLE#eld*G*XAH|!h`moTx& z*%k^%A>O+W?K!|f-!iL7C%K!qEp=qIe*RDzuxJpIg)rsfU-;rv>P3gSDg8}rF-Cq= zlL;6EFL=G%jFhW^BV*4}j<|ydhr$uUtF5iAtF5a;T3v0^)C{|*x){Q!MbzZ_|L=%l zz|-Yr4Ey%Z-d+K{J$o*_J%4a}E2iWfD8|VYgU}`DKuT|5SUv(smj&!z6YJ&Q+>76xhulmXDX3d*}ygrs3t!V zD<~H?2V=G&A`+N`6nh5^UT1>u-?MM;{m(i&I(mCMdGvnapJO40(Sn3k9o!Inzko_L z`NSm@MKj|N3j4+%hJ6qU3hV$Y05BdGhvbXr=kOl)92fW8_WYj#+c>woAi@!6k%fzg zSf)$VGKVR9JUETB)-a57dfs#is<8vM%YZwkNr4>=m#U3u5NFSt3`s{s!VxiS$H5DZ zDZ2D#i8=iU>!7zu*Fbbi6x(;UKQ6hvktj0IaLS}D<`NJ{z|kLCetcZMT@}{cb6Cd* z4)(g8?KjdcGRB7v)1QUNHr3m9kTIT*mlyYMBH*wJ3IL7d<*S!|Fb;UH2Q1!RUVeVx zFE4981i^YKHuB?bB-1#b9btlDS_YB4k7_x5%bEqL!+)`0XF1nt;-q)y-DWe?3na7D z5Pq{}NIw_!!t2?9Jsh4Vy^9DK-r!NSdzZ3O0`sk=0%#IlIw-@uy?i|9jE){Ltr{#* z;*k1bp3f>!e{qHsF$E~j618xZd~NYqlbu zMsCWQ*4-gSHjmgcz_4l}Y^G_?1fR4Js;RBFKdXqnvhuK_oed(0atM!vL*o5ed7^1R zelMWM_trC$V48WTE{`#!e$6r-T!E9*8=hp)o-0)qySWz2?O&nA(m--=6?|cQdB|PL zXXH)8a;~$qWTbf?Ij~|@S@8g~)$+@C-xUdRBVY%e(^E3v5un%3l z$st?ckyVMG$&TliLybW^4WgLz!zCj;^9WA-jv}Bq>9Yk19~XSjOEpwsBlc2QJc&Q> zFMG<*`fvQcy>J(EQ5c-~e#~5%9G73qPKO%FMeKlQ~35syQLM$GYfOu{s8fs0#T4*>BK@*^Ic1lIcN~%HKxF*BC2%0SA-i19-X4S}%SoytZbhjgP$4Ez=jF*} znZqc&;E#OIUt3%I+cNu`*M{M9CC%j!IZAT(n6CuUmB!3((Z~ml8jeDx+`!@vkERUW zx|+6s_^QE2-bKCaPThLbxRqwx)OdTkdL-K-LI)hk(YV!#A)jH%ze+sQxao?9lrdQP z0ysULR^@db@~VcGx3{l=wrB6+m9<$_RdsPey6f%Y;u2C=om`U4yd$2z zPBB7dlJfy`e-{=;T0DjFb^;+ayt(;4hEnM3<>lk&+9?3>+9p=0W84k>Fep~ z?d{=p^e%~^&2tO>v!o(_Ias#R_Ns=M$i$-glW4w|UEq$8D3Rt?VX)1!1ngm&h{42^b7!c0N}~i z_KqGv-@xD({_Sy9)zBU+f05i;K;Ri^)*MKA-O1p5DH`p6+g7n-uL7Q&#jYbMtqG&IC2T`5AXV=h4|p>aDtM zx_l^69g{$eHxT7#>a$-8mQ$eqTq9hDFFlCML0ip5C{EN6qM(q(+w!6EEw0|Ly|?q@ zx2NOdw>M9asj)|QA15yt7cM>gSf@DBDet{&TIhva_!?ET&naQ&+)t)`^2`=x3m8Fn zh$4(c;Ar}I0ms+t6Zkst^82p`EWpwI#^xb|MpKI3BnA&i{8FA7eCdtd9Jp={h}AbK z>aDC^jA2BPJ@r7yZb(EgxZ+>Vro`i7>tZ#IJEiV(vvqSMdJIIiOis za2RC7qU}5QG#Y7`PKcbS4Z5i%%FVOVOrQRAyFjIengUCb+9TC00d>LJC!)&|VxTL; zk}WqJCns`1fsjO%fQcR83CIbiK`U(Ak(JopF>B2T)n8UlCAi984%60=Sz+$-_i;~M zB?-dghA}6lk!DXIpwF16gn2xXX0Mr-mt+U=#FS#E2$1FxNK(k&>XI)7ueP|H&&wm& z%rH>l&0T`2&+eeyownG+3Bb=>)3qT!%0vjkwk(kUU^^jqNJ0vDwGVl%jVM;#r`Gp%31@e>&5O61;Jn`d*TIkNZdwTnv|?2VJ~mz zoURFARqK|TmWVW^vl@%bl=HT;3IKc$33AOulXG68t6|NL^R!69Vrn8R!t>PO40z?& z8_((>fvX)yDrW;mml&BioKZE`a>Y1gEypRBezWNLCjmUyz{ z%ngfOU-MNiJJk0ptSn8Rk5^%pqL>HU(pU~QQMkvvWVf*xhY7+GKOpq#4A8vnq-)F& zRUxh@hZW)ChY#hTA8VDvFcfLmW>R72(;3>j8p~xR{sG0H+;{$VgY~V4{EIgCa|@wC z1}6#uC4kY@oY3prQu&UaR^b6mcu33!ZqYb10Ic^Ik#p4g)Xj8ddU@r;vFiMf zRU;p*f}qreJRQ(ZMmtctxPt!h)~GNS2o|NfAv%jUee*8j|*UjU;$<=jOF}u%7Ga4U%^0+-)4zv#z92{hGEF3fz@ehs}HFq6yGe_klLHtq5>yH@Y99rC_@Jv}{r z{a4=J-tO-1-rhQegX`>OXBBU5ZX8mdN*B4YE0)##H=-@zB5kvGSzzbE^rKPSGw{wU z5j|YEJ4Kd!jOwANLK1pYMkhXM$D{a%sxGR!vJODqoqU{}fGFYS=jP+%B$i!QSJx*h zeD4DSo0??b=q}5yPIZ;^uXP-w0fMBx^K^AnE7%TrWyV=XMn*fkx;jQXU>V!{^>2tS z%{$goprAXxA5h7N&!}q25q5(PTSpN0 z*)vYxb5lE7eDzG_k5}UfL^?4ezc%X2fF(#GS^8aI{D3YE?~^zalk5)uag95T=!@Ec zzLIHRoM!U10bSe;F6H``DYRXCcu3(zKbQo?HstG!QFIX?d_lh7n7HUGm?Q)se3t`P z;0wN4#6IuO5*Kr?d_XTEo}g;%q2hw<3BZb&c|~I~7hu##cUSqT(thoDGPw#&Q z`x#U`g&svI!tb2M=skb}fYYHIW9ZO7FGSk3^xO`Hw$Xqm`c)2!^10a401AG(M*xB>jw-?i5@kZj#ucT{@EJlW`$$Lg( zcHUR+guskx|M;Gh(TEk|y3Z=}X4V@v^9DyDyL4F@jE+w|-TFaelvjDsEJv!u6W20blQ;WD zcu03gPe)e|uyplw^z;aV`LuCzt^yAQa?WT-OI0kM9)tsY(xvN7=^03P&W)xIYx}4g z`+wYl{h*nKwH1|PeSby2a;65F|3xedlF9Q{MP|kf{}9a0%gxKn?d2EneZ70VShZ7B zRLtx1etmnK9NY9-cKwALis?wL-y>;e|kZsJC22P zdXY`@ncph>3xe1`^f^>UDB$z@@{HTPoY<1U8!O9(vy zgth#0oKoESEk**4W;w)k&lYfp__{?)?rz}a#{J7kx-RkB$S-6S_kr#Ts6?LtKR^E7 z*-2X3DzL7uzM{@`*75X+%pG<+lyDL)RpVy;YJOn=e^x6yLPa>u3RsMFEf(Wm-!f5l zH{;WIUtV6`zWT2KZTjkJ=o8r6p6@qF>;8Z)}d0b@1!bO^}(tc=YQ}4 zS-9S$@X!kY!Ub?#fY9+DY%l`hYqrj=j*yV>E5`*;`PemQ-K^e}!=?aDVUrDmqHGmT z-4DmAL=kJN*+`3urGTF;2QDIC>aj;KuLMAI1u5nq*Xz9g!$cCE&C>9~dYJ1rEMg#Qci&AS6TeUS+M2K85*5)E6nk5OYd zeB&$PY$T*5p_%#7#A}UgQSeUZ$**3jZom6ER3!zNV?bCDq2HX~$Jg^tLDNXUv`Di$ z+O?Q@Q?9y0DK|Aqr?7&VMedmE+%^$SM(Nfr*{hW+e&^bq@rX>#!q4BHmK%&1L*hl5 zd9T^&mtT6JG{yt2e@YO3C}Q{Lf%yMi8mev2+c?F|G91u*fG>MI8C9@r$z%`j!U;L4 z6^<_$viud-ULCE!O`iS%?nsK&E&V=6Ya9W$vI+avI0V#4wL_Izk*j2N9~?q8@;pBK z@qCJ)D>tdaKUfEQF_Eq>8ezAyDA!hH5r3c$D9iqScBQpazUm~FP^Bv4G+S$CX}Gmz z1k0NY;-tvC1UtiKON^J--+~H&m0ZCQbB`-E-i%G1iT@ta498VVtEhMB9!w&n4ZSuJ zeYGslQ;%NCa2?!#m>RM@C;Q1M($VQZ~c zh-`A9x(J1HjvS!GE~RI%y(PE>_>XRE?+Ee%dq5uo&!Tv{InanWmEap;QQNG!N~l9T zYVB)+Skx3gdS=h)s|unTE-2P;7}TXVe?E2I;o<-;w08#AP68c?S8%r6j0Rh>-^K-O zJmBzt@jqL&1NeTup41ui`F_4#o#gp_JzZHPuR<82@jwcrua?2?CFe37(JHzK6-K7r z<@fze$qhJl!TeIGMxSV{M`Hmsm7F(e>3Zs zLe0R3;|zM*8nRglI{)09B*w2b zD@X}&MQu8?P^WNv-;PDcM+^f>QC(eKo12@!HY_X**a7;CK$r35>)5TVM(#>&!8R?}AhPs&bid{IqCz%-*$YIIvb z1mNwKFEXsAYBQkSqpbAH-=mRocbCdP_1w5|LzLy4q* zH8v_{Uq{ac*-6IuAqL!Dc28QkAyn<&5%{&pnF_g+qvb^}#m^40jwgKYZNL3cw1y;) zPN%XrmPHX2ZU>33Ns(O^b@6RX6qIZ0EqSiU2h%1Em$okR=w)fYomr(6N8ISs6(1vT z5cd3yhGM>7{mSLq=`0y*6a+JnDsitR<9fpjdw;#^Q6H2Ze8WxQx12G2qAlY?o;Luz zk&z~8*ps^~)8b2FLO6J*w}}KCwdOlr4vaY^%}H6du>kWQgXnectT+@@_*|L6s^e|6 zyC2p^bKPow-$;FCW1Kx)(Kox+neQ?T8;(h`%hV#EQBE>Xwfk)%h{yj{{}X z$rf>Tj!lpMnp8^@_QOE5wF1m>cqw0He{Y!$C{ABui4Y@mKkm~N|A8-f)z$Mym~l}g zyeVulYy@X+?M`)!S8j#~e8};H^$>8o?-XrSQ;|NPJaL|nrvjC4PX46ecIjd}F))1U z?*E|lV|-s2am?l47-llX!CLx~`sLE-3MWQ3ZL4qn0(QFjG|0W^wmYp6tN>_E=8GX* zxIL`kg1z0Lu_KfPwZ1IfI>PbF*V)1iRPo*iQf5JZKA<-O6dJaHhynCUws!Cl!%+=r z1U5-5+b$ZLdqVm|M_pKJxI2F|Wr|~XdwnQ}$-LJ3i9#W!=Wr$xBJ|WLt+jkgiphgd z`rtZqT1w+^ntK+yZ~Ad+o*!tmbn`&;`n*5ATy4(g34VVp&KmRrdB)Ks5HEavyi|L* zwj{+#vX%pk2iO;A!#1jN8bw~vKugh9*NY310H1q{Wq^-kPQj0VLv?ryM^*8%qE*L--i;~K=5-I-h~$$D;gr%kElA~hm#}7Ge-m$(ofgv{ zkATte!4weWx7)Lo?nB(_f1P$x+P~InoJumJ$P`RI6W}IO?R;HRmY{U$?TZ1{d6B>W zy#pl69)GPh@M6(f!<&F|rPmWH2>Z)8ena*Pfm@1HgRf$)+A?9Bl&_Sg=?Dewck9mV zV@~>iWlrjT)raS*2AySA{qUlT%U<6%B(3eDJ$0M?@)(STbq!tOEboDW+@{@Q!j!x0 zwcCPfIV&qnv4LrRE|8$IZ02F+C=Zoj(?HNpG%y88Xqdv(9}gN+H!UHVUpeiOGtI#+{0=i9c1 zW0JjP^f=j}WBWZZ+tJEa1~9TiAh1oicdVEPr0jh_(k@=c`b;2ZB`pZKEH9d1fepb@ z)Y#gJ^t&ygfB9)~`m@7#>K4XEx2RP6lkk-bb5N)&hLHG;QMX$Kf2)i%-Q$37iRGJZ>UTLxP4>?^yFEG zHyOSp95kQE@>Fh>wk2NMOc?Rpd33_%VZ+F|fm|wHP{h`6XicU^xiW&V`7q`T`URP9 z;Yxze5yz-LL*WR0+L63~M$d;7U+@2$ukY8>%gfzEwcdglENYa>@zK65Z@@^k6WUMo zLq0i&8@MDe=IVq*^tW&>yz8550s?~T>zn@*nP+=9H=qK#jQ{8hqkNth`eS=rRpgyU zeeLxypW$~A+h+*XtltKSw~wdi$J^rtN*qu}-e5x_SWyHI8Kj@AQvdT~VbM8;zLJd^r8)-I3DY8JB_@NedrUU1vPx z*yp>){I!hPf(3LjTC%7E(uhvQXPVWc#%6z{Rt4?b!sc>>a&x9))VTAKIciKU;CbO* z0(vMn#~0@WRcA$UJ%=*;6}JYMS{jTe;&-8@UMPnOZki4g>oXT6;=^nN^-LtdBU}Ll zvL|BNjIm=3_1E6UZq&9Oh_V`$Zf+|c-F=)onk>b;WJu6yrku%j>31~5&9z(iH5REBL|u9v#`H2F2Kb( z)FVsEX3|&=Fi?U%P>~Ti-YWl#W!a2JnXW`3z~xrx^WzPc)4%fU&U%sr8>gf)VB&%H zXM-VousAGD)DBc=nSsw5KM_kpEV5pEuLmi~P+Ne$NJ8#shqXoGi=0*I*VqRCK&Dy}@Tp_>@>mK|G%nX%Qi-oW&u8@Z+xG-0AE0sU~6leDltJ%QSTIurv4^ncQl}`un)7i z0Y!WIi%zd#GG?=xS6)NXOmK zo+y0-!k_BCFM!wxqz4zPb#VX!pf2+tb$WVgMSpCsX_ZFA6(+yVfo#039WUVVyg|b{QN*qZsY@+bq+id}X-e%%EVz1! zGP-Pnrze}B>{5Y*;R-INaA0u9*>stDKu-+7h39Nd+5oxkB_5ACJGF8+dNZE-d; z_1-xC<0>*!O*D-&4^h|HydD+M(XI3Eyw@wE{K)<{;5uU6D>e#rHX~4La$-yqL!o>X z@$o!S|CH>&jdMG756l~hdgOC6K!(05vHHyRr9xvNvr73`sw_>Ki~g&kFDUu z#I}OBwCC84GPc(#m>kcEQaM@x7tno+3QyQn2wbTipXkB`P$)`vw=OD|)gwJ4T3MSfDtQ^zC z0D~C5J|9nuih{mhXD5unv)7NKlUc#O-tH&l#n2kLE^gOspG@m3FV!8po9nM9yRYN6 zzRzs{uzo$c^}RpV`MJ2XvoswT%K88MQL>7fK}#A)=$Pvk6`fvh6hnxfcY3IWb+tZl z&Cbyi&b;+X+Ym|3XL4jjCa*I;i^~k5!?W*@LZp1E?g}0sfnk zKpuYvq%b!(cKlC_YIc$MH=n9HFX~ciK0N33t{*_<6FBV&1bjSS_7;)co}YnYWr-?G z`v#lo%Efn!FSmgrqL)rD^2kY>c39*@p=A5_$jVIKRa0MIpWrHq_s7#CFjxyGYVpb; zRB{CRv&@Wz#!`62%9@Qrz$3WeDtVYUGiIe&Yh>n*($8V>{w~T45<`-Y>(@*$3{>bbie#dL<(wfddVpUdDPYtvWp z3US1eue0c$)D?W>FbKUYLk8EG%!QUR7igH@%7fAbj&r^(K!eocT#m}9)>(Sp ztpA$iT{+}6sQgN9WDuD~VgEwHoNLz#;7ux%25hhlvppcGAefI&7g)eMIsp!>E^`gy+ZN*Au9lQ|rQ)@yIsvg`J5Ub+nMB$6Z?kf5ksz@U{Fj z+>mcR)Q~wji^bcJmKomgbN8E>11&&qrBb?GKt?psmSjH}jDn$soBmt8sB~SXS^w|s z@zB{N;(hG0a*_ds4umI(tC$B3=~bC%d0Fffr5A4EiU5DKlcO8(tS$fkK;M?s5W}U2 z|Jqbt{RSCfe8v^k)EI3LdKx=(k5fMraoINyzGXJHOMX%`w&qg5PzActv6E~0&Y%f6 z({BCjIE8J(zDLrROfbC+rzzfDsou`c>N6CT%aNiBrHJ9Y&GEhwzf*dq7(T2nps$2o zk2XVc*f=kSPFTz!Pj||0kYnT`xC{daPO@Y>F&w~#BVA>DW=^7u zgL;ImR@IhEfd`rT=0Rusz~39ZFQW!c&d!#U?~!8O0>UT%bxERNq`jGwtJEq&0 z5s5*gBW9$zuWRipC^#9PjplI7xKEqTZ^(aQ%H3zM`;COQtYjOvgd<*oN~w2^C`)@F ze&@(>9HZoF-Mdh3aE($95_Ce*iuFtL6-|yY8@Xb7y%_Je`K4z|)GxE4hd>Uw%K7?S zs}V?Ibm5Ipm6C^H)C4xm;&l8|Zyxw#O0(8i;Pw-=uk6K@u^;<+>seuDmiN4NJ)=Xv zK7^6Zz3 zNf<@=-Ir-)SR&MZ_---oOMfa=aIWN(Ohvk4@0b=*2PuBrb@L$v+u6D@{LYu#pv`HW>)ByW7z)^OA0p*aAL5F;~x$t&>=^pkhG1j~=2@V%BZ3=He9C z1l5W_B;C5hj>|G@Pw2q9Suj?E+y9hKnBo`I)0?n3r#N60^_jQ8#2#EfO_UlwEo=6l=0-StO$Q?;M~kKZ4GL{Ne>Q%a^*v_6%j;uf zx(jTS>{G{15WWtWI0$NY!no4f-c1!?;7(e#{Y*64f%(~F;UJ$G1Rr7&Z1YupM%EuWDBqeEr;Wnt~jyY7dZ_Co=p)#CS$KUAaAq47P z+{2`J!%w$q4Ex|who3cJwxX`LeP!u#*(VNyRw&`AYe z4P>8Bz$4;=WYbi3+X`ucT}K1O8aKA(ku?J9WQfWn&^3Eh5V$n>8UF?N8uEJqd@uS1 zql{)Mc{g@#7+Bt49R=WiT-o_O*L^Mb@!-`K4hua3MsH&lq*CA=azdZBeGB~vSnl0E zU!CaiiBW|qI8qi*NB6`RcpPrNT|nPhkxJ~JPeoQ{foiDW=ll2B=cj04dy5jP(XANN zE;)`*S2u*IKAv8XRtVasZuS93DWefVcNVzCYlCM6VF9TPJHthX%lmL6|I~I&5CSoJ zJpBGNN>i71b#pH(Dy=iGjS(LY-(b)@)4=v*Tno$CqoHs{Zzb4xEDUklTypqd&vTF3q2uspcO`dSo2XtGytC zUxjEg%hU5tWe~EovSUowH<`^8jm2D8!(2wInJw7oD!TJBkbjp@LhWhJXH*Qt=q~FA zNCpEFEZMy8|wGx;#1#C?dkE?db~<2{=zfL z>Gas>k;^%4PXP0WA}RePXop#o=BW{P3q`+gaps7E!7yd6q0o?eexG*U;b3 zJtXCVe`E1w&&w;W!Lq)iH(sHz7~P#MWN0v<@3o#u>h+;i4`{$!2l*`I*$495G?;J; z@I?SRqv>FabcB|$j8(DREB;R21~r8TVJxzzb|3F&j0~E_o4qP z!&R{SP)I8p^=^XXJ*RHO*C17oeQdRgPBQbh72_`{dFe0Nh+NAvW9SurS&xG;LGUxd z_5gPwQn#x!OTeS5&O>xk7MgKN+`R)Lgx~wWf8&35F=!j;{R>x1pIO8>n&>GSg1H!2 zPVH4gBbEK>r2y=qF$y!NZ+2wpN)WeNpZo`qSQ}QdJROK|GmlJGseMMA#M9I~o$Jk% z#5|?=HZ|;4XV=*D*DKqPI)Y95(3@BlU&}G*2wk(IH{a7YU&r@pjDlacNb>?Zr?;|e zXz-fL^efLhpm%oPSACyp-**NZU0@I02yWct)7f^NPwKof7gqlBy{b#Oe76L_8M02i zNlLxjuY^3@8myS>S@+ajKa5uvri_`L`W>5spDZ>l`k#tOKvoQcZJohIZPfMlW*B)D(&>>ghw~*(XeKLzV`U+~=Q56AbfRBDUVZP~ zins{MIoe{`N^7}8(2@ld&-Wl)u`$?3G|3gVkg2nT=YbH#e+RK1o9bMl;L5R zGvCdEz>{hyy;CyJ*sP1|vTx0Fc~!Ul?5 zuynHW`2L$n)Ty314YSOZA8r8v7j7Drr-vW|dFXG+!s{Be&otl)9~&xDErxde^Q8XY zgr&)mmrw?eJrc~Lw6>&ba*>K&6zq7#K>)Q=ZiDq@4%+#~=t4z#wnbK}124T(xTIv> z!AtiBP)`gl{4@jmy_PO6UEtr4i9(M*xr`2)ac%!fzN*fz5sdg4R~0(ZqbdQXdZaC7 zY~!5mzL5Q6PRW8aTFA*enu>ZXK^YX3i?n3eafVT_Jqe(7T0}6+W8b{EzR62$_Jf=p zM_MQLa}uUXoJjre%Urxs{hB^48XTSK+AY;pB3TS9etS7>5I-d1X#@5TRjMbDE;Iy1 zuE0#!giT1aLMzyeN$7dk=%joxC`WI`h)gp>l~RI9_f~IoG20e%l5{@47hWdIoeGN| z$HE;?O8aReHCs^N)4c)v%@Jf1R83}GC?OvD`-BKWLtGQ(wH4;vW0lk0^5H_*%c%J_a#Ras(lIY09xIv&)6?@Q$#}KC4YEqA9#IW3kn&i*a$4zauGIcf;nv+435?$;Gq5D z>RlUs&S_(oY$=4;5*h}4e*$ES`6S?6yp6)$N&q2af@lc0wNMtF^dP$iAD?~Dj3&v~ zSM=Www1xuK=uz8Wa)jdbrFK7*=6(k(Swf4`Ks(l>a0k;PHCNRqvKh(qGa;xe;ivZV z!J3@IAo3!UoCbTR$77o4l_MW+0;9B!q3TjeW>}pxA`UIp}oyFLQF)^IS~XLK+#w<8tRtvC|_S za0N7IL{SbL8oH^uYFkusCZS9Fea3~zzC=}J9^ZUD-5_d)-M%iEN+K{TbC(@VQXY?g zon_y_j0>4BGWh<{{REH4PQSdpoR%fCw@qaLBXX#bIFlhN;u^HAKx`A0?%wh_MH{J_ zX=#~GL_w>(gPz@sX9g0 zldi9^gN7tVi!py9DTi0meN>wfCMk~!T5T6Pt4Ap;@(xPvs`n40Od7c#?J$5ud$l=A z^NdqBp)wD{tn7Iwk%&q;^MUn6iy?NUw

d>w;htF%<{jaoL#gG~ST~xzu1&C+M(4 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 z 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Ⓢ*!~tXR3@g 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 z

d~e1+2fR66`}bSW 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 + 14.0 + Native + $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) + + + + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + true + Unicode + + + Application + v142 + true + Unicode + + + Application + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(Console_SdkLibPath);$(LibraryPath) + $(Console_SdkIncludeRoot);$(IncludePath) + $(PlayFabServicesOutDirRoot)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(PlayFabServicesIntDirRoot)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + true + TestClientApp + + + true + TestClientApp + + + true + TestClientApp + + + + $(PlayFabCoreExternalDir)\rapidjson\include;$(PlayFabServicesManualTestDir);$(PlayFabServicesSourceDir)\source;$(PlayFabServicesSourceDir)\source\Common;%(AdditionalIncludeDirectories) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + Level4 + true + true + true + /Zc:__cplusplus %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;PROFILE;%(PreprocessorDefinitions) + Level4 + true + true + true + /Zc:__cplusplus %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;PROFILE;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;PROFILE;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + Windows + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + TestAppPch.h + Use + false + Level4 + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + true + /Zc:__cplusplus %(AdditionalOptions) + + + + + Windows + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + TestAppPch.h + Use + false + Level4 + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + true + /bigobj %(AdditionalOptions) + + + + + Windows + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + TestAppPch.h + Use + false + Level4 + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + true + /bigobj %(AdditionalOptions) + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + + + true + + + + + + + + xcopy /Y /I /E "$(PlayFabServicesManualTestDir)\GDK\Assets\*.*" "$(OutDir)Assets" & + xcopy /Y /I /E "$(PlayFabCoreOutDirRoot)Gaming.Desktop.x64\$(Configuration)\$(PlayFabCoreProjectName)\$(PlayFabCoreProjectName).*" "$(OutDir)" & + xcopy /Y /I /E "$(PlayFabServicesOutDirRoot)Gaming.Desktop.x64\$(Configuration)\$(PlayFabServicesProjectName)\$(PlayFabServicesProjectName).*" "$(OutDir)" + + + \ No newline at end of file diff --git a/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestApp.Gdk.vcxproj.filters b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestApp.Gdk.vcxproj.filters new file mode 100644 index 0000000..b596845 --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestApp.Gdk.vcxproj.filters @@ -0,0 +1,109 @@ + + + + + + + + {e1cede1c-80c0-4234-ae6c-499f10b1c3b0} + + + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + source\GDK + + + source\GDK + + + source\GDK + + + source\TestFramework + + + source\GDK + + + + source\TestFramework + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + source\GDK + + + + + source\TestFramework + + + source\GDK + + + + source\TestFramework + + + \ No newline at end of file diff --git a/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.sln b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.sln new file mode 100644 index 0000000..34e1f1e --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.sln @@ -0,0 +1,52 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33213.308 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PlayFabServicesManualTestAppViaGDKBinary.Gdk", "PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj", "{65D3FC89-73DE-4902-B232-A9DB945CCD1D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + 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 + 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 + 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 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Desktop.x64.ActiveCfg = Debug|Gaming.Desktop.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Desktop.x64.Build.0 = Debug|Gaming.Desktop.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Xbox.Scarlett.x64.ActiveCfg = Debug|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Xbox.Scarlett.x64.Build.0 = Debug|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Xbox.Scarlett.x64.Deploy.0 = Debug|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Xbox.XboxOne.x64.ActiveCfg = Debug|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Xbox.XboxOne.x64.Build.0 = Debug|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Debug|Gaming.Xbox.XboxOne.x64.Deploy.0 = Debug|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Desktop.x64.ActiveCfg = Profile|Gaming.Desktop.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Desktop.x64.Build.0 = Profile|Gaming.Desktop.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Xbox.Scarlett.x64.ActiveCfg = Profile|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Xbox.Scarlett.x64.Build.0 = Profile|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Xbox.Scarlett.x64.Deploy.0 = Profile|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Xbox.XboxOne.x64.ActiveCfg = Profile|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Xbox.XboxOne.x64.Build.0 = Profile|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Profile|Gaming.Xbox.XboxOne.x64.Deploy.0 = Profile|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Desktop.x64.ActiveCfg = Release|Gaming.Desktop.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Desktop.x64.Build.0 = Release|Gaming.Desktop.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Xbox.Scarlett.x64.ActiveCfg = Release|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Xbox.Scarlett.x64.Build.0 = Release|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Xbox.Scarlett.x64.Deploy.0 = Release|Gaming.Xbox.Scarlett.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Xbox.XboxOne.x64.ActiveCfg = Release|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Xbox.XboxOne.x64.Build.0 = Release|Gaming.Xbox.XboxOne.x64 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D}.Release|Gaming.Xbox.XboxOne.x64.Deploy.0 = Release|Gaming.Xbox.XboxOne.x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FAB8C355-C949-4206-8A2A-B52DA5251CE9} + EndGlobalSection +EndGlobal diff --git a/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj new file mode 100644 index 0000000..b890ccf --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj @@ -0,0 +1,477 @@ + + + + + Debug + Gaming.Xbox.Scarlett.x64 + + + Debug + Gaming.Xbox.XboxOne.x64 + + + Profile + Gaming.Xbox.Scarlett.x64 + + + Profile + Gaming.Xbox.XboxOne.x64 + + + Release + Gaming.Desktop.x64 + + + Profile + Gaming.Desktop.x64 + + + Debug + Gaming.Desktop.x64 + + + Release + Gaming.Xbox.Scarlett.x64 + + + Release + Gaming.Xbox.XboxOne.x64 + + + + Direct3DGame2 + {65D3FC89-73DE-4902-B232-A9DB945CCD1D} + en-US + Win32Proj + + 14.0 + Native + PlayFab.Services.C;Xbox.Services.API.C + $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) + + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + false + true + Unicode + + + Application + v142 + true + Unicode + + + Application + v142 + true + Unicode + + + Application + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(Console_SdkLibPath);$(LibraryPath) + $(Console_SdkIncludeRoot);$(IncludePath) + $(PlayFabServicesOutDirRoot)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + $(PlayFabServicesIntDirRoot)$(Platform)\$(Configuration)\$(MSBuildProjectName)\ + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + false + TestClientApp + + + true + TestClientApp + + + true + TestClientApp + + + true + TestClientApp + + + + $(ProjectDir);%(AdditionalIncludeDirectories) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + Level4 + true + true + true + /Zc:__cplusplus %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;PROFILE;%(PreprocessorDefinitions) + Level4 + true + true + true + /Zc:__cplusplus %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;PROFILE;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + true + Windows + true + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + Use + TestAppPch.h + MaxSpeed + NDEBUG;__WRL_NO_DEFAULT_LIB__;PROFILE;%(PreprocessorDefinitions) + Level4 + true + true + true + /bigobj %(AdditionalOptions) + + + + + Windows + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + TestAppPch.h + Use + false + Level4 + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + true + /Zc:__cplusplus %(AdditionalOptions) + + + + + Windows + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + TestAppPch.h + Use + false + Level4 + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + true + /bigobj %(AdditionalOptions) + + + + + Windows + true + $(Console_Libs);%(AdditionalDependencies) + + + PerMonitorHighDPIAware + + + TestAppPch.h + Use + false + Level4 + Disabled + _DEBUG;__WRL_NO_DEFAULT_LIB__;%(PreprocessorDefinitions) + true + /bigobj %(AdditionalOptions) + + + + + + + + + + + + + + + + + + + + + + Create + + + + + + + + + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + true + true + true + + + + + true + + + + + + + + xcopy /Y /I /E "$(ProjectDir)\GDK\Assets\*.*" "$(OutDir)Assets" + + + \ No newline at end of file diff --git a/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj.filters b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj.filters new file mode 100644 index 0000000..3989fdf --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/PlayFabServicesManualTestAppViaGDKBinary.Gdk.vcxproj.filters @@ -0,0 +1,121 @@ + + + + + {f27882b2-beb4-4e85-93f0-8f33f21a64b7} + + + {fb2beb22-1d16-494a-b5cf-608258bab169} + + + {1e98814f-a9cf-4fbf-af7a-a3c2506663dc} + + + {62c4f8c7-0505-4471-a10c-974a1301c3c5} + + + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\TestFramework + + + Source\GDK + + + Source\TestFramework + + + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\GDK + + + Source\TestFramework + + + Source\GDK + + + Source\GDK + + + Source\TestFramework + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Source\GDK + + + Assets + + + Assets + + + Source\GDK + + + + + Source\GDK + + + \ No newline at end of file diff --git a/Test/PlayFabServicesManualTestApp/TestAppPch.cpp b/Test/PlayFabServicesManualTestApp/TestAppPch.cpp new file mode 100644 index 0000000..bf97efa --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/TestAppPch.cpp @@ -0,0 +1,3 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "TestAppPch.h" \ No newline at end of file diff --git a/Test/PlayFabServicesManualTestApp/TestAppPch.h b/Test/PlayFabServicesManualTestApp/TestAppPch.h new file mode 100644 index 0000000..da88475 --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/TestAppPch.h @@ -0,0 +1,36 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// PlayFab Services include +#include + +// Platform specific includes +#if defined(_GAMING_DESKTOP) +#include +#define WIN32_LEAN_AND_MEAN +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +#include "GDK/GDKPch.h" +#endif diff --git a/Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.cpp b/Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.cpp new file mode 100644 index 0000000..7689fcb --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.cpp @@ -0,0 +1,101 @@ +#include "TestAppPch.h" +#include "HttpMock.h" +#include + +#if _DEBUG +#define ASSERT_SUCCEEDED(hr) do { HRESULT __hrRet = hr; assert(SUCCEEDED(__hrRet)); } while(0, 0) +#else +#define ASSERT_SUCCEEDED(hr) do { HRESULT __hrRet = hr; UNREFERENCED_PARAMETER(__hrRet); } while(0, 0) +#endif + +namespace PlayFab +{ +namespace Test +{ + +HttpMock::HttpMock(const char* method, const char* url, uint32_t statusCode) noexcept +{ + ASSERT_SUCCEEDED(PFHCMockCallCreate(&m_handle)); + ASSERT_SUCCEEDED(PFHCMockAddMock(m_handle, method, url, nullptr, 0)); + ASSERT_SUCCEEDED(PFHCMockResponseSetStatusCode(m_handle, statusCode)); + ASSERT_SUCCEEDED(PFHCMockSetMockMatchedCallback(m_handle, HCMockMatchedCallback, this)); +} + + +HttpMock::~HttpMock() +{ + // avoid race between destruction and callback invocation + std::unique_lock lock{ m_mutex }; + + ASSERT_SUCCEEDED(PFHCMockRemoveMock(m_handle)); +} + +void HttpMock::SetResponseHttpStatus(uint32_t httpStatus) const noexcept +{ + ASSERT_SUCCEEDED(PFHCMockResponseSetStatusCode(m_handle, httpStatus)); +} + +void HttpMock::SetResponseBody(const char* responseBodyString) const noexcept +{ + if (responseBodyString) + { + SetResponseBody((uint8_t*)(responseBodyString), std::strlen(responseBodyString) + 1); + } +} + +void HttpMock::SetResponseBody( + const uint8_t* responseBodyBytes, + size_t responseBodySize +) const noexcept +{ + if (responseBodyBytes && responseBodySize) + { + ASSERT_SUCCEEDED(PFHCMockResponseSetResponseBodyBytes(m_handle, responseBodyBytes, static_cast(responseBodySize))); + } +} + +void HttpMock::ClearReponseBody() const noexcept +{ + // libHttpClient doesn't allow setting body with nullptr, but it does allow size = 0 + uint8_t body{}; + SetResponseBody(&body, 0); +} + +void HttpMock::SetResponseHeaders(const HttpHeaders& responseHeaders) const noexcept +{ + for (const auto& header : responseHeaders) + { + ASSERT_SUCCEEDED(PFHCMockResponseSetHeader(m_handle, header.first.data(), header.second.data())); + } +} + +void HttpMock::SetCallback(Callback callback) noexcept +{ + std::unique_lock lock{ m_mutex }; + m_callback = std::move(callback); +} + +void CALLBACK HttpMock::HCMockMatchedCallback( + _In_ HCMockCallHandle mockHandle, + _In_ const char* /*method*/, + _In_ const char* url, + _In_ const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize, + _In_ void* context +) noexcept +{ + UNREFERENCED_PARAMETER(mockHandle); + auto mock = static_cast(context); + assert(mock->m_handle == mockHandle); + + // avoid race between destruction and callback invocation + std::unique_lock lock{ mock->m_mutex }; + ++mock->m_hitCount; + if (mock->m_callback) + { + mock->m_callback(*mock, url, std::string{ requestBodyBytes, requestBodyBytes + requestBodySize }, mock->m_hitCount); + } +} + +} +} diff --git a/Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.h b/Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.h new file mode 100644 index 0000000..ed50ccb --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/TestFramework/HttpMock.h @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +#pragma once + +#include + +namespace PlayFab +{ +namespace Test +{ + +using HttpHeaders = std::map; + +// RAII wrapper around HCMockCallHandle +class HttpMock +{ +public: + using Callback = std::function; + + HttpMock(_In_ const char* httpMethod, _In_ const char* url, uint32_t statusCode) noexcept; + HttpMock(HttpMock const&) = delete; + HttpMock(HttpMock&&) = delete; + HttpMock& operator=(HttpMock const&) = delete; + HttpMock& operator=(HttpMock&&) = delete; + virtual ~HttpMock(); + + void SetResponseHttpStatus(uint32_t httpStatus) const noexcept; + void SetResponseBody(const char* responseBodyString) const noexcept; + //void SetResponseBody(const rapidjson::Value& responseBodyJson) const noexcept; + void SetResponseBody(const uint8_t* responseBodyBytes, size_t responseBodySize) const noexcept; + void ClearReponseBody() const noexcept; + void SetResponseHeaders(const HttpHeaders& responseHeaders) const noexcept; + void SetCallback(Callback callback) noexcept; + +private: + static void CALLBACK HCMockMatchedCallback( + _In_ PFHCMockCallHandle mockHandle, + _In_ const char* method, + _In_ const char* url, + _In_ const uint8_t* requestBodyBytes, + _In_ uint32_t requestBodySize, + _In_ void* context + ) noexcept; + + std::mutex m_mutex; + PFHCMockCallHandle m_handle{ nullptr }; + Callback m_callback; + uint32_t m_hitCount{ 0 }; +}; + +} +} diff --git a/Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.cpp b/Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.cpp new file mode 100644 index 0000000..e50517e --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.cpp @@ -0,0 +1,1110 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "TestAppPch.h" +#include +#include "TestRunner.h" +#include "../GDK/Keyboard.h" + +#include + +#if defined(_GAMING_DESKTOP) +#include +#endif + +using namespace DirectX; +void SetClearColor(float r, float g, float b); + +#define STRINGIZE_DETAIL(x) #x +#define STRINGIZE(x) STRINGIZE_DETAIL(x) +#define THROW_IF_FAILED_LOG(hr) do { HRESULT __hrRet = hr; if (FAILED(__hrRet)) { \ + SetClearColor(1.0f, 0.0f, 0.0f);\ + Tracer::AddLog(LOG_TYPE::Important, __FILE__);\ + Tracer::AddLog(LOG_TYPE::Important, STRINGIZE(__LINE__));\ + Tracer::AddLog(LOG_TYPE::Important, "FAILURE: 0x%0.8x", __hrRet); throw std::exception(); \ +}} while (0, 0) + +#if HC_PLATFORM != HC_PLATFORM_GDK +void SetClearColor(float r, float g, float b) +{ +} +#endif + +// private debug functions. only defined with _DEBUG +#if _DEBUG +//extern "C" __declspec(dllimport) void PFDebugSetTokenRefreshDebugState(bool expireToken); +//extern "C" __declspec(dllimport) void PFDebugSetSetInterval(uint32_t interval); +#endif + +namespace PlayFab +{ +namespace Test +{ + +void WriteLogToFile(const char* strIn, const char* strFileName, bool firstLogLine = false); + +enum class LOG_TYPE +{ + Important, + Verbose +}; + +struct Tracer +{ + Tracer(); + ~Tracer(); + + static void AddLog(LOG_TYPE logType, _In_z_ _Printf_format_string_ const char* format, ...); + static void CALLBACK PFHCTraceCallback(_In_z_ const char* areaName, _In_ PFHCTraceLevel level, _In_ uint64_t threadId, _In_ uint64_t timestamp, _In_z_ const char* message); + + std::mutex mutex; +}; + +Tracer* g_tracer{ nullptr }; +TestRunner* g_testRunner{ nullptr }; + +void TestRunner::Initialize() +{ + g_testRunner = this; + + // Init tracing. Not destroyed until shutdown + if (!g_tracer) + { + g_tracer = std::make_unique().release(); + } + + m_keyboard = std::make_unique(); + + WriteLogToFile("Starting new run\r\n", "PFTestAppEventsLog.txt", true); + WriteLogToFile("Starting new run\r\n", "PFTestAppSummary.txt", true); + Tracer::AddLog(LOG_TYPE::Important, "1) XUserAddAsync"); + Tracer::AddLog(LOG_TYPE::Important, "2) PFInitialize / PFServiceConfigCreateHandle"); + Tracer::AddLog(LOG_TYPE::Important, "3) PFAuthenticationLoginWithXUserAsync"); + Tracer::AddLog(LOG_TYPE::Important, "4) PFTitleDataManagementClientGetTimeAsync / PFDataGetFilesAsync"); + Tracer::AddLog(LOG_TYPE::Important, "A) Async call of PFAuthenticationLoginWithXUserAsync"); + Tracer::AddLog(LOG_TYPE::Important, "B) Async call of PFTitleDataManagementClientGetTimeAsync / PFDataGetFilesAsync"); + Tracer::AddLog(LOG_TYPE::Important, "C) PFAuthenticationLoginWithXboxAsync (use instead of #4)"); + Tracer::AddLog(LOG_TYPE::Important, "D) XblInitialize (not needed)"); + Tracer::AddLog(LOG_TYPE::Important, "T) Allow offline errors"); + Tracer::AddLog(LOG_TYPE::Important, "X) Force token expire"); + Tracer::AddLog(LOG_TYPE::Important, "Z) Force 404 on all calls"); + Tracer::AddLog(LOG_TYPE::Important, "Ctrl+#) Cleanup that step"); +} + +bool TestRunner::Update() +{ + auto kb = m_keyboard->GetState(); + m_keyboardButtons.Update(kb); + + bool isControlPressed = kb.LeftControl || kb.RightControl; + + if (WasPressed(Keyboard::Keys::Escape)) + { + return true; + } + + if (WasPressed(Keyboard::Keys::D)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step D)"); + InitXBL(isControlPressed); + } + + if (WasPressed(Keyboard::Keys::D1)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step 1)"); + SigninWithXUser(isControlPressed); + } + + if (WasPressed(Keyboard::Keys::D2)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step 2)"); + InitPlayFab(isControlPressed); + } + + if (WasPressed(Keyboard::Keys::D3)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step 3)"); + LoginToPFWithXUser(isControlPressed); + } + + if (WasPressed(Keyboard::Keys::D4) && !isControlPressed) + { + Tracer::AddLog(LOG_TYPE::Important, "Step 4)"); + CallPFGetTime(); + CallPFGetFiles(); + } + + if (WasPressed(Keyboard::Keys::D5)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step 5) PFEventPipelineCreateTelemetry"); + CallPFEventPipelineCreate(isControlPressed, true, true); + } + + if (WasPressed(Keyboard::Keys::A)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step A)"); + LoginToPFWithXUserAsync(isControlPressed); + } + + if (WasPressed(Keyboard::Keys::B) && !isControlPressed) + { + Tracer::AddLog(LOG_TYPE::Important, "Step B)"); + CallPFGetTimeAsync(); + CallPFGetFilesAsync(); + } + +#if HC_PLATFORM != HC_PLATFORM_GDK + if (WasPressed(Keyboard::Keys::C)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step C)"); + LoginToPFWithXToken(isControlPressed); + } +#endif + + if (WasPressed(Keyboard::Keys::T)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step T)"); + m_offlineTesting = !m_offlineTesting; + Tracer::AddLog(LOG_TYPE::Important, (m_offlineTesting) ? "Allowing offline errors" : "Disabled allowing offline errors"); + } + +#if _DEBUG + if (WasPressed(Keyboard::Keys::X)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step X) Force token expire"); + //PFDebugSetTokenRefreshDebugState(true); + //PFDebugSetSetInterval(1000 * 30); // 30 seconds + } +#endif + + if (WasPressed(Keyboard::Keys::Z)) + { + Tracer::AddLog(LOG_TYPE::Important, "Step Z)"); + if (!m_pfInit) + { + Tracer::AddLog(LOG_TYPE::Important, "Call PFInit step first"); + } + else + { + m_offlineTesting = true; + m_mock = std::make_shared("POST", nullptr, 404); + Tracer::AddLog(LOG_TYPE::Important, "404 mocks setup"); + } + } + + m_keyboardButtonsLast = m_keyboardButtons; + + return false; +} + +void TestRunner::CallPFGetFilesAsync() +{ + auto async = std::make_unique(); + async->callback = [](XAsyncBlock* async) + { + std::unique_ptr asyncBlockPtr{ async }; // take ownership of XAsyncBlock + + size_t resultSize; + HRESULT hr = PFDataGetFilesGetResultSize(async, &resultSize); + if (SUCCEEDED(hr)) + { + std::vector getFilesResultBuffer(resultSize); + PFDataGetFilesResponse* getFilesResponseResult{ nullptr }; + PFDataGetFilesGetResult(async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr); + + Tracer::AddLog(LOG_TYPE::Important, "GetFiles metadataCount: %d", getFilesResponseResult->metadataCount); + } + }; + + PFDataGetFilesRequest requestFiles{}; + requestFiles.entity = m_pEntityKey; + HRESULT hr = PFDataGetFilesAsync(m_entityHandle, &requestFiles, async.get()); + if (SUCCEEDED(hr)) + { + async.release(); // at this point, the callback will be called so release the unique ptr + } + Tracer::AddLog(LOG_TYPE::Important, "PFDataGetFilesAsync"); +} + +void TestRunner::CallPFGetTimeAsync() +{ + // Async version of calling PFTitleDataManagementClientGetTimeAsync / PFDataGetFilesAsync + + auto async = std::make_unique(); + async->callback = [](XAsyncBlock* async) + { + std::unique_ptr asyncBlockPtr{ async }; // take ownership of XAsyncBlock + + PFTitleDataManagementGetTimeResult result{}; + HRESULT hr = PFTitleDataManagementClientGetTimeGetResult(async, &result); + if (SUCCEEDED(hr)) + { + char timeFormatted[256] = {}; + struct tm time; + localtime_s(&time, &result.time); + strftime(timeFormatted, sizeof(timeFormatted), "%a %Y-%m-%d %H:%M:%S %Z", &time); + Tracer::AddLog(LOG_TYPE::Important, "Server time: %s", timeFormatted); + + const time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + localtime_s(&time, &now); + strftime(timeFormatted, sizeof(timeFormatted), "%a %Y-%m-%d %H:%M:%S %Z", &time); + Tracer::AddLog(LOG_TYPE::Important, "Local time: %s", timeFormatted); + } + }; + + HRESULT hr = PFTitleDataManagementClientGetTimeAsync(m_entityHandle, async.get()); + if (SUCCEEDED(hr)) + { + async.release(); // at this point, the callback will be called so release the unique ptr + } + Tracer::AddLog(LOG_TYPE::Important, "PFTitleDataManagementClientGetTimeAsync"); +} + +void TestRunner::LoginToPFWithXUserAsync(bool isControlPressed) +{ + if (!isControlPressed) + { + // Async version of calling PFAuthenticationLoginWithXUserAsync + PFAuthenticationLoginWithXUserRequest request{}; + request.createAccount = true; + request.user = m_userHandle1; + + struct LoginWithXUserContext + { + TestRunner* pThis; // better if this is a shared ptr to avoid cleanup race condition + }; + + auto async = std::make_unique(); + auto context = std::make_unique(); + context->pThis = this; + async->context = context.get(); + async->callback = [](XAsyncBlock* async) + { + std::unique_ptr asyncBlockPtr{ async }; // take ownership of XAsyncBlock + std::unique_ptr contextPtr{ static_cast(async->context) }; // take ownership of context ptr + auto pThis = contextPtr->pThis; + + std::vector loginResultBuffer; + PFAuthenticationLoginResult const* loginResult; + size_t bufferSize; + HRESULT hr = PFAuthenticationLoginWithXUserGetResultSize(async, &bufferSize); + THROW_IF_FAILED_LOG(hr); + if (SUCCEEDED(hr)) + { + loginResultBuffer.resize(bufferSize); + hr = PFAuthenticationLoginWithXUserGetResult(async, &pThis->m_entityHandle, loginResultBuffer.size(), loginResultBuffer.data(), &loginResult, nullptr); + THROW_IF_FAILED_LOG(hr); + Tracer::AddLog(LOG_TYPE::Important, "PFAuthenticationLoginWithXUserGetResult"); + } + + size_t size{}; + hr = PFEntityGetEntityKeySize(pThis->m_entityHandle, &size); + if (SUCCEEDED(hr)) + { + pThis->m_entityHandleBuffer.resize(size); + PFEntityGetEntityKey(pThis->m_entityHandle, pThis->m_entityHandleBuffer.size(), pThis->m_entityHandleBuffer.data(), &pThis->m_pEntityKey, nullptr); + } + THROW_IF_FAILED_LOG(hr); + }; + + HRESULT hr = PFAuthenticationLoginWithXUserAsync(m_serviceConfigHandle, &request, async.get()); + if (SUCCEEDED(hr)) + { + async.release(); // at this point, the callback will be called so release the unique ptr + context.release(); // at this point, the callback will be called so release the unique ptr + } + THROW_IF_FAILED_LOG(hr); + Tracer::AddLog(LOG_TYPE::Important, "PFAuthenticationLoginWithXUserAsync"); + } + else + { + // Cleanup + if (m_entityHandle) + { + PFEntityCloseHandle(m_entityHandle); + m_entityHandle = nullptr; + Tracer::AddLog(LOG_TYPE::Important, "PFEntityCloseHandle"); + } + } +} + +#if HC_PLATFORM != HC_PLATFORM_GDK +void TestRunner::LoginToPFWithXToken(bool isControlPressed) +{ + if (!isControlPressed) + { + XAsyncBlock async1{}; + THROW_IF_FAILED_LOG(XUserGetTokenAndSignatureAsync( + m_userHandle1, + XUserGetTokenAndSignatureOptions::None, + "POST", + "https://playfabapi.com/", + 0, nullptr, + 0, nullptr, + &async1 + )); + Tracer::AddLog(LOG_TYPE::Important, "XUserGetTokenAndSignatureAsync"); + THROW_IF_FAILED_LOG(XAsyncGetStatus(&async1, true)); + size_t bufferSize1; + THROW_IF_FAILED_LOG(XUserGetTokenAndSignatureResultSize(&async1, &bufferSize1)); + std::vector tokenBuffer(bufferSize1); + XUserGetTokenAndSignatureData* getTokenAndSignatureData{ nullptr }; + THROW_IF_FAILED_LOG(XUserGetTokenAndSignatureResult(&async1, tokenBuffer.size(), tokenBuffer.data(), &getTokenAndSignatureData, nullptr)); + Tracer::AddLog(LOG_TYPE::Important, "PFAuthenticationLoginWithXUserGetResult"); + + PFAuthenticationLoginWithXboxRequest request{}; + request.createAccount = true; + std::string xboxToken = getTokenAndSignatureData->token; + request.xboxToken = xboxToken.c_str(); + + XAsyncBlock async{}; + THROW_IF_FAILED_LOG(PFAuthenticationLoginWithXboxAsync(m_serviceConfigHandle, &request, &async)); + Tracer::AddLog(LOG_TYPE::Important, "PFAuthenticationLoginWithXboxAsync"); + THROW_IF_FAILED_LOG(XAsyncGetStatus(&async, true)); + + std::vector loginResultBuffer; + PFAuthenticationLoginResult const* loginResult; + size_t bufferSize; + THROW_IF_FAILED_LOG(PFAuthenticationLoginWithXboxGetResultSize(&async, &bufferSize)); + loginResultBuffer.resize(bufferSize); + THROW_IF_FAILED_LOG(PFAuthenticationLoginWithXboxGetResult(&async, &m_entityHandle, loginResultBuffer.size(), loginResultBuffer.data(), &loginResult, nullptr)); + Tracer::AddLog(LOG_TYPE::Important, "PFAuthenticationLoginWithXboxGetResult"); + + size_t size{}; + THROW_IF_FAILED_LOG(PFEntityGetEntityKeySize(m_entityHandle, &size)); + m_entityHandleBuffer.resize(size); + THROW_IF_FAILED_LOG(PFEntityGetEntityKey(m_entityHandle, m_entityHandleBuffer.size(), m_entityHandleBuffer.data(), &m_pEntityKey, nullptr)); + } + else + { + // Cleanup + if (m_entityHandle) + { + PFEntityCloseHandle(m_entityHandle); + m_entityHandle = nullptr; + Tracer::AddLog(LOG_TYPE::Important, "PFEntityCloseHandle"); + } + } +} +#endif + +void CALLBACK MyPFEventPipelineBatchUploadSucceededEventHandler( + _In_opt_ void* context, + _In_ PFUploadedEvent const* const* eventPipelineUploadedEvents, + _In_ size_t eventPipelineUploadedEventsCount +) +{ + Tracer::AddLog(LOG_TYPE::Important, "PFEventPipeline UploadSucceeded: %d", eventPipelineUploadedEventsCount); + UNREFERENCED_PARAMETER(context); + UNREFERENCED_PARAMETER(eventPipelineUploadedEvents); + UNREFERENCED_PARAMETER(eventPipelineUploadedEventsCount); +} + +void CALLBACK MyPFEventPipelineBatchUploadFailedEventHandler( + _In_opt_ void* context, + _In_ HRESULT translatedUploadError, + _In_ const char* errorMessage, + _In_ PFEvent const* const* failedEvents, + _In_ size_t failedEventsCount +) +{ + Tracer::AddLog(LOG_TYPE::Important, "PFEventPipeline UploadFailed: %s", errorMessage); + UNREFERENCED_PARAMETER(context); + UNREFERENCED_PARAMETER(translatedUploadError); + UNREFERENCED_PARAMETER(errorMessage); + UNREFERENCED_PARAMETER(failedEvents); + UNREFERENCED_PARAMETER(failedEventsCount); +} + +void TestRunner::CallPFEventPipelineCreate(bool isControlPressed, bool createTelemetryPipeline, bool useKey) +{ + if (!isControlPressed) + { + if (m_eventPipelineHandle == nullptr) + { + if (createTelemetryPipeline) + { + if (useKey) + { + PFEventPipelineTelemetryKeyConfig key = {}; + key.serviceConfigHandle = m_serviceConfigHandle; + key.telemetryKey = "1234"; // expected: invalid key error during upload + + Tracer::AddLog(LOG_TYPE::Important, "PFEventPipeline Create TelemetryPipeline With Key"); + THROW_IF_FAILED_LOG(PFEventPipelineCreateTelemetryPipelineHandleWithKey( + &key, + nullptr, + MyPFEventPipelineBatchUploadSucceededEventHandler, + MyPFEventPipelineBatchUploadFailedEventHandler, + nullptr, + &m_eventPipelineHandle)); + } + else + { + Tracer::AddLog(LOG_TYPE::Important, "PFEventPipeline Create TelemetryPipeline With Entity"); + THROW_IF_FAILED_LOG(PFEventPipelineCreateTelemetryPipelineHandleWithEntity( + m_entityHandle, + nullptr, + MyPFEventPipelineBatchUploadSucceededEventHandler, + MyPFEventPipelineBatchUploadFailedEventHandler, + nullptr, + &m_eventPipelineHandle)); + } + } + else + { + Tracer::AddLog(LOG_TYPE::Important, "PFEventPipeline Create PlayStreamPipeline"); + THROW_IF_FAILED_LOG(PFEventPipelineCreatePlayStreamPipelineHandle( + m_entityHandle, + nullptr, + MyPFEventPipelineBatchUploadSucceededEventHandler, + MyPFEventPipelineBatchUploadFailedEventHandler, + nullptr, + &m_eventPipelineHandle)); + } + } + + PFEvent e = {}; + e.eventNamespace = "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests"; + e.name = "eventName"; + e.clientId = nullptr; + e.payloadJson = "{\"Test\": 12}"; + + THROW_IF_FAILED_LOG(PFEventPipelineEmitEvent(m_eventPipelineHandle, &e)); + e.name = "eventName2"; + THROW_IF_FAILED_LOG(PFEventPipelineEmitEvent(m_eventPipelineHandle, &e)); + } + else + { + PFEventPipelineCloseHandle(m_eventPipelineHandle); + m_eventPipelineHandle = nullptr; + Tracer::AddLog(LOG_TYPE::Important, "PFEventPipeline handle closed"); + } +} + +void TestRunner::CallPFGetFiles() +{ + XAsyncBlock async{}; + PFDataGetFilesRequest requestFiles{}; + requestFiles.entity = m_pEntityKey; + THROW_IF_FAILED_LOG(PFDataGetFilesAsync(m_entityHandle, &requestFiles, &async)); + HRESULT hr1 = XAsyncGetStatus(&async, true); + + size_t resultSize; + HRESULT hr2 = PFDataGetFilesGetResultSize(&async, &resultSize); + std::vector getFilesResultBuffer(resultSize); + PFDataGetFilesResponse* getFilesResponseResult{ nullptr }; + HRESULT hr3 = PFDataGetFilesGetResult(&async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr); + + if (m_offlineTesting) + { + bool offlineErrors = + (hr1 == HTTP_E_STATUS_NOT_FOUND || hr2 == HTTP_E_STATUS_NOT_FOUND || hr3 == HTTP_E_STATUS_NOT_FOUND || + hr1 == HTTP_E_STATUS_UNEXPECTED || hr2 == HTTP_E_STATUS_UNEXPECTED || hr3 == HTTP_E_STATUS_UNEXPECTED); + if (offlineErrors) + { + Tracer::AddLog(LOG_TYPE::Important, "Got expected offline failures. HTTP_E_STATUS_NOT_FOUND"); + return; + } + } + THROW_IF_FAILED_LOG(hr1); + THROW_IF_FAILED_LOG(hr2); + THROW_IF_FAILED_LOG(hr3); + + Tracer::AddLog(LOG_TYPE::Important, "GetFiles metadataCount: %d", getFilesResponseResult->metadataCount); + m_blueColor += 0.25f; + m_greenColor += 0.25f; + SetClearColor(0.0f, m_greenColor, m_blueColor); +} + +void TestRunner::CallPFGetTime() +{ + XAsyncBlock async{}; + THROW_IF_FAILED_LOG(PFTitleDataManagementClientGetTimeAsync(m_entityHandle, &async)); + Tracer::AddLog(LOG_TYPE::Important, "PFTitleDataManagementClientGetTimeAsync"); + HRESULT hr1 = XAsyncGetStatus(&async, true); + + PFTitleDataManagementGetTimeResult result{}; + HRESULT hr2 = PFTitleDataManagementClientGetTimeGetResult(&async, &result); + + if (m_offlineTesting) + { + bool offlineErrors = + (hr1 == HTTP_E_STATUS_NOT_FOUND || hr2 == HTTP_E_STATUS_NOT_FOUND || + hr1 == HTTP_E_STATUS_UNEXPECTED || hr2 == HTTP_E_STATUS_UNEXPECTED); + + if (offlineErrors) + { + Tracer::AddLog(LOG_TYPE::Important, "Got expected offline failures. HTTP_E_STATUS_NOT_FOUND"); + return; + } + } + THROW_IF_FAILED_LOG(hr1); + THROW_IF_FAILED_LOG(hr2); + + char timeFormatted[256] = {}; + struct tm time; + localtime_s(&time, &result.time); + strftime(timeFormatted, sizeof(timeFormatted), "%a %Y-%m-%d %H:%M:%S %Z", &time); + Tracer::AddLog(LOG_TYPE::Important, "Server time: %s", timeFormatted); + + const time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + localtime_s(&time, &now); + strftime(timeFormatted, sizeof(timeFormatted), "%a %Y-%m-%d %H:%M:%S %Z", &time); + Tracer::AddLog(LOG_TYPE::Important, "Local time: %s", timeFormatted); + + m_blueColor += 0.25f; + SetClearColor(0.0f, 0.0f, m_blueColor); +} + +void TestRunner::LoginToPFWithXUser(bool isControlPressed) +{ + if (!isControlPressed) + { + PFAuthenticationLoginWithXUserRequest request{}; + request.createAccount = true; + request.user = m_userHandle1; + + XAsyncBlock async{}; + THROW_IF_FAILED_LOG(PFAuthenticationLoginWithXUserAsync(m_serviceConfigHandle, &request, &async)); + Tracer::AddLog(LOG_TYPE::Important, "PFAuthenticationLoginWithXUserAsync"); + HRESULT hr1 = XAsyncGetStatus(&async, true); + + std::vector loginResultBuffer; + PFAuthenticationLoginResult const* loginResult; + size_t bufferSize{ 0 }; + HRESULT hr2 = PFAuthenticationLoginWithXUserGetResultSize(&async, &bufferSize); + HRESULT hr3 = S_OK; + if (SUCCEEDED(hr2)) + { + loginResultBuffer.resize(bufferSize); + hr3 = PFAuthenticationLoginWithXUserGetResult(&async, &m_entityHandle, loginResultBuffer.size(), loginResultBuffer.data(), &loginResult, nullptr); + Tracer::AddLog(LOG_TYPE::Important, "PFAuthenticationLoginWithXUserGetResult"); + } + + if (m_offlineTesting) + { + bool offlineErrors = + (hr1 == HTTP_E_STATUS_NOT_FOUND || hr2 == HTTP_E_STATUS_NOT_FOUND || + hr1 == HTTP_E_STATUS_UNEXPECTED || hr2 == HTTP_E_STATUS_UNEXPECTED); + if (offlineErrors) + { + Tracer::AddLog(LOG_TYPE::Important, "Got expected offline failures. HTTP_E_STATUS_NOT_FOUND"); + return; + } + } + THROW_IF_FAILED_LOG(hr1); + THROW_IF_FAILED_LOG(hr2); + THROW_IF_FAILED_LOG(hr3); + + size_t size{}; + THROW_IF_FAILED_LOG(PFEntityGetEntityKeySize(m_entityHandle, &size)); + m_entityHandleBuffer.resize(size); + THROW_IF_FAILED_LOG(PFEntityGetEntityKey(m_entityHandle, m_entityHandleBuffer.size(), m_entityHandleBuffer.data(), &m_pEntityKey, nullptr)); + + m_blueColor += 0.25f; + SetClearColor(0.0f, 0.0f, m_blueColor); + } + else + { + // Cleanup + if (m_entityHandle) + { + PFEntityCloseHandle(m_entityHandle); + m_entityHandle = nullptr; + Tracer::AddLog(LOG_TYPE::Important, "PFEntityCloseHandle"); + } + } +} + +void TestRunner::InitPlayFab(bool isControlPressed) +{ + if (!isControlPressed) + { + if (!m_pfInit) + { + m_pfInit = true; + + TestTitleData titleData; + bool loadSuccessful = LoadTitleData(titleData); + UNREFERENCED_PARAMETER(loadSuccessful); + assert(loadSuccessful); + + THROW_IF_FAILED_LOG(PFServicesInitialize(nullptr)); + Tracer::AddLog(LOG_TYPE::Important, "PFServicesInitialize"); + +#if HC_PLATFORM != HC_PLATFORM_GDK + THROW_IF_FAILED_LOG(PFServiceConfigCreateHandle( + titleData.connectionString.data(), + titleData.titleId.data(), + titleData.secretKey.data(), + &m_serviceConfigHandle)); + Tracer::AddLog(LOG_TYPE::Important, "PFServiceConfigCreateHandle"); + + THROW_IF_FAILED_LOG(PFServicesSetServiceConfig(m_serviceConfigHandle)); + Tracer::AddLog(LOG_TYPE::Important, "PFServicesInitialize"); +#else + THROW_IF_FAILED_LOG(PFServiceConfigCreateHandle( + titleData.connectionString.data(), + titleData.titleId.data(), + &m_serviceConfigHandle)); + Tracer::AddLog(LOG_TYPE::Important, "PFServiceConfigCreateHandle"); +#endif + m_blueColor += 0.25f; + SetClearColor(0.0f, 0.0f, m_blueColor); + + HRESULT hr = PFEntityRegisterTokenExpiredEventHandler(nullptr, nullptr, [](void* ctx, PFEntityKey const* entityKey) + { + Tracer::AddLog(LOG_TYPE::Important, "TokenExpiredEventHandler called"); + + UNREFERENCED_PARAMETER(entityKey); + UNREFERENCED_PARAMETER(ctx); + + PFAuthenticationLoginWithXUserRequest request{}; + request.createAccount = true; + request.user = g_testRunner->m_userHandle1; // An XUserHandle obtained from XUserAddAsync + + XAsyncBlock async{}; + Tracer::AddLog(LOG_TYPE::Important, "Calling PFAuthenticationReLoginWithXUserAsync"); + HRESULT hr = PFAuthenticationReLoginWithXUserAsync(g_testRunner->m_entityHandle, &request, &async); // This assumes the entity handle was stored in the game's global state + THROW_IF_FAILED_LOG(hr); + hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage + THROW_IF_FAILED_LOG(hr); + + // After login we could potentially get back a new player entity with a new entity key + PFEntityKey const* pEntityKey{}; + std::vector entityKeyBuffer; + size_t size{}; + hr = PFEntityGetEntityKeySize(g_testRunner->m_entityHandle, &size); // Add your own error handling when FAILED(hr) == true + THROW_IF_FAILED_LOG(hr); + + entityKeyBuffer.resize(size); + hr = PFEntityGetEntityKey(g_testRunner->m_entityHandle, entityKeyBuffer.size(), entityKeyBuffer.data(), &pEntityKey, nullptr); + THROW_IF_FAILED_LOG(hr); + + }, &m_registrationTokenExpired); + THROW_IF_FAILED_LOG(hr); + + hr = PFEntityRegisterTokenRefreshedEventHandler(nullptr, nullptr, [](void* ctx, PFEntityKey const* entityKey, const PFEntityToken* newToken) + { + UNREFERENCED_PARAMETER(ctx); + UNREFERENCED_PARAMETER(entityKey); + UNREFERENCED_PARAMETER(newToken); + Tracer::AddLog(LOG_TYPE::Important, "TokenRefreshedEventHandler called"); + + // Perform any logging or other desired actions on token refresh + }, &m_registrationTokenRefreshed); + THROW_IF_FAILED_LOG(hr); + } + } + else + { + // Cleanup + if (m_pfInit) + { + m_pfInit = false; + PFServiceConfigCloseHandle(m_serviceConfigHandle); + m_serviceConfigHandle = nullptr; + Tracer::AddLog(LOG_TYPE::Important, "PFServiceConfigCloseHandle"); + + XAsyncBlock async{}; + THROW_IF_FAILED_LOG(PFServicesUninitializeAsync(&async)); + THROW_IF_FAILED_LOG(XAsyncGetStatus(&async, true)); + Tracer::AddLog(LOG_TYPE::Important, "PFServicesUninitializeAsync"); + } + } +} + +void TestRunner::SigninWithXUser(bool isControlPressed) +{ + if (!isControlPressed) + { + if (m_userHandle1 == nullptr) + { + AddUser(XUserAddOptions::AddDefaultUserSilently); + m_blueColor += 0.25f; + SetClearColor(0.0f, 0.0f, m_blueColor); + Tracer::AddLog(LOG_TYPE::Important, "AddUser done"); + } + else + { + Tracer::AddLog(LOG_TYPE::Important, "Have user"); + } + } + else + { + // Cleanup user + if (m_userHandle1 != nullptr) + { + uint64_t xuid = {}; + THROW_IF_FAILED_LOG(XUserGetId(m_userHandle1, &xuid)); + XUserLocalId userLocalId = {}; + THROW_IF_FAILED_LOG(XUserGetLocalId(m_userHandle1, &userLocalId)); + + Tracer::AddLog(LOG_TYPE::Important, "Closing XUserHandle 0x%0.8x. userLocalId: %ull, xuid: 0x%0.8x", m_userHandle1, userLocalId, xuid); + SetUserHandle(nullptr); + } + else + { + Tracer::AddLog(LOG_TYPE::Important, "cleanup - no user"); + } + } +} + +void TestRunner::InitXBL(bool isControlPressed) +{ + if (!isControlPressed) + { + if (!m_xblInit) + { + m_xblInit = true; + uint32_t titleId = 0; + THROW_IF_FAILED_LOG(XGameGetXboxTitleId(&titleId)); + char scidBuffer[64] = {}; + sprintf_s(scidBuffer, "00000000-0000-0000-0000-0000%08X", titleId); + XblInitArgs xblInit = { nullptr, scidBuffer }; + THROW_IF_FAILED_LOG(XblInitialize(&xblInit)); + Tracer::AddLog(LOG_TYPE::Important, "XblInitialize done"); + } + } + else + { + // Cleanup + if (m_xblInit) + { + m_xblInit = false; + auto async = new XAsyncBlock{}; + THROW_IF_FAILED_LOG(XblCleanupAsync(async)); + Tracer::AddLog(LOG_TYPE::Important, "XblCleanupAsync"); + THROW_IF_FAILED_LOG(XAsyncGetStatus(async, true)); + Tracer::AddLog(LOG_TYPE::Important, "XblCleanupAsync done"); + } + else + { + Tracer::AddLog(LOG_TYPE::Important, "Init first"); + } + } +} + +HRESULT TestRunner::AddUser(XUserAddOptions options) +{ + // Attempt to get the default user, i.e. the user who launched the game + auto async = new XAsyncBlock{}; + async->callback = [](XAsyncBlock* async) + { + XUserHandle user = nullptr; + HRESULT result = XUserAddResult(async, &user); + if (SUCCEEDED(result)) + { + // This failure doesn't come up until you try to actually do something with the user + uint64_t xuid = {}; + if (FAILED(result = XUserGetId(user, &xuid))) + { + Tracer::AddLog(LOG_TYPE::Important, "User ResolveUserIssueWithUI 0x%0.8x", result); + //ResolveUserIssueWithUI(user); + } + else + { + XUserLocalId userLocalId = {}; + XUserGetLocalId(user, &userLocalId); + + Tracer::AddLog(LOG_TYPE::Important, "Got XUserHandle 0x%0.8x. userLocalId: %ull, xuid: 0x%0.8x", user, userLocalId.value, xuid); + g_testRunner->SetUserHandle(user); + } + } + else if (result == E_GAMEUSER_RESOLVE_USER_ISSUE_REQUIRED + || result == E_GAMEUSER_NO_DEFAULT_USER + || result == static_cast(0x8015DC12)) + { + Tracer::AddLog(LOG_TYPE::Important, "User SwitchUser 0x%0.8x", result); + g_testRunner->AddUser(XUserAddOptions::AllowGuests); + } + else + { + Tracer::AddLog(LOG_TYPE::Important, "User HandleError 0x%0.8x", result); + //HandleError(result); + } + + delete async; + }; + + HRESULT hr = XUserAddAsync( + options, + async + ); + Tracer::AddLog(LOG_TYPE::Important, "XUserAddAsync 0x%0.8x", hr); + + if (FAILED(hr)) + { + Tracer::AddLog(LOG_TYPE::Important, "Unable to add user!"); + + delete async; + return hr; + } + + return S_OK; +} + +// Run the remainder of the currently executing test, cleanup the active TestClass and then return +bool TestRunner::Cleanup() +{ + if (m_registrationTokenExpired != 0) + { + PFEntityUnregisterTokenExpiredEventHandler(m_registrationTokenExpired); + } + + if (m_registrationTokenRefreshed != 0) + { + PFEntityUnregisterTokenRefreshedEventHandler(m_registrationTokenRefreshed); + } + + if (m_eventPipelineHandle) + { + PFEventPipelineCloseHandle(m_eventPipelineHandle); + m_eventPipelineHandle = nullptr; + } + + if (m_entityHandle) + { + PFEntityCloseHandle(m_entityHandle); + m_entityHandle = nullptr; + Tracer::AddLog(LOG_TYPE::Important, "PFEntityCloseHandle"); + } + + if (m_serviceConfigHandle) + { + PFServiceConfigCloseHandle(m_serviceConfigHandle); + Tracer::AddLog(LOG_TYPE::Important, "PFServiceConfigCloseHandle"); + + XAsyncBlock async{}; + THROW_IF_FAILED_LOG(PFServicesUninitializeAsync(&async)); + XAsyncGetStatus(&async, true); + Tracer::AddLog(LOG_TYPE::Important, "PFServicesUninitializeAsync"); + } + + SetUserHandle(nullptr); + + if (m_xblInit) + { + auto async = new XAsyncBlock{}; + HRESULT hr = XblCleanupAsync(async); + Tracer::AddLog(LOG_TYPE::Important, "XblCleanupAsync 0x%0.8x", hr); + XAsyncGetStatus(async, true); + m_xblInit = false; + } + + return true; +} + +Tracer::Tracer() +{ + PFHCSettingsSetTraceLevel(PFHCTraceLevel::Verbose); + PFHCTraceSetTraceToDebugger(false); + PFHCTraceSetClientCallback(PFHCTraceCallback); +} + +Tracer::~Tracer() +{ + PFHCTraceSetClientCallback(nullptr); +} + +std::string FormatStr(_In_z_ _Printf_format_string_ const char* format, ...) +{ + va_list args; + va_start(args, format); + std::vector buf(1 + std::vsnprintf(NULL, 0, format, args)); + std::vsnprintf(buf.data(), buf.size(), format, args); + va_end(args); + + return buf.data(); +} + +void WriteLogToFile(const char* strIn, const char* strFileName, bool firstLogLine) +{ + HANDLE hFile; + std::string str = strIn; + DWORD dwBytesToWrite = (DWORD)str.length(); + DWORD dwBytesWritten = 0; + BOOL bErrorFlag = FALSE; + + DWORD dwCreationDisposition = OPEN_ALWAYS; + if (firstLogLine) + { + firstLogLine = false; + dwCreationDisposition = CREATE_ALWAYS; // recreate log upon start + } + +#if defined(_GAMING_DESKTOP) + char szPath[MAX_PATH]; + SHGetSpecialFolderPathA(HWND_DESKTOP, szPath, CSIDL_DESKTOP, FALSE); + std::string strFullPath = szPath; +#else + std::string strFullPath = "D:"; +#endif + strFullPath += "\\"; + strFullPath += strFileName; + hFile = CreateFileA(strFullPath.c_str(), FILE_APPEND_DATA, 0, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + { + return; + } + + bErrorFlag = WriteFile( + hFile, // open file handle + str.data(), // start of data to write + dwBytesToWrite, // number of bytes to write + &dwBytesWritten, // number of bytes that were written + NULL); // no overlapped structure + + if (!bErrorFlag && dwBytesWritten != dwBytesToWrite) + { + OutputDebugStringA("Log file error: dwBytesWritten != dwBytesToWrite\n"); + } + + CloseHandle(hFile); +} + +void Tracer::AddLog(LOG_TYPE logType, _In_z_ _Printf_format_string_ const char* format, ...) +{ + va_list args; + va_start(args, format); + std::vector buf(1 + std::vsnprintf(NULL, 0, format, args)); + std::vsnprintf(buf.data(), buf.size(), format, args); + va_end(args); + + SYSTEMTIME st; + GetLocalTime(&st); + char szTime[256]; + sprintf_s(szTime, 255, "[%0.2d/%0.2d %0.2d:%0.2d:%0.2d:%0.4d] ", st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); + + std::string strBuffer = szTime; + strBuffer += buf.data(); + strBuffer += "\r\n"; + + if (g_tracer) + { + std::lock_guard lock{ g_tracer->mutex }; + if (logType == LOG_TYPE::Important) + { + OutputDebugStringA(strBuffer.c_str()); + WriteLogToFile(strBuffer.c_str(), "PFTestAppSummary.txt"); + +#if HC_PLATFORM != HC_PLATFORM_GDK + puts(strBuffer.c_str()); // Write to STDOUT for Win32 +#endif + } + + WriteLogToFile(strBuffer.c_str(), "PFTestAppEventsLog.txt"); + } +} + +void Tracer::PFHCTraceCallback(_In_z_ const char* areaName, _In_ PFHCTraceLevel level, _In_ uint64_t threadId, _In_ uint64_t timestamp, _In_z_ const char* message) +{ + UNREFERENCED_PARAMETER(areaName); + UNREFERENCED_PARAMETER(level); + UNREFERENCED_PARAMETER(threadId); + UNREFERENCED_PARAMETER(timestamp); + + AddLog(LOG_TYPE::Verbose, message); +} + +std::string GetExeDirectory() +{ + char path[MAX_PATH]; + GetModuleFileNameA(NULL, path, MAX_PATH); + std::string::size_type pos = std::string(path).find_last_of("\\/"); + return std::string(path).substr(0, pos); +} + +bool LoadTitleDataJson(std::shared_ptr& testDataJson, size_t& testDataJsonLen) +{ + // Read the title data from the file into the output character array. + std::ifstream titleDataFile; + SetCurrentDirectoryA(GetExeDirectory().c_str()); + + std::ios_base::iostate exceptionMask = titleDataFile.exceptions() | std::ios::failbit; + titleDataFile.exceptions(exceptionMask); + + try + { + titleDataFile.open("testTitleData.json", std::ios::binary | std::ios::in); + } + catch (std::ios_base::failure& e) + { + Tracer::AddLog(LOG_TYPE::Important, "Could not read testTitleData.json: %s", e.what()); + return false; + } + + if (!titleDataFile) + { + return false; + } + + std::streampos begin = titleDataFile.tellg(); + titleDataFile.seekg(0, std::ios::end); + std::streampos end = titleDataFile.tellg(); + testDataJsonLen = static_cast(end - begin); + testDataJson = std::make_shared(new char[testDataJsonLen + 1]); + + titleDataFile.seekg(0, std::ios::beg); + titleDataFile.read(*testDataJson, testDataJsonLen); + (*testDataJson)[testDataJsonLen] = '\0'; + + titleDataFile.close(); + + return true; +} + +std::string GetValueForKey(char* input, std::string searchWord) +{ + char* titleIdPtr = strstr(input, searchWord.c_str()); + titleIdPtr += searchWord.length(); + titleIdPtr = strchr(titleIdPtr, '\"') + 1; + + char szValue[128]; + strncpy_s(szValue, 128, titleIdPtr, 127); + char* end = strchr(szValue, '\"'); + *end = 0; + + return szValue; +} + +bool TestRunner::LoadTitleData(TestTitleData& titleData) +{ + // Load JSON string in a platform-dependent way. + std::shared_ptr titleJsonPtr; + size_t size; + const bool loadedSuccessfully = LoadTitleDataJson(titleJsonPtr, size); + + if (!loadedSuccessfully) + { + return false; + } + + // Not using rapidJson since that header isn't in the exposed by GDK's PlayFab.C + titleData.titleId = GetValueForKey(*titleJsonPtr, "\"titleId\""); + titleData.connectionString = GetValueForKey(*titleJsonPtr, "\"connectionString\""); + titleData.secretKey = GetValueForKey(*titleJsonPtr, "\"secretKey\""); + + return true; +} + +void TestRunner::SetUserHandle(XUserHandle user) +{ + if (m_userHandle1 != nullptr) + { + XUserCloseHandle(m_userHandle1); + } + + m_userHandle1 = user; +} + +bool TestRunner::WasPressed(DirectX::Keyboard::Keys key) +{ + return ((m_keyboardButtons.IsKeyPressed(key) && !m_keyboardButtonsLast.IsKeyPressed(key))); +} + + + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.h b/Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.h new file mode 100644 index 0000000..1570a8a --- /dev/null +++ b/Test/PlayFabServicesManualTestApp/TestFramework/TestRunner.h @@ -0,0 +1,85 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include "../GDK/Keyboard.h" + +#include +#include +#include +#include +#include "HttpMock.h" + +namespace PlayFab +{ +namespace Test +{ + +struct TestTitleData +{ + std::string titleId; + std::string secretKey; + std::string connectionString; +}; + +/// +/// Class the controls execution and flow of a Suite of tests +/// +class TestRunner +{ +public: + TestRunner() = default; + + void Initialize(); + bool Update(); // returns true if testing is complete + + void InitXBL(bool isControlPressed); + void SigninWithXUser(bool isControlPressed); + void InitPlayFab(bool isControlPressed); + void LoginToPFWithXUser(bool isControlPressed); + void LoginToPFWithXUserAsync(bool isControlPressed); + void CallPFGetTime(); + void CallPFGetTimeAsync(); + void CallPFGetFiles(); + void CallPFGetFilesAsync(); + void CallPFEventPipelineCreate(bool isControlPressed, bool createTelemetryPipeline, bool useKey); + +#if HC_PLATFORM != HC_PLATFORM_GDK + void LoginToPFWithXToken(bool isControlPressed); +#endif + + bool Cleanup(); // returns true if all tests passed + +private: + bool LoadTitleData(TestTitleData& titleData); + + // Input devices. + std::unique_ptr m_keyboard; + DirectX::Keyboard::KeyboardStateTracker m_keyboardButtons; + DirectX::Keyboard::KeyboardStateTracker m_keyboardButtonsLast; + + bool m_xblInit{ false }; + bool m_pfInit{ false }; + bool m_bCleanup{ false }; + bool WasPressed(DirectX::Keyboard::Keys key); + float m_blueColor{ 0.0f }; + float m_greenColor{ 0.0f }; + bool m_offlineTesting{ false }; + + XUserHandle m_userHandle1{ nullptr }; + PFServiceConfigHandle m_serviceConfigHandle{ nullptr }; + PFEntityHandle m_entityHandle{ nullptr }; + std::vector m_entityHandleBuffer; + PFEntityKey const* m_pEntityKey{}; + std::shared_ptr m_mock; + PFRegistrationToken m_registrationTokenExpired{ 0 }; + PFRegistrationToken m_registrationTokenRefreshed{ 0 }; + PFEventPipelineHandle m_eventPipelineHandle{ nullptr }; + + HRESULT AddUser(XUserAddOptions options); + void SetUserHandle(XUserHandle user); + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/GDK/Assets/ATGConsoleBlack.DDS b/Test/PlayFabServicesTestApp/GDK/Assets/ATGConsoleBlack.DDS new file mode 100644 index 0000000000000000000000000000000000000000..59dab27d0cbf1c789bb8fcb0371ba4fc1408d2e8 GIT binary patch literal 8294528 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%0D>wl+yc3e=E3(?VcHYW!JiR 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 z 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 Bj^@4WMSHQ*B??9FlP(Tc6DkeEQqX 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%0A;~eewnm6P6|3IJnoZTyJweF|vcPf!l$_ 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

-lh_$)WSV8v6`zxnX$R<$)C&J~n#W;fuMP&$;3^ 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%0D+aBKOEJlx*LLl_uiQhh@4Zfr=E^<1?S38E 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

ly~)j2c%L52q|K9jwf+bw_ToA-^6)@a>uwZ((N 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≠yYDhWCcoCN7M&=D8fJ?8I(iy3KXtJL~A+z`n#};j+KH ze5ThNH{bU>qZn|p*NJ5g8^)^!kyw{_dueh&l ziZ0_^=Nr!DQQ~CHzul(29-JJimjbq>64c-35UgtcoVw%_b z-~27VFk%=j*I#(>eeSpHVZNLDiuHCZ&I(Is8_xQ|Ud4jNS9`8A#cBL(XBfc4L@1eb(w!Kb_HRgQp#e_=_ za}BH2ILsGL+pJe(*|lzXaX4@@UHjwrd1lxw*nIb9#=m5~aN2d5`@&_zfUS?*V|cJf z|2x02D~{T{_l(4X;WiHz&t(sD;jwGIdj&dA8cd?^-@lcuY5>8mB%saojbpSH|xlo0bAa=T)(47j+nep z^PL;+Ir-#sjZAs$$tACxlROnYc`G?@^4`v4o$HbVPbBkT3C zbv-5hs-du@#ya&^*J{XfUA5b($x@p=N7s)Xr+iP{*ma_Kt@X0K;#1G2{xlcP`QKBQ z+6MXPR7)d2S88cwuCEze4+G}vwdJXw&3f}aU9P*S+o{p<^Jr$=^VILsA^W_}d*e^t z>LGhh&+Agx#dhOn^eWy>XzH$53e0XuseTK-rYo9@Co9=zP zmu&s?uv_5do=4UpRDWW8vk(0{H$$b-pHQ5hr|?HMYivu_tkykuNe08y>ovn4tvE; zqvPfLZ}{-sqkQ{k)ZW>nS#sZdem?Qo>=9l0q^>EEAV|=J%p~9n1H!=PTye|3ZfC{{MW>pSoIKe^=a% z94B&eAee2|Jtl8*PURfM44M4RYwJ3n3-|3DZFq0RQ?8eB@!zr8dEMlS{r;eImDax zuld8rT$mg`zOdbz%Lm^xPu-AO!gk*{uj7c>E~XoXJ9SURpL4#lTQyPMqn!~x>^ds< zkn_T-y{Ml$2J2nBvG1D}b}oRRB2e)V$P7dqef)_oxQ zI_RgzRQvWkoLGG$^_9{u+V+n*eXYdm{+HIP7nbk7L#{qpk2yc#9@?Xiwt8>wpLGvT zy|kWV^S3KKy)~*ISZjKU=gcr1m|kbaRA140^&`c8*=y^W|8(8GQQKOU`R2nuFGCNt zVyah5Z1-Jdk4)>+XZ={ikLkV2zx%Y0`LNoN_t~LZOV^|N&CJtxP7j*?a`&g_-y3Y1 z&MPgSW0(FlV`3he&-R-0dcS78wU7QiVC`pCj9zDb;j3`pVX$yk%eH*J4?4QB4�&&`}T;q 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 z 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

`x& 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 (7piJZiO`s}}Uy?}RQp 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

2=>{lMxSYmV=4?OtcV20q3 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

&k_Hy-qYJtuW$Ny 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≪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 z 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

Hm<8`b%)_0+G4mi9rJgj(P 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

5b7SYjt|xwS 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

529m!r6#K3Bf)&l(O% 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 Cn;jbf literal 0 HcmV?d00001 diff --git a/Test/PlayFabServicesTestApp/GDK/Assets/Logo.png b/Test/PlayFabServicesTestApp/GDK/Assets/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac081b39436ce5d5b3a6647eb444d30347b9b99 GIT binary patch literal 54843 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 QR{#J207*qoM6N<$f)3FW9smFU literal 0 HcmV?d00001 diff --git a/Test/PlayFabServicesTestApp/GDK/Assets/Mounted.png b/Test/PlayFabServicesTestApp/GDK/Assets/Mounted.png new file mode 100644 index 0000000000000000000000000000000000000000..4f82b9d98d173ee8c731596b570be85ba0597be2 GIT binary patch literal 3551 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 literal 0 HcmV?d00001 diff --git a/Test/PlayFabServicesTestApp/GDK/Assets/SmallLogo.png b/Test/PlayFabServicesTestApp/GDK/Assets/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..d137e6173c58e49126a4e46ab6c821b9c6fbd422 GIT binary patch literal 30312 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]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 z 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

d>w;htF%<{jaoL#gG~ST~xzu1&C+M(4 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 z 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Ⓢ*!~tXR3@g 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 z

d~e1+2fR66`}bSW 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 + + + + + + + + 7c1adc90 + 9PNSDHLZ793R + 3055cfd9-9bc7-4c70-9f6f-024996499e85 + + + + + + 9000 + + + + \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj b/Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj new file mode 100644 index 0000000..e3e15f1 --- /dev/null +++ b/Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj @@ -0,0 +1,54 @@ + + + + {2298c785-c226-4ed7-8bd6-305c4d73bd1c} + Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document + + + + \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj.filters b/Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj.filters new file mode 100644 index 0000000..80386e2 --- /dev/null +++ b/Test/PlayFabServicesTestApp/GDK/PlayFabServicesTestApp.GDK.vcxproj.filters @@ -0,0 +1,101 @@ + + + + + {cf4b7bcf-0c10-497a-b738-8dfc44d68b44} + + + {46be01a2-d737-4285-9561-14b10fc9a895} + + + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + Assets + + + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + Source + + + + + + + + + \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/GDK/StepTimer.h b/Test/PlayFabServicesTestApp/GDK/StepTimer.h new file mode 100644 index 0000000..24572c5 --- /dev/null +++ b/Test/PlayFabServicesTestApp/GDK/StepTimer.h @@ -0,0 +1,226 @@ +// +// StepTimer.h - A simple timer that provides elapsed time information +// + +#pragma once + +#include +#include +#include + +namespace DX +{ + // Helper class for animation and simulation timing. + class StepTimer + { + public: + StepTimer() noexcept(false) : + m_elapsedTicks(0), + m_totalTicks(0), + m_leftOverTicks(0), + m_frameCount(0), + m_framesPerSecond(0), + m_framesThisSecond(0), + m_qpcSecondCounter(0), + m_isFixedTimeStep(false), + m_targetElapsedTicks(TicksPerSecond / 60) + { + if (!QueryPerformanceFrequency(&m_qpcFrequency)) + { + throw std::exception( "QueryPerformanceFrequency" ); + } + + if (!QueryPerformanceCounter(&m_qpcLastTime)) + { + throw std::exception( "QueryPerformanceCounter" ); + } + + // Initialize max delta to 1/10 of a second. + m_qpcMaxDelta = static_cast(m_qpcFrequency.QuadPart / 10); + } + + // Get elapsed time since the previous Update call. + uint64_t GetElapsedTicks() const + { + return m_elapsedTicks; + } + + double GetElapsedSeconds() const + { + return TicksToSeconds(m_elapsedTicks); + } + + // Get total time since the start of the program. + uint64_t GetTotalTicks() const + { + return m_totalTicks; + } + + double GetTotalSeconds() const + { + return TicksToSeconds(m_totalTicks); + } + + // Get total number of updates since start of the program. + uint32_t GetFrameCount() const + { + return m_frameCount; + } + + // Get the current framerate. + uint32_t GetFramesPerSecond() const + { + return m_framesPerSecond; + } + + // Set whether to use fixed or variable timestep mode. + void SetFixedTimeStep(bool isFixedTimestep) + { + m_isFixedTimeStep = isFixedTimestep; + } + + // Set how often to call Update when in fixed timestep mode. + void SetTargetElapsedTicks(uint64_t targetElapsed) + { + m_targetElapsedTicks = targetElapsed; + } + + void SetTargetElapsedSeconds(double targetElapsed) + { + m_targetElapsedTicks = SecondsToTicks(targetElapsed); + } + + // Integer format represents time using 10,000,000 ticks per second. + static const uint64_t TicksPerSecond = 10000000; + + static double TicksToSeconds(uint64_t ticks) + { + return static_cast(ticks) / TicksPerSecond; + } + + static uint64_t SecondsToTicks(double seconds) + { + return static_cast(seconds * TicksPerSecond); + } + + // After an intentional timing discontinuity (for instance a blocking IO operation) + // call this to avoid having the fixed timestep logic attempt a set of catch-up + // Update calls. + + void ResetElapsedTime() + { + if (!QueryPerformanceCounter(&m_qpcLastTime)) + { + throw std::exception("QueryPerformanceCounter"); + } + + m_leftOverTicks = 0; + m_framesPerSecond = 0; + m_framesThisSecond = 0; + m_qpcSecondCounter = 0; + } + + // Update timer state, calling the specified Update function the appropriate number of times. + template + void Tick(const TUpdate& update) + { + // Query the current time. + LARGE_INTEGER currentTime; + + if (!QueryPerformanceCounter(¤tTime)) + { + throw std::exception( "QueryPerformanceCounter" ); + } + + uint64_t timeDelta = static_cast(currentTime.QuadPart - m_qpcLastTime.QuadPart); + + m_qpcLastTime = currentTime; + m_qpcSecondCounter += timeDelta; + + // Clamp excessively large time deltas (e.g. after paused in the debugger). + if (timeDelta > m_qpcMaxDelta) + { + timeDelta = m_qpcMaxDelta; + } + + // Convert QPC units into a canonical tick format. This cannot overflow due to the previous clamp. + timeDelta *= TicksPerSecond; + timeDelta /= static_cast(m_qpcFrequency.QuadPart); + + uint32_t lastFrameCount = m_frameCount; + + if (m_isFixedTimeStep) + { + // Fixed timestep update logic + + // If the app is running very close to the target elapsed time (within 1/4 of a millisecond) just clamp + // the clock to exactly match the target value. This prevents tiny and irrelevant errors + // from accumulating over time. Without this clamping, a game that requested a 60 fps + // fixed update, running with vsync enabled on a 59.94 NTSC display, would eventually + // accumulate enough tiny errors that it would drop a frame. It is better to just round + // small deviations down to zero to leave things running smoothly. + + if (static_cast(std::abs(static_cast(timeDelta - m_targetElapsedTicks))) < TicksPerSecond / 4000) + { + timeDelta = m_targetElapsedTicks; + } + + m_leftOverTicks += timeDelta; + + while (m_leftOverTicks >= m_targetElapsedTicks) + { + m_elapsedTicks = m_targetElapsedTicks; + m_totalTicks += m_targetElapsedTicks; + m_leftOverTicks -= m_targetElapsedTicks; + m_frameCount++; + + update(); + } + } + else + { + // Variable timestep update logic. + m_elapsedTicks = timeDelta; + m_totalTicks += timeDelta; + m_leftOverTicks = 0; + m_frameCount++; + + update(); + } + + // Track the current framerate. + if (m_frameCount != lastFrameCount) + { + m_framesThisSecond++; + } + + if (m_qpcSecondCounter >= static_cast(m_qpcFrequency.QuadPart)) + { + m_framesPerSecond = m_framesThisSecond; + m_framesThisSecond = 0; + m_qpcSecondCounter %= static_cast(m_qpcFrequency.QuadPart); + } + } + + private: + // Source timing data uses QPC units. + LARGE_INTEGER m_qpcFrequency; + LARGE_INTEGER m_qpcLastTime; + uint64_t m_qpcMaxDelta; + + // Derived timing data uses a canonical tick format. + uint64_t m_elapsedTicks; + uint64_t m_totalTicks; + uint64_t m_leftOverTicks; + + // Members for tracking the framerate. + uint32_t m_frameCount; + uint32_t m_framesPerSecond; + uint32_t m_framesThisSecond; + uint64_t m_qpcSecondCounter; + + // Members for configuring fixed timestep mode. + bool m_isFixedTimeStep; + uint64_t m_targetElapsedTicks; + }; +} diff --git a/Test/PlayFabServicesTestApp/GDK/d3dx12.h b/Test/PlayFabServicesTestApp/GDK/d3dx12.h new file mode 100644 index 0000000..e61d6f5 --- /dev/null +++ b/Test/PlayFabServicesTestApp/GDK/d3dx12.h @@ -0,0 +1,4925 @@ +//********************************************************* +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License (MIT). +// +//********************************************************* + +#ifndef __D3DX12_H__ +#define __D3DX12_H__ + +#include "d3d12.h" + +#if defined( __cplusplus ) + +struct CD3DX12_DEFAULT {}; +extern const DECLSPEC_SELECTANY CD3DX12_DEFAULT D3D12_DEFAULT; + +//------------------------------------------------------------------------------------------------ +inline bool operator==( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r ) noexcept +{ + return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width && + l.Height == r.Height && l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth; +} + +//------------------------------------------------------------------------------------------------ +inline bool operator!=( const D3D12_VIEWPORT& l, const D3D12_VIEWPORT& r ) noexcept +{ return !( l == r ); } + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RECT : public D3D12_RECT +{ + CD3DX12_RECT() = default; + explicit CD3DX12_RECT( const D3D12_RECT& o ) noexcept : + D3D12_RECT( o ) + {} + explicit CD3DX12_RECT( + LONG Left, + LONG Top, + LONG Right, + LONG Bottom ) noexcept + { + left = Left; + top = Top; + right = Right; + bottom = Bottom; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_VIEWPORT : public D3D12_VIEWPORT +{ + CD3DX12_VIEWPORT() = default; + explicit CD3DX12_VIEWPORT( const D3D12_VIEWPORT& o ) noexcept : + D3D12_VIEWPORT( o ) + {} + explicit CD3DX12_VIEWPORT( + FLOAT topLeftX, + FLOAT topLeftY, + FLOAT width, + FLOAT height, + FLOAT minDepth = D3D12_MIN_DEPTH, + FLOAT maxDepth = D3D12_MAX_DEPTH ) noexcept + { + TopLeftX = topLeftX; + TopLeftY = topLeftY; + Width = width; + Height = height; + MinDepth = minDepth; + MaxDepth = maxDepth; + } + explicit CD3DX12_VIEWPORT( + _In_ ID3D12Resource* pResource, + UINT mipSlice = 0, + FLOAT topLeftX = 0.0f, + FLOAT topLeftY = 0.0f, + FLOAT minDepth = D3D12_MIN_DEPTH, + FLOAT maxDepth = D3D12_MAX_DEPTH ) noexcept + { + const auto Desc = pResource->GetDesc(); + const UINT64 SubresourceWidth = Desc.Width >> mipSlice; + const UINT64 SubresourceHeight = Desc.Height >> mipSlice; + switch (Desc.Dimension) + { + case D3D12_RESOURCE_DIMENSION_BUFFER: + TopLeftX = topLeftX; + TopLeftY = 0.0f; + Width = float(Desc.Width) - topLeftX; + Height = 1.0f; + break; + case D3D12_RESOURCE_DIMENSION_TEXTURE1D: + TopLeftX = topLeftX; + TopLeftY = 0.0f; + Width = (SubresourceWidth ? float(SubresourceWidth) : 1.0f) - topLeftX; + Height = 1.0f; + break; + case D3D12_RESOURCE_DIMENSION_TEXTURE2D: + case D3D12_RESOURCE_DIMENSION_TEXTURE3D: + TopLeftX = topLeftX; + TopLeftY = topLeftY; + Width = (SubresourceWidth ? float(SubresourceWidth) : 1.0f) - topLeftX; + Height = (SubresourceHeight ? float(SubresourceHeight) : 1.0f) - topLeftY; + break; + default: break; + } + + MinDepth = minDepth; + MaxDepth = maxDepth; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_BOX : public D3D12_BOX +{ + CD3DX12_BOX() = default; + explicit CD3DX12_BOX( const D3D12_BOX& o ) noexcept : + D3D12_BOX( o ) + {} + explicit CD3DX12_BOX( + LONG Left, + LONG Right ) noexcept + { + left = static_cast(Left); + top = 0; + front = 0; + right = static_cast(Right); + bottom = 1; + back = 1; + } + explicit CD3DX12_BOX( + LONG Left, + LONG Top, + LONG Right, + LONG Bottom ) noexcept + { + left = static_cast(Left); + top = static_cast(Top); + front = 0; + right = static_cast(Right); + bottom = static_cast(Bottom); + back = 1; + } + explicit CD3DX12_BOX( + LONG Left, + LONG Top, + LONG Front, + LONG Right, + LONG Bottom, + LONG Back ) noexcept + { + left = static_cast(Left); + top = static_cast(Top); + front = static_cast(Front); + right = static_cast(Right); + bottom = static_cast(Bottom); + back = static_cast(Back); + } +}; +inline bool operator==( const D3D12_BOX& l, const D3D12_BOX& r ) noexcept +{ + return l.left == r.left && l.top == r.top && l.front == r.front && + l.right == r.right && l.bottom == r.bottom && l.back == r.back; +} +inline bool operator!=( const D3D12_BOX& l, const D3D12_BOX& r ) noexcept +{ return !( l == r ); } + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_DEPTH_STENCIL_DESC : public D3D12_DEPTH_STENCIL_DESC +{ + CD3DX12_DEPTH_STENCIL_DESC() = default; + explicit CD3DX12_DEPTH_STENCIL_DESC( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept : + D3D12_DEPTH_STENCIL_DESC( o ) + {} + explicit CD3DX12_DEPTH_STENCIL_DESC( CD3DX12_DEFAULT ) noexcept + { + DepthEnable = TRUE; + DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; + DepthFunc = D3D12_COMPARISON_FUNC_LESS; + StencilEnable = FALSE; + StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK; + StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK; + const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp = + { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS }; + FrontFace = defaultStencilOp; + BackFace = defaultStencilOp; + } + explicit CD3DX12_DEPTH_STENCIL_DESC( + BOOL depthEnable, + D3D12_DEPTH_WRITE_MASK depthWriteMask, + D3D12_COMPARISON_FUNC depthFunc, + BOOL stencilEnable, + UINT8 stencilReadMask, + UINT8 stencilWriteMask, + D3D12_STENCIL_OP frontStencilFailOp, + D3D12_STENCIL_OP frontStencilDepthFailOp, + D3D12_STENCIL_OP frontStencilPassOp, + D3D12_COMPARISON_FUNC frontStencilFunc, + D3D12_STENCIL_OP backStencilFailOp, + D3D12_STENCIL_OP backStencilDepthFailOp, + D3D12_STENCIL_OP backStencilPassOp, + D3D12_COMPARISON_FUNC backStencilFunc ) noexcept + { + DepthEnable = depthEnable; + DepthWriteMask = depthWriteMask; + DepthFunc = depthFunc; + StencilEnable = stencilEnable; + StencilReadMask = stencilReadMask; + StencilWriteMask = stencilWriteMask; + FrontFace.StencilFailOp = frontStencilFailOp; + FrontFace.StencilDepthFailOp = frontStencilDepthFailOp; + FrontFace.StencilPassOp = frontStencilPassOp; + FrontFace.StencilFunc = frontStencilFunc; + BackFace.StencilFailOp = backStencilFailOp; + BackFace.StencilDepthFailOp = backStencilDepthFailOp; + BackFace.StencilPassOp = backStencilPassOp; + BackFace.StencilFunc = backStencilFunc; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_DEPTH_STENCIL_DESC1 : public D3D12_DEPTH_STENCIL_DESC1 +{ + CD3DX12_DEPTH_STENCIL_DESC1() = default; + explicit CD3DX12_DEPTH_STENCIL_DESC1( const D3D12_DEPTH_STENCIL_DESC1& o ) noexcept : + D3D12_DEPTH_STENCIL_DESC1( o ) + {} + explicit CD3DX12_DEPTH_STENCIL_DESC1( const D3D12_DEPTH_STENCIL_DESC& o ) noexcept + { + DepthEnable = o.DepthEnable; + DepthWriteMask = o.DepthWriteMask; + DepthFunc = o.DepthFunc; + StencilEnable = o.StencilEnable; + StencilReadMask = o.StencilReadMask; + StencilWriteMask = o.StencilWriteMask; + FrontFace.StencilFailOp = o.FrontFace.StencilFailOp; + FrontFace.StencilDepthFailOp = o.FrontFace.StencilDepthFailOp; + FrontFace.StencilPassOp = o.FrontFace.StencilPassOp; + FrontFace.StencilFunc = o.FrontFace.StencilFunc; + BackFace.StencilFailOp = o.BackFace.StencilFailOp; + BackFace.StencilDepthFailOp = o.BackFace.StencilDepthFailOp; + BackFace.StencilPassOp = o.BackFace.StencilPassOp; + BackFace.StencilFunc = o.BackFace.StencilFunc; + DepthBoundsTestEnable = FALSE; + } + explicit CD3DX12_DEPTH_STENCIL_DESC1( CD3DX12_DEFAULT ) noexcept + { + DepthEnable = TRUE; + DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; + DepthFunc = D3D12_COMPARISON_FUNC_LESS; + StencilEnable = FALSE; + StencilReadMask = D3D12_DEFAULT_STENCIL_READ_MASK; + StencilWriteMask = D3D12_DEFAULT_STENCIL_WRITE_MASK; + const D3D12_DEPTH_STENCILOP_DESC defaultStencilOp = + { D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_STENCIL_OP_KEEP, D3D12_COMPARISON_FUNC_ALWAYS }; + FrontFace = defaultStencilOp; + BackFace = defaultStencilOp; + DepthBoundsTestEnable = FALSE; + } + explicit CD3DX12_DEPTH_STENCIL_DESC1( + BOOL depthEnable, + D3D12_DEPTH_WRITE_MASK depthWriteMask, + D3D12_COMPARISON_FUNC depthFunc, + BOOL stencilEnable, + UINT8 stencilReadMask, + UINT8 stencilWriteMask, + D3D12_STENCIL_OP frontStencilFailOp, + D3D12_STENCIL_OP frontStencilDepthFailOp, + D3D12_STENCIL_OP frontStencilPassOp, + D3D12_COMPARISON_FUNC frontStencilFunc, + D3D12_STENCIL_OP backStencilFailOp, + D3D12_STENCIL_OP backStencilDepthFailOp, + D3D12_STENCIL_OP backStencilPassOp, + D3D12_COMPARISON_FUNC backStencilFunc, + BOOL depthBoundsTestEnable ) noexcept + { + DepthEnable = depthEnable; + DepthWriteMask = depthWriteMask; + DepthFunc = depthFunc; + StencilEnable = stencilEnable; + StencilReadMask = stencilReadMask; + StencilWriteMask = stencilWriteMask; + FrontFace.StencilFailOp = frontStencilFailOp; + FrontFace.StencilDepthFailOp = frontStencilDepthFailOp; + FrontFace.StencilPassOp = frontStencilPassOp; + FrontFace.StencilFunc = frontStencilFunc; + BackFace.StencilFailOp = backStencilFailOp; + BackFace.StencilDepthFailOp = backStencilDepthFailOp; + BackFace.StencilPassOp = backStencilPassOp; + BackFace.StencilFunc = backStencilFunc; + DepthBoundsTestEnable = depthBoundsTestEnable; + } + operator D3D12_DEPTH_STENCIL_DESC() const noexcept + { + D3D12_DEPTH_STENCIL_DESC D; + D.DepthEnable = DepthEnable; + D.DepthWriteMask = DepthWriteMask; + D.DepthFunc = DepthFunc; + D.StencilEnable = StencilEnable; + D.StencilReadMask = StencilReadMask; + D.StencilWriteMask = StencilWriteMask; + D.FrontFace.StencilFailOp = FrontFace.StencilFailOp; + D.FrontFace.StencilDepthFailOp = FrontFace.StencilDepthFailOp; + D.FrontFace.StencilPassOp = FrontFace.StencilPassOp; + D.FrontFace.StencilFunc = FrontFace.StencilFunc; + D.BackFace.StencilFailOp = BackFace.StencilFailOp; + D.BackFace.StencilDepthFailOp = BackFace.StencilDepthFailOp; + D.BackFace.StencilPassOp = BackFace.StencilPassOp; + D.BackFace.StencilFunc = BackFace.StencilFunc; + return D; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_BLEND_DESC : public D3D12_BLEND_DESC +{ + CD3DX12_BLEND_DESC() = default; + explicit CD3DX12_BLEND_DESC( const D3D12_BLEND_DESC& o ) noexcept : + D3D12_BLEND_DESC( o ) + {} + explicit CD3DX12_BLEND_DESC( CD3DX12_DEFAULT ) noexcept + { + AlphaToCoverageEnable = FALSE; + IndependentBlendEnable = FALSE; + const D3D12_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc = + { + FALSE,FALSE, + D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD, + D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD, + D3D12_LOGIC_OP_NOOP, + D3D12_COLOR_WRITE_ENABLE_ALL, + }; + for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) + RenderTarget[ i ] = defaultRenderTargetBlendDesc; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RASTERIZER_DESC : public D3D12_RASTERIZER_DESC +{ + CD3DX12_RASTERIZER_DESC() = default; + explicit CD3DX12_RASTERIZER_DESC( const D3D12_RASTERIZER_DESC& o ) noexcept : + D3D12_RASTERIZER_DESC( o ) + {} + explicit CD3DX12_RASTERIZER_DESC( CD3DX12_DEFAULT ) noexcept + { + FillMode = D3D12_FILL_MODE_SOLID; + CullMode = D3D12_CULL_MODE_BACK; + FrontCounterClockwise = FALSE; + DepthBias = D3D12_DEFAULT_DEPTH_BIAS; + DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP; + SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; + DepthClipEnable = TRUE; + MultisampleEnable = FALSE; + AntialiasedLineEnable = FALSE; + ForcedSampleCount = 0; + ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; + } + explicit CD3DX12_RASTERIZER_DESC( + D3D12_FILL_MODE fillMode, + D3D12_CULL_MODE cullMode, + BOOL frontCounterClockwise, + INT depthBias, + FLOAT depthBiasClamp, + FLOAT slopeScaledDepthBias, + BOOL depthClipEnable, + BOOL multisampleEnable, + BOOL antialiasedLineEnable, + UINT forcedSampleCount, + D3D12_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster) noexcept + { + FillMode = fillMode; + CullMode = cullMode; + FrontCounterClockwise = frontCounterClockwise; + DepthBias = depthBias; + DepthBiasClamp = depthBiasClamp; + SlopeScaledDepthBias = slopeScaledDepthBias; + DepthClipEnable = depthClipEnable; + MultisampleEnable = multisampleEnable; + AntialiasedLineEnable = antialiasedLineEnable; + ForcedSampleCount = forcedSampleCount; + ConservativeRaster = conservativeRaster; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RESOURCE_ALLOCATION_INFO : public D3D12_RESOURCE_ALLOCATION_INFO +{ + CD3DX12_RESOURCE_ALLOCATION_INFO() = default; + explicit CD3DX12_RESOURCE_ALLOCATION_INFO( const D3D12_RESOURCE_ALLOCATION_INFO& o ) noexcept : + D3D12_RESOURCE_ALLOCATION_INFO( o ) + {} + CD3DX12_RESOURCE_ALLOCATION_INFO( + UINT64 size, + UINT64 alignment ) noexcept + { + SizeInBytes = size; + Alignment = alignment; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_HEAP_PROPERTIES : public D3D12_HEAP_PROPERTIES +{ + CD3DX12_HEAP_PROPERTIES() = default; + explicit CD3DX12_HEAP_PROPERTIES(const D3D12_HEAP_PROPERTIES &o) noexcept : + D3D12_HEAP_PROPERTIES(o) + {} + CD3DX12_HEAP_PROPERTIES( + D3D12_CPU_PAGE_PROPERTY cpuPageProperty, + D3D12_MEMORY_POOL memoryPoolPreference, + UINT creationNodeMask = 1, + UINT nodeMask = 1 ) noexcept + { + Type = D3D12_HEAP_TYPE_CUSTOM; + CPUPageProperty = cpuPageProperty; + MemoryPoolPreference = memoryPoolPreference; + CreationNodeMask = creationNodeMask; + VisibleNodeMask = nodeMask; + } + explicit CD3DX12_HEAP_PROPERTIES( + D3D12_HEAP_TYPE type, + UINT creationNodeMask = 1, + UINT nodeMask = 1 ) noexcept + { + Type = type; + CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + CreationNodeMask = creationNodeMask; + VisibleNodeMask = nodeMask; + } + bool IsCPUAccessible() const noexcept + { + return Type == D3D12_HEAP_TYPE_UPLOAD || Type == D3D12_HEAP_TYPE_READBACK || (Type == D3D12_HEAP_TYPE_CUSTOM && + (CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE || CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_WRITE_BACK)); + } +}; +inline bool operator==( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r ) noexcept +{ + return l.Type == r.Type && l.CPUPageProperty == r.CPUPageProperty && + l.MemoryPoolPreference == r.MemoryPoolPreference && + l.CreationNodeMask == r.CreationNodeMask && + l.VisibleNodeMask == r.VisibleNodeMask; +} +inline bool operator!=( const D3D12_HEAP_PROPERTIES& l, const D3D12_HEAP_PROPERTIES& r ) noexcept +{ return !( l == r ); } + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_HEAP_DESC : public D3D12_HEAP_DESC +{ + CD3DX12_HEAP_DESC() = default; + explicit CD3DX12_HEAP_DESC(const D3D12_HEAP_DESC &o) noexcept : + D3D12_HEAP_DESC(o) + {} + CD3DX12_HEAP_DESC( + UINT64 size, + D3D12_HEAP_PROPERTIES properties, + UINT64 alignment = 0, + D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept + { + SizeInBytes = size; + Properties = properties; + Alignment = alignment; + Flags = flags; + } + CD3DX12_HEAP_DESC( + UINT64 size, + D3D12_HEAP_TYPE type, + UINT64 alignment = 0, + D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept + { + SizeInBytes = size; + Properties = CD3DX12_HEAP_PROPERTIES( type ); + Alignment = alignment; + Flags = flags; + } + CD3DX12_HEAP_DESC( + UINT64 size, + D3D12_CPU_PAGE_PROPERTY cpuPageProperty, + D3D12_MEMORY_POOL memoryPoolPreference, + UINT64 alignment = 0, + D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept + { + SizeInBytes = size; + Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference ); + Alignment = alignment; + Flags = flags; + } + CD3DX12_HEAP_DESC( + const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, + D3D12_HEAP_PROPERTIES properties, + D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept + { + SizeInBytes = resAllocInfo.SizeInBytes; + Properties = properties; + Alignment = resAllocInfo.Alignment; + Flags = flags; + } + CD3DX12_HEAP_DESC( + const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, + D3D12_HEAP_TYPE type, + D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept + { + SizeInBytes = resAllocInfo.SizeInBytes; + Properties = CD3DX12_HEAP_PROPERTIES( type ); + Alignment = resAllocInfo.Alignment; + Flags = flags; + } + CD3DX12_HEAP_DESC( + const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, + D3D12_CPU_PAGE_PROPERTY cpuPageProperty, + D3D12_MEMORY_POOL memoryPoolPreference, + D3D12_HEAP_FLAGS flags = D3D12_HEAP_FLAG_NONE ) noexcept + { + SizeInBytes = resAllocInfo.SizeInBytes; + Properties = CD3DX12_HEAP_PROPERTIES( cpuPageProperty, memoryPoolPreference ); + Alignment = resAllocInfo.Alignment; + Flags = flags; + } + bool IsCPUAccessible() const noexcept + { return static_cast< const CD3DX12_HEAP_PROPERTIES* >( &Properties )->IsCPUAccessible(); } +}; +inline bool operator==( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r ) noexcept +{ + return l.SizeInBytes == r.SizeInBytes && + l.Properties == r.Properties && + l.Alignment == r.Alignment && + l.Flags == r.Flags; +} +inline bool operator!=( const D3D12_HEAP_DESC& l, const D3D12_HEAP_DESC& r ) noexcept +{ return !( l == r ); } + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_CLEAR_VALUE : public D3D12_CLEAR_VALUE +{ + CD3DX12_CLEAR_VALUE() = default; + explicit CD3DX12_CLEAR_VALUE(const D3D12_CLEAR_VALUE &o) noexcept : + D3D12_CLEAR_VALUE(o) + {} + CD3DX12_CLEAR_VALUE( + DXGI_FORMAT format, + const FLOAT color[4] ) noexcept + { + Format = format; + memcpy( Color, color, sizeof( Color ) ); + } + CD3DX12_CLEAR_VALUE( + DXGI_FORMAT format, + FLOAT depth, + UINT8 stencil ) noexcept + { + Format = format; + memset( &Color, 0, sizeof( Color ) ); + /* Use memcpy to preserve NAN values */ + memcpy( &DepthStencil.Depth, &depth, sizeof( depth ) ); + DepthStencil.Stencil = stencil; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RANGE : public D3D12_RANGE +{ + CD3DX12_RANGE() = default; + explicit CD3DX12_RANGE(const D3D12_RANGE &o) noexcept : + D3D12_RANGE(o) + {} + CD3DX12_RANGE( + SIZE_T begin, + SIZE_T end ) noexcept + { + Begin = begin; + End = end; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RANGE_UINT64 : public D3D12_RANGE_UINT64 +{ + CD3DX12_RANGE_UINT64() = default; + explicit CD3DX12_RANGE_UINT64(const D3D12_RANGE_UINT64 &o) noexcept : + D3D12_RANGE_UINT64(o) + {} + CD3DX12_RANGE_UINT64( + UINT64 begin, + UINT64 end ) noexcept + { + Begin = begin; + End = end; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_SUBRESOURCE_RANGE_UINT64 : public D3D12_SUBRESOURCE_RANGE_UINT64 +{ + CD3DX12_SUBRESOURCE_RANGE_UINT64() = default; + explicit CD3DX12_SUBRESOURCE_RANGE_UINT64(const D3D12_SUBRESOURCE_RANGE_UINT64 &o) noexcept : + D3D12_SUBRESOURCE_RANGE_UINT64(o) + {} + CD3DX12_SUBRESOURCE_RANGE_UINT64( + UINT subresource, + const D3D12_RANGE_UINT64& range ) noexcept + { + Subresource = subresource; + Range = range; + } + CD3DX12_SUBRESOURCE_RANGE_UINT64( + UINT subresource, + UINT64 begin, + UINT64 end ) noexcept + { + Subresource = subresource; + Range.Begin = begin; + Range.End = end; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_SHADER_BYTECODE : public D3D12_SHADER_BYTECODE +{ + CD3DX12_SHADER_BYTECODE() = default; + explicit CD3DX12_SHADER_BYTECODE(const D3D12_SHADER_BYTECODE &o) noexcept : + D3D12_SHADER_BYTECODE(o) + {} + CD3DX12_SHADER_BYTECODE( + _In_ ID3DBlob* pShaderBlob ) noexcept + { + pShaderBytecode = pShaderBlob->GetBufferPointer(); + BytecodeLength = pShaderBlob->GetBufferSize(); + } + CD3DX12_SHADER_BYTECODE( + const void* _pShaderBytecode, + SIZE_T bytecodeLength ) noexcept + { + pShaderBytecode = _pShaderBytecode; + BytecodeLength = bytecodeLength; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_TILED_RESOURCE_COORDINATE : public D3D12_TILED_RESOURCE_COORDINATE +{ + CD3DX12_TILED_RESOURCE_COORDINATE() = default; + explicit CD3DX12_TILED_RESOURCE_COORDINATE(const D3D12_TILED_RESOURCE_COORDINATE &o) noexcept : + D3D12_TILED_RESOURCE_COORDINATE(o) + {} + CD3DX12_TILED_RESOURCE_COORDINATE( + UINT x, + UINT y, + UINT z, + UINT subresource ) noexcept + { + X = x; + Y = y; + Z = z; + Subresource = subresource; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_TILE_REGION_SIZE : public D3D12_TILE_REGION_SIZE +{ + CD3DX12_TILE_REGION_SIZE() = default; + explicit CD3DX12_TILE_REGION_SIZE(const D3D12_TILE_REGION_SIZE &o) noexcept : + D3D12_TILE_REGION_SIZE(o) + {} + CD3DX12_TILE_REGION_SIZE( + UINT numTiles, + BOOL useBox, + UINT width, + UINT16 height, + UINT16 depth ) noexcept + { + NumTiles = numTiles; + UseBox = useBox; + Width = width; + Height = height; + Depth = depth; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_SUBRESOURCE_TILING : public D3D12_SUBRESOURCE_TILING +{ + CD3DX12_SUBRESOURCE_TILING() = default; + explicit CD3DX12_SUBRESOURCE_TILING(const D3D12_SUBRESOURCE_TILING &o) noexcept : + D3D12_SUBRESOURCE_TILING(o) + {} + CD3DX12_SUBRESOURCE_TILING( + UINT widthInTiles, + UINT16 heightInTiles, + UINT16 depthInTiles, + UINT startTileIndexInOverallResource ) noexcept + { + WidthInTiles = widthInTiles; + HeightInTiles = heightInTiles; + DepthInTiles = depthInTiles; + StartTileIndexInOverallResource = startTileIndexInOverallResource; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_TILE_SHAPE : public D3D12_TILE_SHAPE +{ + CD3DX12_TILE_SHAPE() = default; + explicit CD3DX12_TILE_SHAPE(const D3D12_TILE_SHAPE &o) noexcept : + D3D12_TILE_SHAPE(o) + {} + CD3DX12_TILE_SHAPE( + UINT widthInTexels, + UINT heightInTexels, + UINT depthInTexels ) noexcept + { + WidthInTexels = widthInTexels; + HeightInTexels = heightInTexels; + DepthInTexels = depthInTexels; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RESOURCE_BARRIER : public D3D12_RESOURCE_BARRIER +{ + CD3DX12_RESOURCE_BARRIER() = default; + explicit CD3DX12_RESOURCE_BARRIER(const D3D12_RESOURCE_BARRIER &o) noexcept : + D3D12_RESOURCE_BARRIER(o) + {} + static inline CD3DX12_RESOURCE_BARRIER Transition( + _In_ ID3D12Resource* pResource, + D3D12_RESOURCE_STATES stateBefore, + D3D12_RESOURCE_STATES stateAfter, + UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES, + D3D12_RESOURCE_BARRIER_FLAGS flags = D3D12_RESOURCE_BARRIER_FLAG_NONE) noexcept + { + CD3DX12_RESOURCE_BARRIER result = {}; + D3D12_RESOURCE_BARRIER &barrier = result; + result.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + result.Flags = flags; + barrier.Transition.pResource = pResource; + barrier.Transition.StateBefore = stateBefore; + barrier.Transition.StateAfter = stateAfter; + barrier.Transition.Subresource = subresource; + return result; + } + static inline CD3DX12_RESOURCE_BARRIER Aliasing( + _In_ ID3D12Resource* pResourceBefore, + _In_ ID3D12Resource* pResourceAfter) noexcept + { + CD3DX12_RESOURCE_BARRIER result = {}; + D3D12_RESOURCE_BARRIER &barrier = result; + result.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING; + barrier.Aliasing.pResourceBefore = pResourceBefore; + barrier.Aliasing.pResourceAfter = pResourceAfter; + return result; + } + static inline CD3DX12_RESOURCE_BARRIER UAV( + _In_ ID3D12Resource* pResource) noexcept + { + CD3DX12_RESOURCE_BARRIER result = {}; + D3D12_RESOURCE_BARRIER &barrier = result; + result.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV; + barrier.UAV.pResource = pResource; + return result; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_PACKED_MIP_INFO : public D3D12_PACKED_MIP_INFO +{ + CD3DX12_PACKED_MIP_INFO() = default; + explicit CD3DX12_PACKED_MIP_INFO(const D3D12_PACKED_MIP_INFO &o) noexcept : + D3D12_PACKED_MIP_INFO(o) + {} + CD3DX12_PACKED_MIP_INFO( + UINT8 numStandardMips, + UINT8 numPackedMips, + UINT numTilesForPackedMips, + UINT startTileIndexInOverallResource ) noexcept + { + NumStandardMips = numStandardMips; + NumPackedMips = numPackedMips; + NumTilesForPackedMips = numTilesForPackedMips; + StartTileIndexInOverallResource = startTileIndexInOverallResource; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_SUBRESOURCE_FOOTPRINT : public D3D12_SUBRESOURCE_FOOTPRINT +{ + CD3DX12_SUBRESOURCE_FOOTPRINT() = default; + explicit CD3DX12_SUBRESOURCE_FOOTPRINT(const D3D12_SUBRESOURCE_FOOTPRINT &o) noexcept : + D3D12_SUBRESOURCE_FOOTPRINT(o) + {} + CD3DX12_SUBRESOURCE_FOOTPRINT( + DXGI_FORMAT format, + UINT width, + UINT height, + UINT depth, + UINT rowPitch ) noexcept + { + Format = format; + Width = width; + Height = height; + Depth = depth; + RowPitch = rowPitch; + } + explicit CD3DX12_SUBRESOURCE_FOOTPRINT( + const D3D12_RESOURCE_DESC& resDesc, + UINT rowPitch ) noexcept + { + Format = resDesc.Format; + Width = UINT( resDesc.Width ); + Height = resDesc.Height; + Depth = (resDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? resDesc.DepthOrArraySize : 1u); + RowPitch = rowPitch; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_TEXTURE_COPY_LOCATION : public D3D12_TEXTURE_COPY_LOCATION +{ + CD3DX12_TEXTURE_COPY_LOCATION() = default; + explicit CD3DX12_TEXTURE_COPY_LOCATION(const D3D12_TEXTURE_COPY_LOCATION &o) noexcept : + D3D12_TEXTURE_COPY_LOCATION(o) + {} + CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes) noexcept + { + pResource = pRes; + Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + PlacedFootprint = {}; + } + CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes, D3D12_PLACED_SUBRESOURCE_FOOTPRINT const& Footprint) noexcept + { + pResource = pRes; + Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + PlacedFootprint = Footprint; + } + CD3DX12_TEXTURE_COPY_LOCATION(_In_ ID3D12Resource* pRes, UINT Sub) noexcept + { + pResource = pRes; + Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + PlacedFootprint = {}; + SubresourceIndex = Sub; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_DESCRIPTOR_RANGE : public D3D12_DESCRIPTOR_RANGE +{ + CD3DX12_DESCRIPTOR_RANGE() = default; + explicit CD3DX12_DESCRIPTOR_RANGE(const D3D12_DESCRIPTOR_RANGE &o) noexcept : + D3D12_DESCRIPTOR_RANGE(o) + {} + CD3DX12_DESCRIPTOR_RANGE( + D3D12_DESCRIPTOR_RANGE_TYPE rangeType, + UINT numDescriptors, + UINT baseShaderRegister, + UINT registerSpace = 0, + UINT offsetInDescriptorsFromTableStart = + D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept + { + Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart); + } + + inline void Init( + D3D12_DESCRIPTOR_RANGE_TYPE rangeType, + UINT numDescriptors, + UINT baseShaderRegister, + UINT registerSpace = 0, + UINT offsetInDescriptorsFromTableStart = + D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept + { + Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, offsetInDescriptorsFromTableStart); + } + + static inline void Init( + _Out_ D3D12_DESCRIPTOR_RANGE &range, + D3D12_DESCRIPTOR_RANGE_TYPE rangeType, + UINT numDescriptors, + UINT baseShaderRegister, + UINT registerSpace = 0, + UINT offsetInDescriptorsFromTableStart = + D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept + { + range.RangeType = rangeType; + range.NumDescriptors = numDescriptors; + range.BaseShaderRegister = baseShaderRegister; + range.RegisterSpace = registerSpace; + range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_DESCRIPTOR_TABLE : public D3D12_ROOT_DESCRIPTOR_TABLE +{ + CD3DX12_ROOT_DESCRIPTOR_TABLE() = default; + explicit CD3DX12_ROOT_DESCRIPTOR_TABLE(const D3D12_ROOT_DESCRIPTOR_TABLE &o) noexcept : + D3D12_ROOT_DESCRIPTOR_TABLE(o) + {} + CD3DX12_ROOT_DESCRIPTOR_TABLE( + UINT numDescriptorRanges, + _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept + { + Init(numDescriptorRanges, _pDescriptorRanges); + } + + inline void Init( + UINT numDescriptorRanges, + _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept + { + Init(*this, numDescriptorRanges, _pDescriptorRanges); + } + + static inline void Init( + _Out_ D3D12_ROOT_DESCRIPTOR_TABLE &rootDescriptorTable, + UINT numDescriptorRanges, + _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* _pDescriptorRanges) noexcept + { + rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges; + rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_CONSTANTS : public D3D12_ROOT_CONSTANTS +{ + CD3DX12_ROOT_CONSTANTS() = default; + explicit CD3DX12_ROOT_CONSTANTS(const D3D12_ROOT_CONSTANTS &o) noexcept : + D3D12_ROOT_CONSTANTS(o) + {} + CD3DX12_ROOT_CONSTANTS( + UINT num32BitValues, + UINT shaderRegister, + UINT registerSpace = 0) noexcept + { + Init(num32BitValues, shaderRegister, registerSpace); + } + + inline void Init( + UINT num32BitValues, + UINT shaderRegister, + UINT registerSpace = 0) noexcept + { + Init(*this, num32BitValues, shaderRegister, registerSpace); + } + + static inline void Init( + _Out_ D3D12_ROOT_CONSTANTS &rootConstants, + UINT num32BitValues, + UINT shaderRegister, + UINT registerSpace = 0) noexcept + { + rootConstants.Num32BitValues = num32BitValues; + rootConstants.ShaderRegister = shaderRegister; + rootConstants.RegisterSpace = registerSpace; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_DESCRIPTOR : public D3D12_ROOT_DESCRIPTOR +{ + CD3DX12_ROOT_DESCRIPTOR() = default; + explicit CD3DX12_ROOT_DESCRIPTOR(const D3D12_ROOT_DESCRIPTOR &o) noexcept : + D3D12_ROOT_DESCRIPTOR(o) + {} + CD3DX12_ROOT_DESCRIPTOR( + UINT shaderRegister, + UINT registerSpace = 0) noexcept + { + Init(shaderRegister, registerSpace); + } + + inline void Init( + UINT shaderRegister, + UINT registerSpace = 0) noexcept + { + Init(*this, shaderRegister, registerSpace); + } + + static inline void Init(_Out_ D3D12_ROOT_DESCRIPTOR &table, UINT shaderRegister, UINT registerSpace = 0) noexcept + { + table.ShaderRegister = shaderRegister; + table.RegisterSpace = registerSpace; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_PARAMETER : public D3D12_ROOT_PARAMETER +{ + CD3DX12_ROOT_PARAMETER() = default; + explicit CD3DX12_ROOT_PARAMETER(const D3D12_ROOT_PARAMETER &o) noexcept : + D3D12_ROOT_PARAMETER(o) + {} + + static inline void InitAsDescriptorTable( + _Out_ D3D12_ROOT_PARAMETER &rootParam, + UINT numDescriptorRanges, + _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR_TABLE::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges); + } + + static inline void InitAsConstants( + _Out_ D3D12_ROOT_PARAMETER &rootParam, + UINT num32BitValues, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace); + } + + static inline void InitAsConstantBufferView( + _Out_ D3D12_ROOT_PARAMETER &rootParam, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace); + } + + static inline void InitAsShaderResourceView( + _Out_ D3D12_ROOT_PARAMETER &rootParam, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace); + } + + static inline void InitAsUnorderedAccessView( + _Out_ D3D12_ROOT_PARAMETER &rootParam, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR::Init(rootParam.Descriptor, shaderRegister, registerSpace); + } + + inline void InitAsDescriptorTable( + UINT numDescriptorRanges, + _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility); + } + + inline void InitAsConstants( + UINT num32BitValues, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility); + } + + inline void InitAsConstantBufferView( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsConstantBufferView(*this, shaderRegister, registerSpace, visibility); + } + + inline void InitAsShaderResourceView( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsShaderResourceView(*this, shaderRegister, registerSpace, visibility); + } + + inline void InitAsUnorderedAccessView( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, visibility); + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_STATIC_SAMPLER_DESC : public D3D12_STATIC_SAMPLER_DESC +{ + CD3DX12_STATIC_SAMPLER_DESC() = default; + explicit CD3DX12_STATIC_SAMPLER_DESC(const D3D12_STATIC_SAMPLER_DESC &o) noexcept : + D3D12_STATIC_SAMPLER_DESC(o) + {} + CD3DX12_STATIC_SAMPLER_DESC( + UINT shaderRegister, + D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC, + D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + FLOAT mipLODBias = 0, + UINT maxAnisotropy = 16, + D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL, + D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE, + FLOAT minLOD = 0.f, + FLOAT maxLOD = D3D12_FLOAT32_MAX, + D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL, + UINT registerSpace = 0) noexcept + { + Init( + shaderRegister, + filter, + addressU, + addressV, + addressW, + mipLODBias, + maxAnisotropy, + comparisonFunc, + borderColor, + minLOD, + maxLOD, + shaderVisibility, + registerSpace); + } + + static inline void Init( + _Out_ D3D12_STATIC_SAMPLER_DESC &samplerDesc, + UINT shaderRegister, + D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC, + D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + FLOAT mipLODBias = 0, + UINT maxAnisotropy = 16, + D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL, + D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE, + FLOAT minLOD = 0.f, + FLOAT maxLOD = D3D12_FLOAT32_MAX, + D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL, + UINT registerSpace = 0) noexcept + { + samplerDesc.ShaderRegister = shaderRegister; + samplerDesc.Filter = filter; + samplerDesc.AddressU = addressU; + samplerDesc.AddressV = addressV; + samplerDesc.AddressW = addressW; + samplerDesc.MipLODBias = mipLODBias; + samplerDesc.MaxAnisotropy = maxAnisotropy; + samplerDesc.ComparisonFunc = comparisonFunc; + samplerDesc.BorderColor = borderColor; + samplerDesc.MinLOD = minLOD; + samplerDesc.MaxLOD = maxLOD; + samplerDesc.ShaderVisibility = shaderVisibility; + samplerDesc.RegisterSpace = registerSpace; + } + inline void Init( + UINT shaderRegister, + D3D12_FILTER filter = D3D12_FILTER_ANISOTROPIC, + D3D12_TEXTURE_ADDRESS_MODE addressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE addressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE addressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP, + FLOAT mipLODBias = 0, + UINT maxAnisotropy = 16, + D3D12_COMPARISON_FUNC comparisonFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL, + D3D12_STATIC_BORDER_COLOR borderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE, + FLOAT minLOD = 0.f, + FLOAT maxLOD = D3D12_FLOAT32_MAX, + D3D12_SHADER_VISIBILITY shaderVisibility = D3D12_SHADER_VISIBILITY_ALL, + UINT registerSpace = 0) noexcept + { + Init( + *this, + shaderRegister, + filter, + addressU, + addressV, + addressW, + mipLODBias, + maxAnisotropy, + comparisonFunc, + borderColor, + minLOD, + maxLOD, + shaderVisibility, + registerSpace); + } + +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_SIGNATURE_DESC : public D3D12_ROOT_SIGNATURE_DESC +{ + CD3DX12_ROOT_SIGNATURE_DESC() = default; + explicit CD3DX12_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC &o) noexcept : + D3D12_ROOT_SIGNATURE_DESC(o) + {} + CD3DX12_ROOT_SIGNATURE_DESC( + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + Init(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); + } + CD3DX12_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) noexcept + { + Init(0, nullptr, 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_NONE); + } + + inline void Init( + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + Init(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); + } + + static inline void Init( + _Out_ D3D12_ROOT_SIGNATURE_DESC &desc, + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + desc.NumParameters = numParameters; + desc.pParameters = _pParameters; + desc.NumStaticSamplers = numStaticSamplers; + desc.pStaticSamplers = _pStaticSamplers; + desc.Flags = flags; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_DESCRIPTOR_RANGE1 : public D3D12_DESCRIPTOR_RANGE1 +{ + CD3DX12_DESCRIPTOR_RANGE1() = default; + explicit CD3DX12_DESCRIPTOR_RANGE1(const D3D12_DESCRIPTOR_RANGE1 &o) noexcept : + D3D12_DESCRIPTOR_RANGE1(o) + {} + CD3DX12_DESCRIPTOR_RANGE1( + D3D12_DESCRIPTOR_RANGE_TYPE rangeType, + UINT numDescriptors, + UINT baseShaderRegister, + UINT registerSpace = 0, + D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE, + UINT offsetInDescriptorsFromTableStart = + D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept + { + Init(rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart); + } + + inline void Init( + D3D12_DESCRIPTOR_RANGE_TYPE rangeType, + UINT numDescriptors, + UINT baseShaderRegister, + UINT registerSpace = 0, + D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE, + UINT offsetInDescriptorsFromTableStart = + D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept + { + Init(*this, rangeType, numDescriptors, baseShaderRegister, registerSpace, flags, offsetInDescriptorsFromTableStart); + } + + static inline void Init( + _Out_ D3D12_DESCRIPTOR_RANGE1 &range, + D3D12_DESCRIPTOR_RANGE_TYPE rangeType, + UINT numDescriptors, + UINT baseShaderRegister, + UINT registerSpace = 0, + D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE, + UINT offsetInDescriptorsFromTableStart = + D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND) noexcept + { + range.RangeType = rangeType; + range.NumDescriptors = numDescriptors; + range.BaseShaderRegister = baseShaderRegister; + range.RegisterSpace = registerSpace; + range.Flags = flags; + range.OffsetInDescriptorsFromTableStart = offsetInDescriptorsFromTableStart; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_DESCRIPTOR_TABLE1 : public D3D12_ROOT_DESCRIPTOR_TABLE1 +{ + CD3DX12_ROOT_DESCRIPTOR_TABLE1() = default; + explicit CD3DX12_ROOT_DESCRIPTOR_TABLE1(const D3D12_ROOT_DESCRIPTOR_TABLE1 &o) noexcept : + D3D12_ROOT_DESCRIPTOR_TABLE1(o) + {} + CD3DX12_ROOT_DESCRIPTOR_TABLE1( + UINT numDescriptorRanges, + _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept + { + Init(numDescriptorRanges, _pDescriptorRanges); + } + + inline void Init( + UINT numDescriptorRanges, + _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept + { + Init(*this, numDescriptorRanges, _pDescriptorRanges); + } + + static inline void Init( + _Out_ D3D12_ROOT_DESCRIPTOR_TABLE1 &rootDescriptorTable, + UINT numDescriptorRanges, + _In_reads_opt_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* _pDescriptorRanges) noexcept + { + rootDescriptorTable.NumDescriptorRanges = numDescriptorRanges; + rootDescriptorTable.pDescriptorRanges = _pDescriptorRanges; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_DESCRIPTOR1 : public D3D12_ROOT_DESCRIPTOR1 +{ + CD3DX12_ROOT_DESCRIPTOR1() = default; + explicit CD3DX12_ROOT_DESCRIPTOR1(const D3D12_ROOT_DESCRIPTOR1 &o) noexcept : + D3D12_ROOT_DESCRIPTOR1(o) + {} + CD3DX12_ROOT_DESCRIPTOR1( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept + { + Init(shaderRegister, registerSpace, flags); + } + + inline void Init( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept + { + Init(*this, shaderRegister, registerSpace, flags); + } + + static inline void Init( + _Out_ D3D12_ROOT_DESCRIPTOR1 &table, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) noexcept + { + table.ShaderRegister = shaderRegister; + table.RegisterSpace = registerSpace; + table.Flags = flags; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_ROOT_PARAMETER1 : public D3D12_ROOT_PARAMETER1 +{ + CD3DX12_ROOT_PARAMETER1() = default; + explicit CD3DX12_ROOT_PARAMETER1(const D3D12_ROOT_PARAMETER1 &o) noexcept : + D3D12_ROOT_PARAMETER1(o) + {} + + static inline void InitAsDescriptorTable( + _Out_ D3D12_ROOT_PARAMETER1 &rootParam, + UINT numDescriptorRanges, + _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR_TABLE1::Init(rootParam.DescriptorTable, numDescriptorRanges, pDescriptorRanges); + } + + static inline void InitAsConstants( + _Out_ D3D12_ROOT_PARAMETER1 &rootParam, + UINT num32BitValues, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_CONSTANTS::Init(rootParam.Constants, num32BitValues, shaderRegister, registerSpace); + } + + static inline void InitAsConstantBufferView( + _Out_ D3D12_ROOT_PARAMETER1 &rootParam, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags); + } + + static inline void InitAsShaderResourceView( + _Out_ D3D12_ROOT_PARAMETER1 &rootParam, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags); + } + + static inline void InitAsUnorderedAccessView( + _Out_ D3D12_ROOT_PARAMETER1 &rootParam, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + rootParam.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; + rootParam.ShaderVisibility = visibility; + CD3DX12_ROOT_DESCRIPTOR1::Init(rootParam.Descriptor, shaderRegister, registerSpace, flags); + } + + inline void InitAsDescriptorTable( + UINT numDescriptorRanges, + _In_reads_(numDescriptorRanges) const D3D12_DESCRIPTOR_RANGE1* pDescriptorRanges, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsDescriptorTable(*this, numDescriptorRanges, pDescriptorRanges, visibility); + } + + inline void InitAsConstants( + UINT num32BitValues, + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsConstants(*this, num32BitValues, shaderRegister, registerSpace, visibility); + } + + inline void InitAsConstantBufferView( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsConstantBufferView(*this, shaderRegister, registerSpace, flags, visibility); + } + + inline void InitAsShaderResourceView( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsShaderResourceView(*this, shaderRegister, registerSpace, flags, visibility); + } + + inline void InitAsUnorderedAccessView( + UINT shaderRegister, + UINT registerSpace = 0, + D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE, + D3D12_SHADER_VISIBILITY visibility = D3D12_SHADER_VISIBILITY_ALL) noexcept + { + InitAsUnorderedAccessView(*this, shaderRegister, registerSpace, flags, visibility); + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC : public D3D12_VERSIONED_ROOT_SIGNATURE_DESC +{ + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC() = default; + explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC &o) noexcept : + D3D12_VERSIONED_ROOT_SIGNATURE_DESC(o) + {} + explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC &o) noexcept + { + Version = D3D_ROOT_SIGNATURE_VERSION_1_0; + Desc_1_0 = o; + } + explicit CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(const D3D12_ROOT_SIGNATURE_DESC1 &o) noexcept + { + Version = D3D_ROOT_SIGNATURE_VERSION_1_1; + Desc_1_1 = o; + } + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC( + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + Init_1_0(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); + } + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC( + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + Init_1_1(numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); + } + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC(CD3DX12_DEFAULT) noexcept + { + Init_1_1(0, nullptr, 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_NONE); + } + + inline void Init_1_0( + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + Init_1_0(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); + } + + static inline void Init_1_0( + _Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC &desc, + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_0; + desc.Desc_1_0.NumParameters = numParameters; + desc.Desc_1_0.pParameters = _pParameters; + desc.Desc_1_0.NumStaticSamplers = numStaticSamplers; + desc.Desc_1_0.pStaticSamplers = _pStaticSamplers; + desc.Desc_1_0.Flags = flags; + } + + inline void Init_1_1( + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + Init_1_1(*this, numParameters, _pParameters, numStaticSamplers, _pStaticSamplers, flags); + } + + static inline void Init_1_1( + _Out_ D3D12_VERSIONED_ROOT_SIGNATURE_DESC &desc, + UINT numParameters, + _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER1* _pParameters, + UINT numStaticSamplers = 0, + _In_reads_opt_(numStaticSamplers) const D3D12_STATIC_SAMPLER_DESC* _pStaticSamplers = nullptr, + D3D12_ROOT_SIGNATURE_FLAGS flags = D3D12_ROOT_SIGNATURE_FLAG_NONE) noexcept + { + desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1; + desc.Desc_1_1.NumParameters = numParameters; + desc.Desc_1_1.pParameters = _pParameters; + desc.Desc_1_1.NumStaticSamplers = numStaticSamplers; + desc.Desc_1_1.pStaticSamplers = _pStaticSamplers; + desc.Desc_1_1.Flags = flags; + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_CPU_DESCRIPTOR_HANDLE : public D3D12_CPU_DESCRIPTOR_HANDLE +{ + CD3DX12_CPU_DESCRIPTOR_HANDLE() = default; + explicit CD3DX12_CPU_DESCRIPTOR_HANDLE(const D3D12_CPU_DESCRIPTOR_HANDLE &o) noexcept : + D3D12_CPU_DESCRIPTOR_HANDLE(o) + {} + CD3DX12_CPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) noexcept { ptr = 0; } + CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize) noexcept + { + InitOffsetted(other, offsetScaledByIncrementSize); + } + CD3DX12_CPU_DESCRIPTOR_HANDLE(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize); + } + CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + ptr = SIZE_T(INT64(ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize)); + return *this; + } + CD3DX12_CPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) noexcept + { + ptr = SIZE_T(INT64(ptr) + INT64(offsetScaledByIncrementSize)); + return *this; + } + bool operator==(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const noexcept + { + return (ptr == other.ptr); + } + bool operator!=(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE& other) const noexcept + { + return (ptr != other.ptr); + } + CD3DX12_CPU_DESCRIPTOR_HANDLE &operator=(const D3D12_CPU_DESCRIPTOR_HANDLE &other) noexcept + { + ptr = other.ptr; + return *this; + } + + inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept + { + InitOffsetted(*this, base, offsetScaledByIncrementSize); + } + + inline void InitOffsetted(_In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize); + } + + static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept + { + handle.ptr = SIZE_T(INT64(base.ptr) + INT64(offsetScaledByIncrementSize)); + } + + static inline void InitOffsetted(_Out_ D3D12_CPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_CPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + handle.ptr = SIZE_T(INT64(base.ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize)); + } +}; + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_GPU_DESCRIPTOR_HANDLE : public D3D12_GPU_DESCRIPTOR_HANDLE +{ + CD3DX12_GPU_DESCRIPTOR_HANDLE() = default; + explicit CD3DX12_GPU_DESCRIPTOR_HANDLE(const D3D12_GPU_DESCRIPTOR_HANDLE &o) noexcept : + D3D12_GPU_DESCRIPTOR_HANDLE(o) + {} + CD3DX12_GPU_DESCRIPTOR_HANDLE(CD3DX12_DEFAULT) noexcept { ptr = 0; } + CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetScaledByIncrementSize) noexcept + { + InitOffsetted(other, offsetScaledByIncrementSize); + } + CD3DX12_GPU_DESCRIPTOR_HANDLE(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &other, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + InitOffsetted(other, offsetInDescriptors, descriptorIncrementSize); + } + CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + ptr = UINT64(INT64(ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize)); + return *this; + } + CD3DX12_GPU_DESCRIPTOR_HANDLE& Offset(INT offsetScaledByIncrementSize) noexcept + { + ptr = UINT64(INT64(ptr) + INT64(offsetScaledByIncrementSize)); + return *this; + } + inline bool operator==(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const noexcept + { + return (ptr == other.ptr); + } + inline bool operator!=(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE& other) const noexcept + { + return (ptr != other.ptr); + } + CD3DX12_GPU_DESCRIPTOR_HANDLE &operator=(const D3D12_GPU_DESCRIPTOR_HANDLE &other) noexcept + { + ptr = other.ptr; + return *this; + } + + inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept + { + InitOffsetted(*this, base, offsetScaledByIncrementSize); + } + + inline void InitOffsetted(_In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + InitOffsetted(*this, base, offsetInDescriptors, descriptorIncrementSize); + } + + static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetScaledByIncrementSize) noexcept + { + handle.ptr = UINT64(INT64(base.ptr) + INT64(offsetScaledByIncrementSize)); + } + + static inline void InitOffsetted(_Out_ D3D12_GPU_DESCRIPTOR_HANDLE &handle, _In_ const D3D12_GPU_DESCRIPTOR_HANDLE &base, INT offsetInDescriptors, UINT descriptorIncrementSize) noexcept + { + handle.ptr = UINT64(INT64(base.ptr) + INT64(offsetInDescriptors) * INT64(descriptorIncrementSize)); + } +}; + +//------------------------------------------------------------------------------------------------ +constexpr UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize ) noexcept +{ + return MipSlice + ArraySlice * MipLevels + PlaneSlice * MipLevels * ArraySize; +} + +//------------------------------------------------------------------------------------------------ +template +inline void D3D12DecomposeSubresource( UINT Subresource, UINT MipLevels, UINT ArraySize, _Out_ T& MipSlice, _Out_ U& ArraySlice, _Out_ V& PlaneSlice ) noexcept +{ + MipSlice = static_cast(Subresource % MipLevels); + ArraySlice = static_cast((Subresource / MipLevels) % ArraySize); + PlaneSlice = static_cast(Subresource / (MipLevels * ArraySize)); +} + +//------------------------------------------------------------------------------------------------ +inline UINT8 D3D12GetFormatPlaneCount( + _In_ ID3D12Device* pDevice, + DXGI_FORMAT Format + ) noexcept +{ + D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = { Format, 0 }; + if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo)))) + { + return 0; + } + return formatInfo.PlaneCount; +} + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RESOURCE_DESC : public D3D12_RESOURCE_DESC +{ + CD3DX12_RESOURCE_DESC() = default; + explicit CD3DX12_RESOURCE_DESC( const D3D12_RESOURCE_DESC& o ) noexcept : + D3D12_RESOURCE_DESC( o ) + {} + CD3DX12_RESOURCE_DESC( + D3D12_RESOURCE_DIMENSION dimension, + UINT64 alignment, + UINT64 width, + UINT height, + UINT16 depthOrArraySize, + UINT16 mipLevels, + DXGI_FORMAT format, + UINT sampleCount, + UINT sampleQuality, + D3D12_TEXTURE_LAYOUT layout, + D3D12_RESOURCE_FLAGS flags ) noexcept + { + Dimension = dimension; + Alignment = alignment; + Width = width; + Height = height; + DepthOrArraySize = depthOrArraySize; + MipLevels = mipLevels; + Format = format; + SampleDesc.Count = sampleCount; + SampleDesc.Quality = sampleQuality; + Layout = layout; + Flags = flags; + } + static inline CD3DX12_RESOURCE_DESC Buffer( + const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE ) noexcept + { + return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes, + 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags ); + } + static inline CD3DX12_RESOURCE_DESC Buffer( + UINT64 width, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + UINT64 alignment = 0 ) noexcept + { + return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1, + DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags ); + } + static inline CD3DX12_RESOURCE_DESC Tex1D( + DXGI_FORMAT format, + UINT64 width, + UINT16 arraySize = 1, + UINT16 mipLevels = 0, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, + UINT64 alignment = 0 ) noexcept + { + return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize, + mipLevels, format, 1, 0, layout, flags ); + } + static inline CD3DX12_RESOURCE_DESC Tex2D( + DXGI_FORMAT format, + UINT64 width, + UINT height, + UINT16 arraySize = 1, + UINT16 mipLevels = 0, + UINT sampleCount = 1, + UINT sampleQuality = 0, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, + UINT64 alignment = 0 ) noexcept + { + return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize, + mipLevels, format, sampleCount, sampleQuality, layout, flags ); + } + static inline CD3DX12_RESOURCE_DESC Tex3D( + DXGI_FORMAT format, + UINT64 width, + UINT height, + UINT16 depth, + UINT16 mipLevels = 0, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, + UINT64 alignment = 0 ) noexcept + { + return CD3DX12_RESOURCE_DESC( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth, + mipLevels, format, 1, 0, layout, flags ); + } + inline UINT16 Depth() const noexcept + { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); } + inline UINT16 ArraySize() const noexcept + { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); } + inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const noexcept + { return D3D12GetFormatPlaneCount(pDevice, Format); } + inline UINT Subresources(_In_ ID3D12Device* pDevice) const noexcept + { return static_cast(MipLevels) * ArraySize() * PlaneCount(pDevice); } + inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) noexcept + { return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); } +}; +inline bool operator==( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r ) noexcept +{ + return l.Dimension == r.Dimension && + l.Alignment == r.Alignment && + l.Width == r.Width && + l.Height == r.Height && + l.DepthOrArraySize == r.DepthOrArraySize && + l.MipLevels == r.MipLevels && + l.Format == r.Format && + l.SampleDesc.Count == r.SampleDesc.Count && + l.SampleDesc.Quality == r.SampleDesc.Quality && + l.Layout == r.Layout && + l.Flags == r.Flags; +} +inline bool operator!=( const D3D12_RESOURCE_DESC& l, const D3D12_RESOURCE_DESC& r ) noexcept +{ return !( l == r ); } + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RESOURCE_DESC1 : public D3D12_RESOURCE_DESC1 +{ + CD3DX12_RESOURCE_DESC1() = default; + explicit CD3DX12_RESOURCE_DESC1( const D3D12_RESOURCE_DESC1& o ) noexcept : + D3D12_RESOURCE_DESC1( o ) + {} + explicit CD3DX12_RESOURCE_DESC1( const D3D12_RESOURCE_DESC& o ) noexcept + { + Dimension = o.Dimension; + Alignment = o.Alignment; + Width = o.Width; + Height = o.Height; + DepthOrArraySize = o.DepthOrArraySize; + MipLevels = o.MipLevels; + Format = o.Format; + SampleDesc = o.SampleDesc; + Layout = o.Layout; + Flags = o.Flags; + SamplerFeedbackMipRegion = {}; + } + CD3DX12_RESOURCE_DESC1( + D3D12_RESOURCE_DIMENSION dimension, + UINT64 alignment, + UINT64 width, + UINT height, + UINT16 depthOrArraySize, + UINT16 mipLevels, + DXGI_FORMAT format, + UINT sampleCount, + UINT sampleQuality, + D3D12_TEXTURE_LAYOUT layout, + D3D12_RESOURCE_FLAGS flags, + UINT samplerFeedbackMipRegionWidth = 0, + UINT samplerFeedbackMipRegionHeight = 0, + UINT samplerFeedbackMipRegionDepth = 0) noexcept + { + Dimension = dimension; + Alignment = alignment; + Width = width; + Height = height; + DepthOrArraySize = depthOrArraySize; + MipLevels = mipLevels; + Format = format; + SampleDesc.Count = sampleCount; + SampleDesc.Quality = sampleQuality; + Layout = layout; + Flags = flags; + SamplerFeedbackMipRegion.Width = samplerFeedbackMipRegionWidth; + SamplerFeedbackMipRegion.Height = samplerFeedbackMipRegionHeight; + SamplerFeedbackMipRegion.Depth = samplerFeedbackMipRegionDepth; + } + static inline CD3DX12_RESOURCE_DESC1 Buffer( + const D3D12_RESOURCE_ALLOCATION_INFO& resAllocInfo, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE ) noexcept + { + return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_BUFFER, resAllocInfo.Alignment, resAllocInfo.SizeInBytes, + 1, 1, 1, DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags, 0, 0, 0 ); + } + static inline CD3DX12_RESOURCE_DESC1 Buffer( + UINT64 width, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + UINT64 alignment = 0 ) noexcept + { + return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_BUFFER, alignment, width, 1, 1, 1, + DXGI_FORMAT_UNKNOWN, 1, 0, D3D12_TEXTURE_LAYOUT_ROW_MAJOR, flags, 0, 0, 0 ); + } + static inline CD3DX12_RESOURCE_DESC1 Tex1D( + DXGI_FORMAT format, + UINT64 width, + UINT16 arraySize = 1, + UINT16 mipLevels = 0, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, + UINT64 alignment = 0 ) noexcept + { + return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE1D, alignment, width, 1, arraySize, + mipLevels, format, 1, 0, layout, flags, 0, 0, 0 ); + } + static inline CD3DX12_RESOURCE_DESC1 Tex2D( + DXGI_FORMAT format, + UINT64 width, + UINT height, + UINT16 arraySize = 1, + UINT16 mipLevels = 0, + UINT sampleCount = 1, + UINT sampleQuality = 0, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, + UINT64 alignment = 0, + UINT samplerFeedbackMipRegionWidth = 0, + UINT samplerFeedbackMipRegionHeight = 0, + UINT samplerFeedbackMipRegionDepth = 0) noexcept + { + return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE2D, alignment, width, height, arraySize, + mipLevels, format, sampleCount, sampleQuality, layout, flags, samplerFeedbackMipRegionWidth, + samplerFeedbackMipRegionHeight, samplerFeedbackMipRegionDepth ); + } + static inline CD3DX12_RESOURCE_DESC1 Tex3D( + DXGI_FORMAT format, + UINT64 width, + UINT height, + UINT16 depth, + UINT16 mipLevels = 0, + D3D12_RESOURCE_FLAGS flags = D3D12_RESOURCE_FLAG_NONE, + D3D12_TEXTURE_LAYOUT layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, + UINT64 alignment = 0 ) noexcept + { + return CD3DX12_RESOURCE_DESC1( D3D12_RESOURCE_DIMENSION_TEXTURE3D, alignment, width, height, depth, + mipLevels, format, 1, 0, layout, flags, 0, 0, 0 ); + } + inline UINT16 Depth() const noexcept + { return (Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); } + inline UINT16 ArraySize() const noexcept + { return (Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? DepthOrArraySize : 1u); } + inline UINT8 PlaneCount(_In_ ID3D12Device* pDevice) const noexcept + { return D3D12GetFormatPlaneCount(pDevice, Format); } + inline UINT Subresources(_In_ ID3D12Device* pDevice) const noexcept + { return static_cast(MipLevels) * ArraySize() * PlaneCount(pDevice); } + inline UINT CalcSubresource(UINT MipSlice, UINT ArraySlice, UINT PlaneSlice) noexcept + { return D3D12CalcSubresource(MipSlice, ArraySlice, PlaneSlice, MipLevels, ArraySize()); } +}; +inline bool operator==( const D3D12_RESOURCE_DESC1& l, const D3D12_RESOURCE_DESC1& r ) noexcept +{ + return l.Dimension == r.Dimension && + l.Alignment == r.Alignment && + l.Width == r.Width && + l.Height == r.Height && + l.DepthOrArraySize == r.DepthOrArraySize && + l.MipLevels == r.MipLevels && + l.Format == r.Format && + l.SampleDesc.Count == r.SampleDesc.Count && + l.SampleDesc.Quality == r.SampleDesc.Quality && + l.Layout == r.Layout && + l.Flags == r.Flags && + l.SamplerFeedbackMipRegion.Width == r.SamplerFeedbackMipRegion.Width && + l.SamplerFeedbackMipRegion.Height == r.SamplerFeedbackMipRegion.Height && + l.SamplerFeedbackMipRegion.Depth == r.SamplerFeedbackMipRegion.Depth; +} +inline bool operator!=( const D3D12_RESOURCE_DESC1& l, const D3D12_RESOURCE_DESC1& r ) noexcept +{ return !( l == r ); } + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_VIEW_INSTANCING_DESC : public D3D12_VIEW_INSTANCING_DESC +{ + CD3DX12_VIEW_INSTANCING_DESC() = default; + explicit CD3DX12_VIEW_INSTANCING_DESC( const D3D12_VIEW_INSTANCING_DESC& o ) noexcept : + D3D12_VIEW_INSTANCING_DESC( o ) + {} + explicit CD3DX12_VIEW_INSTANCING_DESC( CD3DX12_DEFAULT ) noexcept + { + ViewInstanceCount = 0; + pViewInstanceLocations = nullptr; + Flags = D3D12_VIEW_INSTANCING_FLAG_NONE; + } + explicit CD3DX12_VIEW_INSTANCING_DESC( + UINT InViewInstanceCount, + const D3D12_VIEW_INSTANCE_LOCATION* InViewInstanceLocations, + D3D12_VIEW_INSTANCING_FLAGS InFlags) noexcept + { + ViewInstanceCount = InViewInstanceCount; + pViewInstanceLocations = InViewInstanceLocations; + Flags = InFlags; + } +}; + +//------------------------------------------------------------------------------------------------ +// Row-by-row memcpy +inline void MemcpySubresource( + _In_ const D3D12_MEMCPY_DEST* pDest, + _In_ const D3D12_SUBRESOURCE_DATA* pSrc, + SIZE_T RowSizeInBytes, + UINT NumRows, + UINT NumSlices) noexcept +{ + for (UINT z = 0; z < NumSlices; ++z) + { + auto pDestSlice = static_cast(pDest->pData) + pDest->SlicePitch * z; + auto pSrcSlice = static_cast(pSrc->pData) + pSrc->SlicePitch * LONG_PTR(z); + for (UINT y = 0; y < NumRows; ++y) + { + memcpy(pDestSlice + pDest->RowPitch * y, + pSrcSlice + pSrc->RowPitch * LONG_PTR(y), + RowSizeInBytes); + } + } +} + +//------------------------------------------------------------------------------------------------ +// Row-by-row memcpy +inline void MemcpySubresource( + _In_ const D3D12_MEMCPY_DEST* pDest, + _In_ const void* pResourceData, + _In_ const D3D12_SUBRESOURCE_INFO* pSrc, + SIZE_T RowSizeInBytes, + UINT NumRows, + UINT NumSlices) noexcept +{ + for (UINT z = 0; z < NumSlices; ++z) + { + auto pDestSlice = static_cast(pDest->pData) + pDest->SlicePitch * z; + auto pSrcSlice = (static_cast(pResourceData) + pSrc->Offset) + pSrc->DepthPitch * ULONG_PTR(z); + for (UINT y = 0; y < NumRows; ++y) + { + memcpy(pDestSlice + pDest->RowPitch * y, + pSrcSlice + pSrc->RowPitch * ULONG_PTR(y), + RowSizeInBytes); + } + } +} + +//------------------------------------------------------------------------------------------------ +// Returns required size of a buffer to be used for data upload +inline UINT64 GetRequiredIntermediateSize( + _In_ ID3D12Resource* pDestinationResource, + _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, + _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources) noexcept +{ + const auto Desc = pDestinationResource->GetDesc(); + UINT64 RequiredSize = 0; + + ID3D12Device* pDevice = nullptr; + pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast(&pDevice)); + pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0, nullptr, nullptr, nullptr, &RequiredSize); + pDevice->Release(); + + return RequiredSize; +} + +//------------------------------------------------------------------------------------------------ +// All arrays must be populated (e.g. by calling GetCopyableFootprints) +inline UINT64 UpdateSubresources( + _In_ ID3D12GraphicsCommandList* pCmdList, + _In_ ID3D12Resource* pDestinationResource, + _In_ ID3D12Resource* pIntermediate, + _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, + _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources, + UINT64 RequiredSize, + _In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts, + _In_reads_(NumSubresources) const UINT* pNumRows, + _In_reads_(NumSubresources) const UINT64* pRowSizesInBytes, + _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData) noexcept +{ + // Minor validation + const auto IntermediateDesc = pIntermediate->GetDesc(); + const auto DestinationDesc = pDestinationResource->GetDesc(); + if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER || + IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset || + RequiredSize > SIZE_T(-1) || + (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER && + (FirstSubresource != 0 || NumSubresources != 1))) + { + return 0; + } + + BYTE* pData; + HRESULT hr = pIntermediate->Map(0, nullptr, reinterpret_cast(&pData)); + if (FAILED(hr)) + { + return 0; + } + + for (UINT i = 0; i < NumSubresources; ++i) + { + if (pRowSizesInBytes[i] > SIZE_T(-1)) return 0; + D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, SIZE_T(pLayouts[i].Footprint.RowPitch) * SIZE_T(pNumRows[i]) }; + MemcpySubresource(&DestData, &pSrcData[i], static_cast(pRowSizesInBytes[i]), pNumRows[i], pLayouts[i].Footprint.Depth); + } + pIntermediate->Unmap(0, nullptr); + + if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) + { + pCmdList->CopyBufferRegion( + pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width); + } + else + { + for (UINT i = 0; i < NumSubresources; ++i) + { + const CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource); + const CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]); + pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr); + } + } + return RequiredSize; +} + +//------------------------------------------------------------------------------------------------ +// All arrays must be populated (e.g. by calling GetCopyableFootprints) +inline UINT64 UpdateSubresources( + _In_ ID3D12GraphicsCommandList* pCmdList, + _In_ ID3D12Resource* pDestinationResource, + _In_ ID3D12Resource* pIntermediate, + _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, + _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources, + UINT64 RequiredSize, + _In_reads_(NumSubresources) const D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts, + _In_reads_(NumSubresources) const UINT* pNumRows, + _In_reads_(NumSubresources) const UINT64* pRowSizesInBytes, + _In_ const void* pResourceData, + _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_INFO* pSrcData) noexcept +{ + // Minor validation + const auto IntermediateDesc = pIntermediate->GetDesc(); + const auto DestinationDesc = pDestinationResource->GetDesc(); + if (IntermediateDesc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER || + IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset || + RequiredSize > SIZE_T(-1) || + (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER && + (FirstSubresource != 0 || NumSubresources != 1))) + { + return 0; + } + + BYTE* pData; + HRESULT hr = pIntermediate->Map(0, nullptr, reinterpret_cast(&pData)); + if (FAILED(hr)) + { + return 0; + } + + for (UINT i = 0; i < NumSubresources; ++i) + { + if (pRowSizesInBytes[i] > SIZE_T(-1)) return 0; + D3D12_MEMCPY_DEST DestData = { pData + pLayouts[i].Offset, pLayouts[i].Footprint.RowPitch, SIZE_T(pLayouts[i].Footprint.RowPitch) * SIZE_T(pNumRows[i]) }; + MemcpySubresource(&DestData, pResourceData, &pSrcData[i], static_cast(pRowSizesInBytes[i]), pNumRows[i], pLayouts[i].Footprint.Depth); + } + pIntermediate->Unmap(0, nullptr); + + if (DestinationDesc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) + { + pCmdList->CopyBufferRegion( + pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, pLayouts[0].Footprint.Width); + } + else + { + for (UINT i = 0; i < NumSubresources; ++i) + { + const CD3DX12_TEXTURE_COPY_LOCATION Dst(pDestinationResource, i + FirstSubresource); + const CD3DX12_TEXTURE_COPY_LOCATION Src(pIntermediate, pLayouts[i]); + pCmdList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr); + } + } + return RequiredSize; +} + +//------------------------------------------------------------------------------------------------ +// Heap-allocating UpdateSubresources implementation +inline UINT64 UpdateSubresources( + _In_ ID3D12GraphicsCommandList* pCmdList, + _In_ ID3D12Resource* pDestinationResource, + _In_ ID3D12Resource* pIntermediate, + UINT64 IntermediateOffset, + _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, + _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources, + _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData) noexcept +{ + UINT64 RequiredSize = 0; + const auto MemToAlloc = static_cast(sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) + sizeof(UINT) + sizeof(UINT64)) * NumSubresources; + if (MemToAlloc > SIZE_MAX) + { + return 0; + } + void* pMem = HeapAlloc(GetProcessHeap(), 0, static_cast(MemToAlloc)); + if (pMem == nullptr) + { + return 0; + } + auto pLayouts = static_cast(pMem); + auto pRowSizesInBytes = reinterpret_cast(pLayouts + NumSubresources); + auto pNumRows = reinterpret_cast(pRowSizesInBytes + NumSubresources); + + const auto Desc = pDestinationResource->GetDesc(); + ID3D12Device* pDevice = nullptr; + pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast(&pDevice)); + pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, pRowSizesInBytes, &RequiredSize); + pDevice->Release(); + + const UINT64 Result = UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pSrcData); + HeapFree(GetProcessHeap(), 0, pMem); + return Result; +} + +//------------------------------------------------------------------------------------------------ +// Heap-allocating UpdateSubresources implementation +inline UINT64 UpdateSubresources( + _In_ ID3D12GraphicsCommandList* pCmdList, + _In_ ID3D12Resource* pDestinationResource, + _In_ ID3D12Resource* pIntermediate, + UINT64 IntermediateOffset, + _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource, + _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources, + _In_ const void* pResourceData, + _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_INFO* pSrcData) noexcept +{ + UINT64 RequiredSize = 0; + const auto MemToAlloc = static_cast(sizeof(D3D12_PLACED_SUBRESOURCE_FOOTPRINT) + sizeof(UINT) + sizeof(UINT64)) * NumSubresources; + if (MemToAlloc > SIZE_MAX) + { + return 0; + } + void* pMem = HeapAlloc(GetProcessHeap(), 0, static_cast(MemToAlloc)); + if (pMem == nullptr) + { + return 0; + } + auto pLayouts = static_cast(pMem); + auto pRowSizesInBytes = reinterpret_cast(pLayouts + NumSubresources); + auto pNumRows = reinterpret_cast(pRowSizesInBytes + NumSubresources); + + const auto Desc = pDestinationResource->GetDesc(); + ID3D12Device* pDevice = nullptr; + pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast(&pDevice)); + pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, pLayouts, pNumRows, pRowSizesInBytes, &RequiredSize); + pDevice->Release(); + + const UINT64 Result = UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, pLayouts, pNumRows, pRowSizesInBytes, pResourceData, pSrcData); + HeapFree(GetProcessHeap(), 0, pMem); + return Result; +} + +//------------------------------------------------------------------------------------------------ +// Stack-allocating UpdateSubresources implementation +template +inline UINT64 UpdateSubresources( + _In_ ID3D12GraphicsCommandList* pCmdList, + _In_ ID3D12Resource* pDestinationResource, + _In_ ID3D12Resource* pIntermediate, + UINT64 IntermediateOffset, + _In_range_(0,MaxSubresources) UINT FirstSubresource, + _In_range_(1,MaxSubresources-FirstSubresource) UINT NumSubresources, + _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_DATA* pSrcData) noexcept +{ + UINT64 RequiredSize = 0; + D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources]; + UINT NumRows[MaxSubresources]; + UINT64 RowSizesInBytes[MaxSubresources]; + + const auto Desc = pDestinationResource->GetDesc(); + ID3D12Device* pDevice = nullptr; + pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast(&pDevice)); + pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, RowSizesInBytes, &RequiredSize); + pDevice->Release(); + + return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, Layouts, NumRows, RowSizesInBytes, pSrcData); +} + +//------------------------------------------------------------------------------------------------ +// Stack-allocating UpdateSubresources implementation +template +inline UINT64 UpdateSubresources( + _In_ ID3D12GraphicsCommandList* pCmdList, + _In_ ID3D12Resource* pDestinationResource, + _In_ ID3D12Resource* pIntermediate, + UINT64 IntermediateOffset, + _In_range_(0,MaxSubresources) UINT FirstSubresource, + _In_range_(1,MaxSubresources-FirstSubresource) UINT NumSubresources, + _In_ const void* pResourceData, + _In_reads_(NumSubresources) const D3D12_SUBRESOURCE_INFO* pSrcData) noexcept +{ + UINT64 RequiredSize = 0; + D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts[MaxSubresources]; + UINT NumRows[MaxSubresources]; + UINT64 RowSizesInBytes[MaxSubresources]; + + const auto Desc = pDestinationResource->GetDesc(); + ID3D12Device* pDevice = nullptr; + pDestinationResource->GetDevice(IID_ID3D12Device, reinterpret_cast(&pDevice)); + pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, IntermediateOffset, Layouts, NumRows, RowSizesInBytes, &RequiredSize); + pDevice->Release(); + + return UpdateSubresources(pCmdList, pDestinationResource, pIntermediate, FirstSubresource, NumSubresources, RequiredSize, Layouts, NumRows, RowSizesInBytes, pResourceData, pSrcData); +} + +//------------------------------------------------------------------------------------------------ +constexpr bool D3D12IsLayoutOpaque( D3D12_TEXTURE_LAYOUT Layout ) noexcept +{ return Layout == D3D12_TEXTURE_LAYOUT_UNKNOWN || Layout == D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE; } + +//------------------------------------------------------------------------------------------------ +template +inline ID3D12CommandList * const * CommandListCast(t_CommandListType * const * pp) noexcept +{ + // This cast is useful for passing strongly typed command list pointers into + // ExecuteCommandLists. + // This cast is valid as long as the const-ness is respected. D3D12 APIs do + // respect the const-ness of their arguments. + return reinterpret_cast(pp); +} + +//------------------------------------------------------------------------------------------------ +// D3D12 exports a new method for serializing root signatures in the Windows 10 Anniversary Update. +// To help enable root signature 1.1 features when they are available and not require maintaining +// two code paths for building root signatures, this helper method reconstructs a 1.0 signature when +// 1.1 is not supported. +inline HRESULT D3DX12SerializeVersionedRootSignature( + _In_ const D3D12_VERSIONED_ROOT_SIGNATURE_DESC* pRootSignatureDesc, + D3D_ROOT_SIGNATURE_VERSION MaxVersion, + _Outptr_ ID3DBlob** ppBlob, + _Always_(_Outptr_opt_result_maybenull_) ID3DBlob** ppErrorBlob) noexcept +{ + if (ppErrorBlob != nullptr) + { + *ppErrorBlob = nullptr; + } + + switch (MaxVersion) + { + case D3D_ROOT_SIGNATURE_VERSION_1_0: + switch (pRootSignatureDesc->Version) + { + case D3D_ROOT_SIGNATURE_VERSION_1_0: + return D3D12SerializeRootSignature(&pRootSignatureDesc->Desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, ppErrorBlob); + + case D3D_ROOT_SIGNATURE_VERSION_1_1: + { + HRESULT hr = S_OK; + const D3D12_ROOT_SIGNATURE_DESC1& desc_1_1 = pRootSignatureDesc->Desc_1_1; + + const SIZE_T ParametersSize = sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters; + void* pParameters = (ParametersSize > 0) ? HeapAlloc(GetProcessHeap(), 0, ParametersSize) : nullptr; + if (ParametersSize > 0 && pParameters == nullptr) + { + hr = E_OUTOFMEMORY; + } + auto pParameters_1_0 = static_cast(pParameters); + + if (SUCCEEDED(hr)) + { + for (UINT n = 0; n < desc_1_1.NumParameters; n++) + { + __analysis_assume(ParametersSize == sizeof(D3D12_ROOT_PARAMETER) * desc_1_1.NumParameters); + pParameters_1_0[n].ParameterType = desc_1_1.pParameters[n].ParameterType; + pParameters_1_0[n].ShaderVisibility = desc_1_1.pParameters[n].ShaderVisibility; + + switch (desc_1_1.pParameters[n].ParameterType) + { + case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: + pParameters_1_0[n].Constants.Num32BitValues = desc_1_1.pParameters[n].Constants.Num32BitValues; + pParameters_1_0[n].Constants.RegisterSpace = desc_1_1.pParameters[n].Constants.RegisterSpace; + pParameters_1_0[n].Constants.ShaderRegister = desc_1_1.pParameters[n].Constants.ShaderRegister; + break; + + case D3D12_ROOT_PARAMETER_TYPE_CBV: + case D3D12_ROOT_PARAMETER_TYPE_SRV: + case D3D12_ROOT_PARAMETER_TYPE_UAV: + pParameters_1_0[n].Descriptor.RegisterSpace = desc_1_1.pParameters[n].Descriptor.RegisterSpace; + pParameters_1_0[n].Descriptor.ShaderRegister = desc_1_1.pParameters[n].Descriptor.ShaderRegister; + break; + + case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: + const D3D12_ROOT_DESCRIPTOR_TABLE1& table_1_1 = desc_1_1.pParameters[n].DescriptorTable; + + const SIZE_T DescriptorRangesSize = sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges; + void* pDescriptorRanges = (DescriptorRangesSize > 0 && SUCCEEDED(hr)) ? HeapAlloc(GetProcessHeap(), 0, DescriptorRangesSize) : nullptr; + if (DescriptorRangesSize > 0 && pDescriptorRanges == nullptr) + { + hr = E_OUTOFMEMORY; + } + auto pDescriptorRanges_1_0 = static_cast(pDescriptorRanges); + + if (SUCCEEDED(hr)) + { + for (UINT x = 0; x < table_1_1.NumDescriptorRanges; x++) + { + __analysis_assume(DescriptorRangesSize == sizeof(D3D12_DESCRIPTOR_RANGE) * table_1_1.NumDescriptorRanges); + pDescriptorRanges_1_0[x].BaseShaderRegister = table_1_1.pDescriptorRanges[x].BaseShaderRegister; + pDescriptorRanges_1_0[x].NumDescriptors = table_1_1.pDescriptorRanges[x].NumDescriptors; + pDescriptorRanges_1_0[x].OffsetInDescriptorsFromTableStart = table_1_1.pDescriptorRanges[x].OffsetInDescriptorsFromTableStart; + pDescriptorRanges_1_0[x].RangeType = table_1_1.pDescriptorRanges[x].RangeType; + pDescriptorRanges_1_0[x].RegisterSpace = table_1_1.pDescriptorRanges[x].RegisterSpace; + } + } + + D3D12_ROOT_DESCRIPTOR_TABLE& table_1_0 = pParameters_1_0[n].DescriptorTable; + table_1_0.NumDescriptorRanges = table_1_1.NumDescriptorRanges; + table_1_0.pDescriptorRanges = pDescriptorRanges_1_0; + } + } + } + + if (SUCCEEDED(hr)) + { + const CD3DX12_ROOT_SIGNATURE_DESC desc_1_0(desc_1_1.NumParameters, pParameters_1_0, desc_1_1.NumStaticSamplers, desc_1_1.pStaticSamplers, desc_1_1.Flags); + hr = D3D12SerializeRootSignature(&desc_1_0, D3D_ROOT_SIGNATURE_VERSION_1, ppBlob, ppErrorBlob); + } + + if (pParameters) + { + for (UINT n = 0; n < desc_1_1.NumParameters; n++) + { + if (desc_1_1.pParameters[n].ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) + { + auto pDescriptorRanges_1_0 = pParameters_1_0[n].DescriptorTable.pDescriptorRanges; + HeapFree(GetProcessHeap(), 0, reinterpret_cast(const_cast(pDescriptorRanges_1_0))); + } + } + HeapFree(GetProcessHeap(), 0, pParameters); + } + return hr; + } + } + break; + + case D3D_ROOT_SIGNATURE_VERSION_1_1: + return D3D12SerializeVersionedRootSignature(pRootSignatureDesc, ppBlob, ppErrorBlob); + } + + return E_INVALIDARG; +} + +//------------------------------------------------------------------------------------------------ +struct CD3DX12_RT_FORMAT_ARRAY : public D3D12_RT_FORMAT_ARRAY +{ + CD3DX12_RT_FORMAT_ARRAY() = default; + explicit CD3DX12_RT_FORMAT_ARRAY(const D3D12_RT_FORMAT_ARRAY& o) noexcept + : D3D12_RT_FORMAT_ARRAY(o) + {} + explicit CD3DX12_RT_FORMAT_ARRAY(_In_reads_(NumFormats) const DXGI_FORMAT* pFormats, UINT NumFormats) noexcept + { + NumRenderTargets = NumFormats; + memcpy(RTFormats, pFormats, sizeof(RTFormats)); + // assumes ARRAY_SIZE(pFormats) == ARRAY_SIZE(RTFormats) + } +}; + +//------------------------------------------------------------------------------------------------ +// Pipeline State Stream Helpers +//------------------------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------------------------ +// Stream Subobjects, i.e. elements of a stream + +struct DefaultSampleMask { operator UINT() noexcept { return UINT_MAX; } }; +struct DefaultSampleDesc { operator DXGI_SAMPLE_DESC() noexcept { return DXGI_SAMPLE_DESC{1, 0}; } }; + +#pragma warning(push) +#pragma warning(disable : 4324) +template +class alignas(void*) CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT +{ +private: + D3D12_PIPELINE_STATE_SUBOBJECT_TYPE pssType; + InnerStructType pssInner; +public: + CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT() noexcept : pssType(Type), pssInner(DefaultArg()) {} + CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT(InnerStructType const& i) noexcept : pssType(Type), pssInner(i) {} + CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT& operator=(InnerStructType const& i) noexcept { pssType = Type; pssInner = i; return *this; } + operator InnerStructType const&() const noexcept { return pssInner; } + operator InnerStructType&() noexcept { return pssInner; } + InnerStructType* operator&() noexcept { return &pssInner; } + InnerStructType const* operator&() const noexcept { return &pssInner; } +}; +#pragma warning(pop) +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PIPELINE_STATE_FLAGS, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS> CD3DX12_PIPELINE_STATE_STREAM_FLAGS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK> CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< ID3D12RootSignature*, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE> CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_INPUT_LAYOUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT> CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_INDEX_BUFFER_STRIP_CUT_VALUE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE> CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_PRIMITIVE_TOPOLOGY_TYPE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY> CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS> CD3DX12_PIPELINE_STATE_STREAM_VS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS> CD3DX12_PIPELINE_STATE_STREAM_GS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_STREAM_OUTPUT_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT> CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS> CD3DX12_PIPELINE_STATE_STREAM_HS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS> CD3DX12_PIPELINE_STATE_STREAM_DS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS> CD3DX12_PIPELINE_STATE_STREAM_PS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS> CD3DX12_PIPELINE_STATE_STREAM_AS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS> CD3DX12_PIPELINE_STATE_STREAM_MS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_SHADER_BYTECODE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS> CD3DX12_PIPELINE_STATE_STREAM_CS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_BLEND_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_DEPTH_STENCIL_DESC1, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_FORMAT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT> CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_RASTERIZER_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_RT_FORMAT_ARRAY, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS> CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< DXGI_SAMPLE_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC, DefaultSampleDesc> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< UINT, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK, DefaultSampleMask> CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< D3D12_CACHED_PIPELINE_STATE, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO> CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO; +typedef CD3DX12_PIPELINE_STATE_STREAM_SUBOBJECT< CD3DX12_VIEW_INSTANCING_DESC, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING, CD3DX12_DEFAULT> CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING; + +//------------------------------------------------------------------------------------------------ +// Stream Parser Helpers + +struct ID3DX12PipelineParserCallbacks +{ + // Subobject Callbacks + virtual void FlagsCb(D3D12_PIPELINE_STATE_FLAGS) {} + virtual void NodeMaskCb(UINT) {} + virtual void RootSignatureCb(ID3D12RootSignature*) {} + virtual void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC&) {} + virtual void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE) {} + virtual void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE) {} + virtual void VSCb(const D3D12_SHADER_BYTECODE&) {} + virtual void GSCb(const D3D12_SHADER_BYTECODE&) {} + virtual void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC&) {} + virtual void HSCb(const D3D12_SHADER_BYTECODE&) {} + virtual void DSCb(const D3D12_SHADER_BYTECODE&) {} + virtual void PSCb(const D3D12_SHADER_BYTECODE&) {} + virtual void CSCb(const D3D12_SHADER_BYTECODE&) {} + virtual void ASCb(const D3D12_SHADER_BYTECODE&) {} + virtual void MSCb(const D3D12_SHADER_BYTECODE&) {} + virtual void BlendStateCb(const D3D12_BLEND_DESC&) {} + virtual void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC&) {} + virtual void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1&) {} + virtual void DSVFormatCb(DXGI_FORMAT) {} + virtual void RasterizerStateCb(const D3D12_RASTERIZER_DESC&) {} + virtual void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY&) {} + virtual void SampleDescCb(const DXGI_SAMPLE_DESC&) {} + virtual void SampleMaskCb(UINT) {} + virtual void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC&) {} + virtual void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE&) {} + + // Error Callbacks + virtual void ErrorBadInputParameter(UINT /*ParameterIndex*/) {} + virtual void ErrorDuplicateSubobject(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE /*DuplicateType*/) {} + virtual void ErrorUnknownSubobject(UINT /*UnknownTypeValue*/) {} + + virtual ~ID3DX12PipelineParserCallbacks() = default; +}; + +struct D3DX12_MESH_SHADER_PIPELINE_STATE_DESC +{ + ID3D12RootSignature* pRootSignature; + D3D12_SHADER_BYTECODE AS; + D3D12_SHADER_BYTECODE MS; + D3D12_SHADER_BYTECODE PS; + D3D12_BLEND_DESC BlendState; + UINT SampleMask; + D3D12_RASTERIZER_DESC RasterizerState; + D3D12_DEPTH_STENCIL_DESC DepthStencilState; + D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType; + UINT NumRenderTargets; + DXGI_FORMAT RTVFormats[ D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT ]; + DXGI_FORMAT DSVFormat; + DXGI_SAMPLE_DESC SampleDesc; + UINT NodeMask; + D3D12_CACHED_PIPELINE_STATE CachedPSO; + D3D12_PIPELINE_STATE_FLAGS Flags; +}; + +// CD3DX12_PIPELINE_STATE_STREAM2 Works on OS Build 19041+ (where there is a new mesh shader pipeline). +// Use CD3DX12_PIPELINE_STATE_STREAM1 for OS Build 16299+ (where there is a new view instancing subobject). +// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support. +struct CD3DX12_PIPELINE_STATE_STREAM2 +{ + CD3DX12_PIPELINE_STATE_STREAM2() = default; + // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC + CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , InputLayout(Desc.InputLayout) + , IBStripCutValue(Desc.IBStripCutValue) + , PrimitiveTopologyType(Desc.PrimitiveTopologyType) + , VS(Desc.VS) + , GS(Desc.GS) + , StreamOutput(Desc.StreamOutput) + , HS(Desc.HS) + , DS(Desc.DS) + , PS(Desc.PS) + , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState)) + , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState)) + , DSVFormat(Desc.DSVFormat) + , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState)) + , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets)) + , SampleDesc(Desc.SampleDesc) + , SampleMask(Desc.SampleMask) + , CachedPSO(Desc.CachedPSO) + , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT())) + {} + CD3DX12_PIPELINE_STATE_STREAM2(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , PrimitiveTopologyType(Desc.PrimitiveTopologyType) + , PS(Desc.PS) + , AS(Desc.AS) + , MS(Desc.MS) + , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState)) + , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState)) + , DSVFormat(Desc.DSVFormat) + , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState)) + , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets)) + , SampleDesc(Desc.SampleDesc) + , SampleMask(Desc.SampleMask) + , CachedPSO(Desc.CachedPSO) + , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT())) + {} + CD3DX12_PIPELINE_STATE_STREAM2(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , CS(CD3DX12_SHADER_BYTECODE(Desc.CS)) + , CachedPSO(Desc.CachedPSO) + { + static_cast(DepthStencilState).DepthEnable = false; + } + CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags; + CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask; + CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature; + CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout; + CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue; + CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType; + CD3DX12_PIPELINE_STATE_STREAM_VS VS; + CD3DX12_PIPELINE_STATE_STREAM_GS GS; + CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput; + CD3DX12_PIPELINE_STATE_STREAM_HS HS; + CD3DX12_PIPELINE_STATE_STREAM_DS DS; + CD3DX12_PIPELINE_STATE_STREAM_PS PS; + CD3DX12_PIPELINE_STATE_STREAM_AS AS; + CD3DX12_PIPELINE_STATE_STREAM_MS MS; + CD3DX12_PIPELINE_STATE_STREAM_CS CS; + CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat; + CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState; + CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask; + CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO; + CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc; + D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept + { + D3D12_GRAPHICS_PIPELINE_STATE_DESC D; + D.Flags = this->Flags; + D.NodeMask = this->NodeMask; + D.pRootSignature = this->pRootSignature; + D.InputLayout = this->InputLayout; + D.IBStripCutValue = this->IBStripCutValue; + D.PrimitiveTopologyType = this->PrimitiveTopologyType; + D.VS = this->VS; + D.GS = this->GS; + D.StreamOutput = this->StreamOutput; + D.HS = this->HS; + D.DS = this->DS; + D.PS = this->PS; + D.BlendState = this->BlendState; + D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState)); + D.DSVFormat = this->DSVFormat; + D.RasterizerState = this->RasterizerState; + D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets; + memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats)); + D.SampleDesc = this->SampleDesc; + D.SampleMask = this->SampleMask; + D.CachedPSO = this->CachedPSO; + return D; + } + D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept + { + D3D12_COMPUTE_PIPELINE_STATE_DESC D; + D.Flags = this->Flags; + D.NodeMask = this->NodeMask; + D.pRootSignature = this->pRootSignature; + D.CS = this->CS; + D.CachedPSO = this->CachedPSO; + return D; + } +}; + +// CD3DX12_PIPELINE_STATE_STREAM1 Works on OS Build 16299+ (where there is a new view instancing subobject). +// Use CD3DX12_PIPELINE_STATE_STREAM for OS Build 15063+ support. +struct CD3DX12_PIPELINE_STATE_STREAM1 +{ + CD3DX12_PIPELINE_STATE_STREAM1() = default; + // Mesh and amplification shaders must be set manually, since they do not have representation in D3D12_GRAPHICS_PIPELINE_STATE_DESC + CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , InputLayout(Desc.InputLayout) + , IBStripCutValue(Desc.IBStripCutValue) + , PrimitiveTopologyType(Desc.PrimitiveTopologyType) + , VS(Desc.VS) + , GS(Desc.GS) + , StreamOutput(Desc.StreamOutput) + , HS(Desc.HS) + , DS(Desc.DS) + , PS(Desc.PS) + , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState)) + , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState)) + , DSVFormat(Desc.DSVFormat) + , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState)) + , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets)) + , SampleDesc(Desc.SampleDesc) + , SampleMask(Desc.SampleMask) + , CachedPSO(Desc.CachedPSO) + , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT())) + {} + CD3DX12_PIPELINE_STATE_STREAM1(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , PrimitiveTopologyType(Desc.PrimitiveTopologyType) + , PS(Desc.PS) + , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState)) + , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState)) + , DSVFormat(Desc.DSVFormat) + , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState)) + , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets)) + , SampleDesc(Desc.SampleDesc) + , SampleMask(Desc.SampleMask) + , CachedPSO(Desc.CachedPSO) + , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT())) + {} + CD3DX12_PIPELINE_STATE_STREAM1(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , CS(CD3DX12_SHADER_BYTECODE(Desc.CS)) + , CachedPSO(Desc.CachedPSO) + { + static_cast(DepthStencilState).DepthEnable = false; + } + CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags; + CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask; + CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature; + CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout; + CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue; + CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType; + CD3DX12_PIPELINE_STATE_STREAM_VS VS; + CD3DX12_PIPELINE_STATE_STREAM_GS GS; + CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput; + CD3DX12_PIPELINE_STATE_STREAM_HS HS; + CD3DX12_PIPELINE_STATE_STREAM_DS DS; + CD3DX12_PIPELINE_STATE_STREAM_PS PS; + CD3DX12_PIPELINE_STATE_STREAM_CS CS; + CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat; + CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState; + CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask; + CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO; + CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc; + D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept + { + D3D12_GRAPHICS_PIPELINE_STATE_DESC D; + D.Flags = this->Flags; + D.NodeMask = this->NodeMask; + D.pRootSignature = this->pRootSignature; + D.InputLayout = this->InputLayout; + D.IBStripCutValue = this->IBStripCutValue; + D.PrimitiveTopologyType = this->PrimitiveTopologyType; + D.VS = this->VS; + D.GS = this->GS; + D.StreamOutput = this->StreamOutput; + D.HS = this->HS; + D.DS = this->DS; + D.PS = this->PS; + D.BlendState = this->BlendState; + D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState)); + D.DSVFormat = this->DSVFormat; + D.RasterizerState = this->RasterizerState; + D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets; + memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats)); + D.SampleDesc = this->SampleDesc; + D.SampleMask = this->SampleMask; + D.CachedPSO = this->CachedPSO; + return D; + } + D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept + { + D3D12_COMPUTE_PIPELINE_STATE_DESC D; + D.Flags = this->Flags; + D.NodeMask = this->NodeMask; + D.pRootSignature = this->pRootSignature; + D.CS = this->CS; + D.CachedPSO = this->CachedPSO; + return D; + } +}; + + +struct CD3DX12_PIPELINE_MESH_STATE_STREAM +{ + CD3DX12_PIPELINE_MESH_STATE_STREAM() = default; + CD3DX12_PIPELINE_MESH_STATE_STREAM(const D3DX12_MESH_SHADER_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , PS(Desc.PS) + , AS(Desc.AS) + , MS(Desc.MS) + , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState)) + , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState)) + , DSVFormat(Desc.DSVFormat) + , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState)) + , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets)) + , SampleDesc(Desc.SampleDesc) + , SampleMask(Desc.SampleMask) + , CachedPSO(Desc.CachedPSO) + , ViewInstancingDesc(CD3DX12_VIEW_INSTANCING_DESC(CD3DX12_DEFAULT())) + {} + CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags; + CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask; + CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature; + CD3DX12_PIPELINE_STATE_STREAM_PS PS; + CD3DX12_PIPELINE_STATE_STREAM_AS AS; + CD3DX12_PIPELINE_STATE_STREAM_MS MS; + CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat; + CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState; + CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask; + CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO; + CD3DX12_PIPELINE_STATE_STREAM_VIEW_INSTANCING ViewInstancingDesc; + D3DX12_MESH_SHADER_PIPELINE_STATE_DESC MeshShaderDescV0() const noexcept + { + D3DX12_MESH_SHADER_PIPELINE_STATE_DESC D; + D.Flags = this->Flags; + D.NodeMask = this->NodeMask; + D.pRootSignature = this->pRootSignature; + D.PS = this->PS; + D.AS = this->AS; + D.MS = this->MS; + D.BlendState = this->BlendState; + D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState)); + D.DSVFormat = this->DSVFormat; + D.RasterizerState = this->RasterizerState; + D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets; + memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats)); + D.SampleDesc = this->SampleDesc; + D.SampleMask = this->SampleMask; + D.CachedPSO = this->CachedPSO; + return D; + } +}; + +// CD3DX12_PIPELINE_STATE_STREAM works on OS Build 15063+ but does not support new subobject(s) added in OS Build 16299+. +// See CD3DX12_PIPELINE_STATE_STREAM1 for instance. +struct CD3DX12_PIPELINE_STATE_STREAM +{ + CD3DX12_PIPELINE_STATE_STREAM() = default; + CD3DX12_PIPELINE_STATE_STREAM(const D3D12_GRAPHICS_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , InputLayout(Desc.InputLayout) + , IBStripCutValue(Desc.IBStripCutValue) + , PrimitiveTopologyType(Desc.PrimitiveTopologyType) + , VS(Desc.VS) + , GS(Desc.GS) + , StreamOutput(Desc.StreamOutput) + , HS(Desc.HS) + , DS(Desc.DS) + , PS(Desc.PS) + , BlendState(CD3DX12_BLEND_DESC(Desc.BlendState)) + , DepthStencilState(CD3DX12_DEPTH_STENCIL_DESC1(Desc.DepthStencilState)) + , DSVFormat(Desc.DSVFormat) + , RasterizerState(CD3DX12_RASTERIZER_DESC(Desc.RasterizerState)) + , RTVFormats(CD3DX12_RT_FORMAT_ARRAY(Desc.RTVFormats, Desc.NumRenderTargets)) + , SampleDesc(Desc.SampleDesc) + , SampleMask(Desc.SampleMask) + , CachedPSO(Desc.CachedPSO) + {} + CD3DX12_PIPELINE_STATE_STREAM(const D3D12_COMPUTE_PIPELINE_STATE_DESC& Desc) noexcept + : Flags(Desc.Flags) + , NodeMask(Desc.NodeMask) + , pRootSignature(Desc.pRootSignature) + , CS(CD3DX12_SHADER_BYTECODE(Desc.CS)) + , CachedPSO(Desc.CachedPSO) + {} + CD3DX12_PIPELINE_STATE_STREAM_FLAGS Flags; + CD3DX12_PIPELINE_STATE_STREAM_NODE_MASK NodeMask; + CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE pRootSignature; + CD3DX12_PIPELINE_STATE_STREAM_INPUT_LAYOUT InputLayout; + CD3DX12_PIPELINE_STATE_STREAM_IB_STRIP_CUT_VALUE IBStripCutValue; + CD3DX12_PIPELINE_STATE_STREAM_PRIMITIVE_TOPOLOGY PrimitiveTopologyType; + CD3DX12_PIPELINE_STATE_STREAM_VS VS; + CD3DX12_PIPELINE_STATE_STREAM_GS GS; + CD3DX12_PIPELINE_STATE_STREAM_STREAM_OUTPUT StreamOutput; + CD3DX12_PIPELINE_STATE_STREAM_HS HS; + CD3DX12_PIPELINE_STATE_STREAM_DS DS; + CD3DX12_PIPELINE_STATE_STREAM_PS PS; + CD3DX12_PIPELINE_STATE_STREAM_CS CS; + CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC BlendState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1 DepthStencilState; + CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT DSVFormat; + CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER RasterizerState; + CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTVFormats; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC SampleDesc; + CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK SampleMask; + CD3DX12_PIPELINE_STATE_STREAM_CACHED_PSO CachedPSO; + D3D12_GRAPHICS_PIPELINE_STATE_DESC GraphicsDescV0() const noexcept + { + D3D12_GRAPHICS_PIPELINE_STATE_DESC D; + D.Flags = this->Flags; + D.NodeMask = this->NodeMask; + D.pRootSignature = this->pRootSignature; + D.InputLayout = this->InputLayout; + D.IBStripCutValue = this->IBStripCutValue; + D.PrimitiveTopologyType = this->PrimitiveTopologyType; + D.VS = this->VS; + D.GS = this->GS; + D.StreamOutput = this->StreamOutput; + D.HS = this->HS; + D.DS = this->DS; + D.PS = this->PS; + D.BlendState = this->BlendState; + D.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(D3D12_DEPTH_STENCIL_DESC1(this->DepthStencilState)); + D.DSVFormat = this->DSVFormat; + D.RasterizerState = this->RasterizerState; + D.NumRenderTargets = D3D12_RT_FORMAT_ARRAY(this->RTVFormats).NumRenderTargets; + memcpy(D.RTVFormats, D3D12_RT_FORMAT_ARRAY(this->RTVFormats).RTFormats, sizeof(D.RTVFormats)); + D.SampleDesc = this->SampleDesc; + D.SampleMask = this->SampleMask; + D.CachedPSO = this->CachedPSO; + return D; + } + D3D12_COMPUTE_PIPELINE_STATE_DESC ComputeDescV0() const noexcept + { + D3D12_COMPUTE_PIPELINE_STATE_DESC D; + D.Flags = this->Flags; + D.NodeMask = this->NodeMask; + D.pRootSignature = this->pRootSignature; + D.CS = this->CS; + D.CachedPSO = this->CachedPSO; + return D; + } +}; + +struct CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER : public ID3DX12PipelineParserCallbacks +{ + CD3DX12_PIPELINE_STATE_STREAM2 PipelineStream; + CD3DX12_PIPELINE_STATE_STREAM2_PARSE_HELPER() noexcept + : SeenDSS(false) + { + // Adjust defaults to account for absent members. + PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + + // Depth disabled if no DSV format specified. + static_cast(PipelineStream.DepthStencilState).DepthEnable = false; + } + + // ID3DX12PipelineParserCallbacks + void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;} + void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;} + void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;} + void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;} + void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;} + void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;} + void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;} + void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;} + void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;} + void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;} + void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;} + void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;} + void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;} + void ASCb(const D3D12_SHADER_BYTECODE& AS) override {PipelineStream.AS = AS;} + void MSCb(const D3D12_SHADER_BYTECODE& MS) override {PipelineStream.MS = MS;} + void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);} + void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override + { + PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState); + SeenDSS = true; + } + void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override + { + PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState); + SeenDSS = true; + } + void DSVFormatCb(DXGI_FORMAT DSVFormat) override + { + PipelineStream.DSVFormat = DSVFormat; + if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN) + { + // Re-enable depth for the default state. + static_cast(PipelineStream.DepthStencilState).DepthEnable = true; + } + } + void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);} + void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;} + void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;} + void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;} + void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);} + void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;} + +private: + bool SeenDSS; +}; + + +struct CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER : public ID3DX12PipelineParserCallbacks +{ + CD3DX12_PIPELINE_STATE_STREAM1 PipelineStream; + CD3DX12_PIPELINE_STATE_STREAM_PARSE_HELPER() noexcept + : SeenDSS(false) + { + // Adjust defaults to account for absent members. + PipelineStream.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + + // Depth disabled if no DSV format specified. + static_cast(PipelineStream.DepthStencilState).DepthEnable = false; + } + + // ID3DX12PipelineParserCallbacks + void FlagsCb(D3D12_PIPELINE_STATE_FLAGS Flags) override {PipelineStream.Flags = Flags;} + void NodeMaskCb(UINT NodeMask) override {PipelineStream.NodeMask = NodeMask;} + void RootSignatureCb(ID3D12RootSignature* pRootSignature) override {PipelineStream.pRootSignature = pRootSignature;} + void InputLayoutCb(const D3D12_INPUT_LAYOUT_DESC& InputLayout) override {PipelineStream.InputLayout = InputLayout;} + void IBStripCutValueCb(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue) override {PipelineStream.IBStripCutValue = IBStripCutValue;} + void PrimitiveTopologyTypeCb(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) override {PipelineStream.PrimitiveTopologyType = PrimitiveTopologyType;} + void VSCb(const D3D12_SHADER_BYTECODE& VS) override {PipelineStream.VS = VS;} + void GSCb(const D3D12_SHADER_BYTECODE& GS) override {PipelineStream.GS = GS;} + void StreamOutputCb(const D3D12_STREAM_OUTPUT_DESC& StreamOutput) override {PipelineStream.StreamOutput = StreamOutput;} + void HSCb(const D3D12_SHADER_BYTECODE& HS) override {PipelineStream.HS = HS;} + void DSCb(const D3D12_SHADER_BYTECODE& DS) override {PipelineStream.DS = DS;} + void PSCb(const D3D12_SHADER_BYTECODE& PS) override {PipelineStream.PS = PS;} + void CSCb(const D3D12_SHADER_BYTECODE& CS) override {PipelineStream.CS = CS;} + void BlendStateCb(const D3D12_BLEND_DESC& BlendState) override {PipelineStream.BlendState = CD3DX12_BLEND_DESC(BlendState);} + void DepthStencilStateCb(const D3D12_DEPTH_STENCIL_DESC& DepthStencilState) override + { + PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState); + SeenDSS = true; + } + void DepthStencilState1Cb(const D3D12_DEPTH_STENCIL_DESC1& DepthStencilState) override + { + PipelineStream.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC1(DepthStencilState); + SeenDSS = true; + } + void DSVFormatCb(DXGI_FORMAT DSVFormat) override + { + PipelineStream.DSVFormat = DSVFormat; + if (!SeenDSS && DSVFormat != DXGI_FORMAT_UNKNOWN) + { + // Re-enable depth for the default state. + static_cast(PipelineStream.DepthStencilState).DepthEnable = true; + } + } + void RasterizerStateCb(const D3D12_RASTERIZER_DESC& RasterizerState) override {PipelineStream.RasterizerState = CD3DX12_RASTERIZER_DESC(RasterizerState);} + void RTVFormatsCb(const D3D12_RT_FORMAT_ARRAY& RTVFormats) override {PipelineStream.RTVFormats = RTVFormats;} + void SampleDescCb(const DXGI_SAMPLE_DESC& SampleDesc) override {PipelineStream.SampleDesc = SampleDesc;} + void SampleMaskCb(UINT SampleMask) override {PipelineStream.SampleMask = SampleMask;} + void ViewInstancingCb(const D3D12_VIEW_INSTANCING_DESC& ViewInstancingDesc) override {PipelineStream.ViewInstancingDesc = CD3DX12_VIEW_INSTANCING_DESC(ViewInstancingDesc);} + void CachedPSOCb(const D3D12_CACHED_PIPELINE_STATE& CachedPSO) override {PipelineStream.CachedPSO = CachedPSO;} + +private: + bool SeenDSS; +}; + +inline D3D12_PIPELINE_STATE_SUBOBJECT_TYPE D3DX12GetBaseSubobjectType(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE SubobjectType) noexcept +{ + switch (SubobjectType) + { + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1: + return D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL; + default: + return SubobjectType; + } +} + +inline HRESULT D3DX12ParsePipelineStream(const D3D12_PIPELINE_STATE_STREAM_DESC& Desc, ID3DX12PipelineParserCallbacks* pCallbacks) +{ + if (pCallbacks == nullptr) + { + return E_INVALIDARG; + } + + if (Desc.SizeInBytes == 0 || Desc.pPipelineStateSubobjectStream == nullptr) + { + pCallbacks->ErrorBadInputParameter(1); // first parameter issue + return E_INVALIDARG; + } + + bool SubobjectSeen[D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID] = {}; + for (SIZE_T CurOffset = 0, SizeOfSubobject = 0; CurOffset < Desc.SizeInBytes; CurOffset += SizeOfSubobject) + { + BYTE* pStream = static_cast(Desc.pPipelineStateSubobjectStream)+CurOffset; + auto SubobjectType = *reinterpret_cast(pStream); + if (SubobjectType < 0 || SubobjectType >= D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MAX_VALID) + { + pCallbacks->ErrorUnknownSubobject(SubobjectType); + return E_INVALIDARG; + } + if (SubobjectSeen[D3DX12GetBaseSubobjectType(SubobjectType)]) + { + pCallbacks->ErrorDuplicateSubobject(SubobjectType); + return E_INVALIDARG; // disallow subobject duplicates in a stream + } + SubobjectSeen[SubobjectType] = true; + switch (SubobjectType) + { + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE: + pCallbacks->RootSignatureCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::pRootSignature); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VS: + pCallbacks->VSCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::VS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PS: + pCallbacks->PSCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DS: + pCallbacks->DSCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_HS: + pCallbacks->HSCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::HS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_GS: + pCallbacks->GSCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::GS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CS: + pCallbacks->CSCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_AS: + pCallbacks->ASCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::AS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_MS: + pCallbacks->MSCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM2::MS); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_STREAM_OUTPUT: + pCallbacks->StreamOutputCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::StreamOutput); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_BLEND: + pCallbacks->BlendStateCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::BlendState); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_MASK: + pCallbacks->SampleMaskCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleMask); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER: + pCallbacks->RasterizerStateCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RasterizerState); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL: + pCallbacks->DepthStencilStateCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL1: + pCallbacks->DepthStencilState1Cb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DepthStencilState); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_INPUT_LAYOUT: + pCallbacks->InputLayoutCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::InputLayout); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_IB_STRIP_CUT_VALUE: + pCallbacks->IBStripCutValueCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::IBStripCutValue); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY: + pCallbacks->PrimitiveTopologyTypeCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::PrimitiveTopologyType); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RENDER_TARGET_FORMATS: + pCallbacks->RTVFormatsCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::RTVFormats); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_DEPTH_STENCIL_FORMAT: + pCallbacks->DSVFormatCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::DSVFormat); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_SAMPLE_DESC: + pCallbacks->SampleDescCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::SampleDesc); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_NODE_MASK: + pCallbacks->NodeMaskCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::NodeMask); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_CACHED_PSO: + pCallbacks->CachedPSOCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::CachedPSO); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_FLAGS: + pCallbacks->FlagsCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM::Flags); + break; + case D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_VIEW_INSTANCING: + pCallbacks->ViewInstancingCb(*reinterpret_cast(pStream)); + SizeOfSubobject = sizeof(CD3DX12_PIPELINE_STATE_STREAM1::ViewInstancingDesc); + break; + default: + pCallbacks->ErrorUnknownSubobject(SubobjectType); + return E_INVALIDARG; + } + } + + return S_OK; +} + +//------------------------------------------------------------------------------------------------ +inline bool operator==( const D3D12_CLEAR_VALUE &a, const D3D12_CLEAR_VALUE &b) noexcept +{ + if (a.Format != b.Format) return false; + if (a.Format == DXGI_FORMAT_D24_UNORM_S8_UINT + || a.Format == DXGI_FORMAT_D16_UNORM + || a.Format == DXGI_FORMAT_D32_FLOAT + || a.Format == DXGI_FORMAT_D32_FLOAT_S8X24_UINT) + { + return (a.DepthStencil.Depth == b.DepthStencil.Depth) && + (a.DepthStencil.Stencil == b.DepthStencil.Stencil); + } else { + return (a.Color[0] == b.Color[0]) && + (a.Color[1] == b.Color[1]) && + (a.Color[2] == b.Color[2]) && + (a.Color[3] == b.Color[3]); + } +} +inline bool operator==( const D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS &a, const D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS &b) noexcept +{ + return a.ClearValue == b.ClearValue; +} +inline bool operator==( const D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS &a, const D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS &b) noexcept +{ + if (a.pSrcResource != b.pSrcResource) return false; + if (a.pDstResource != b.pDstResource) return false; + if (a.SubresourceCount != b.SubresourceCount) return false; + if (a.Format != b.Format) return false; + if (a.ResolveMode != b.ResolveMode) return false; + if (a.PreserveResolveSource != b.PreserveResolveSource) return false; + return true; +} +inline bool operator==( const D3D12_RENDER_PASS_BEGINNING_ACCESS &a, const D3D12_RENDER_PASS_BEGINNING_ACCESS &b) noexcept +{ + if (a.Type != b.Type) return false; + if (a.Type == D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR && !(a.Clear == b.Clear)) return false; + return true; +} +inline bool operator==( const D3D12_RENDER_PASS_ENDING_ACCESS &a, const D3D12_RENDER_PASS_ENDING_ACCESS &b) noexcept +{ + if (a.Type != b.Type) return false; + if (a.Type == D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_RESOLVE && !(a.Resolve == b.Resolve)) return false; + return true; +} +inline bool operator==( const D3D12_RENDER_PASS_RENDER_TARGET_DESC &a, const D3D12_RENDER_PASS_RENDER_TARGET_DESC &b) noexcept +{ + if (a.cpuDescriptor.ptr != b.cpuDescriptor.ptr) return false; + if (!(a.BeginningAccess == b.BeginningAccess)) return false; + if (!(a.EndingAccess == b.EndingAccess)) return false; + return true; +} +inline bool operator==( const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC &a, const D3D12_RENDER_PASS_DEPTH_STENCIL_DESC &b) noexcept +{ + if (a.cpuDescriptor.ptr != b.cpuDescriptor.ptr) return false; + if (!(a.DepthBeginningAccess == b.DepthBeginningAccess)) return false; + if (!(a.StencilBeginningAccess == b.StencilBeginningAccess)) return false; + if (!(a.DepthEndingAccess == b.DepthEndingAccess)) return false; + if (!(a.StencilEndingAccess == b.StencilEndingAccess)) return false; + return true; +} + + +#ifndef D3DX12_NO_STATE_OBJECT_HELPERS + +//================================================================================================ +// D3DX12 State Object Creation Helpers +// +// Helper classes for creating new style state objects out of an arbitrary set of subobjects. +// Uses STL +// +// Start by instantiating CD3DX12_STATE_OBJECT_DESC (see its public methods). +// One of its methods is CreateSubobject(), which has a comment showing a couple of options for +// defining subobjects using the helper classes for each subobject (CD3DX12_DXIL_LIBRARY_SUBOBJECT +// etc.). The subobject helpers each have methods specific to the subobject for configuring its +// contents. +// +//================================================================================================ +#include +#include +#include +#include +#ifndef D3DX12_USE_ATL +#include +#define D3DX12_COM_PTR Microsoft::WRL::ComPtr +#define D3DX12_COM_PTR_GET(x) x.Get() +#define D3DX12_COM_PTR_ADDRESSOF(x) x.GetAddressOf() +#else +#include +#define D3DX12_COM_PTR ATL::CComPtr +#define D3DX12_COM_PTR_GET(x) x.p +#define D3DX12_COM_PTR_ADDRESSOF(x) &x.p +#endif + +//------------------------------------------------------------------------------------------------ +class CD3DX12_STATE_OBJECT_DESC +{ +public: + CD3DX12_STATE_OBJECT_DESC() noexcept + { + Init(D3D12_STATE_OBJECT_TYPE_COLLECTION); + } + CD3DX12_STATE_OBJECT_DESC(D3D12_STATE_OBJECT_TYPE Type) noexcept + { + Init(Type); + } + void SetStateObjectType(D3D12_STATE_OBJECT_TYPE Type) noexcept { m_Desc.Type = Type; } + operator const D3D12_STATE_OBJECT_DESC&() + { + // Do final preparation work + m_RepointedAssociations.clear(); + m_SubobjectArray.clear(); + m_SubobjectArray.reserve(m_Desc.NumSubobjects); + // Flatten subobjects into an array (each flattened subobject still has a + // member that's a pointer to its desc that's not flattened) + for (auto Iter = m_SubobjectList.begin(); + Iter != m_SubobjectList.end(); Iter++) + { + m_SubobjectArray.push_back(*Iter); + // Store new location in array so we can redirect pointers contained in subobjects + Iter->pSubobjectArrayLocation = &m_SubobjectArray.back(); + } + // For subobjects with pointer fields, create a new copy of those subobject definitions + // with fixed pointers + for (UINT i = 0; i < m_Desc.NumSubobjects; i++) + { + if (m_SubobjectArray[i].Type == D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION) + { + auto pOriginalSubobjectAssociation = + static_cast(m_SubobjectArray[i].pDesc); + D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION Repointed = *pOriginalSubobjectAssociation; + auto pWrapper = + static_cast(pOriginalSubobjectAssociation->pSubobjectToAssociate); + Repointed.pSubobjectToAssociate = pWrapper->pSubobjectArrayLocation; + m_RepointedAssociations.push_back(Repointed); + m_SubobjectArray[i].pDesc = &m_RepointedAssociations.back(); + } + } + // Below: using ugly way to get pointer in case .data() is not defined + m_Desc.pSubobjects = m_Desc.NumSubobjects ? &m_SubobjectArray[0] : nullptr; + return m_Desc; + } + operator const D3D12_STATE_OBJECT_DESC*() + { + // Cast calls the above final preparation work + return &static_cast(*this); + } + + // CreateSubobject creates a sububject helper (e.g. CD3DX12_HIT_GROUP_SUBOBJECT) + // whose lifetime is owned by this class. + // e.g. + // + // CD3DX12_STATE_OBJECT_DESC Collection1(D3D12_STATE_OBJECT_TYPE_COLLECTION); + // auto Lib0 = Collection1.CreateSubobject(); + // Lib0->SetDXILLibrary(&pMyAppDxilLibs[0]); + // Lib0->DefineExport(L"rayGenShader0"); // in practice these export listings might be + // // data/engine driven + // etc. + // + // Alternatively, users can instantiate sububject helpers explicitly, such as via local + // variables instead, passing the state object desc that should point to it into the helper + // constructor (or call mySubobjectHelper.AddToStateObject(Collection1)). + // In this alternative scenario, the user must keep the subobject alive as long as the state + // object it is associated with is alive, else its pointer references will be stale. + // e.g. + // + // CD3DX12_STATE_OBJECT_DESC RaytracingState2(D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE); + // CD3DX12_DXIL_LIBRARY_SUBOBJECT LibA(RaytracingState2); + // LibA.SetDXILLibrary(&pMyAppDxilLibs[4]); // not manually specifying exports + // // - meaning all exports in the libraries + // // are exported + // etc. + + template + T* CreateSubobject() + { + T* pSubobject = new T(*this); + m_OwnedSubobjectHelpers.emplace_back(pSubobject); + return pSubobject; + } + +private: + D3D12_STATE_SUBOBJECT* TrackSubobject(D3D12_STATE_SUBOBJECT_TYPE Type, void* pDesc) + { + SUBOBJECT_WRAPPER Subobject; + Subobject.pSubobjectArrayLocation = nullptr; + Subobject.Type = Type; + Subobject.pDesc = pDesc; + m_SubobjectList.push_back(Subobject); + m_Desc.NumSubobjects++; + return &m_SubobjectList.back(); + } + void Init(D3D12_STATE_OBJECT_TYPE Type) noexcept + { + SetStateObjectType(Type); + m_Desc.pSubobjects = nullptr; + m_Desc.NumSubobjects = 0; + m_SubobjectList.clear(); + m_SubobjectArray.clear(); + m_RepointedAssociations.clear(); + } + typedef struct SUBOBJECT_WRAPPER : public D3D12_STATE_SUBOBJECT + { + D3D12_STATE_SUBOBJECT* pSubobjectArrayLocation; // new location when flattened into array + // for repointing pointers in subobjects + } SUBOBJECT_WRAPPER; + D3D12_STATE_OBJECT_DESC m_Desc; + std::list m_SubobjectList; // Pointers to list nodes handed out so + // these can be edited live + std::vector m_SubobjectArray; // Built at the end, copying list contents + + std::list + m_RepointedAssociations; // subobject type that contains pointers to other subobjects, + // repointed to flattened array + + class StringContainer + { + public: + LPCWSTR LocalCopy(LPCWSTR string, bool bSingleString = false) + { + if (string) + { + if (bSingleString) + { + m_Strings.clear(); + m_Strings.push_back(string); + } + else + { + m_Strings.push_back(string); + } + return m_Strings.back().c_str(); + } + else + { + return nullptr; + } + } + void clear() noexcept { m_Strings.clear(); } + private: + std::list m_Strings; + }; + + class SUBOBJECT_HELPER_BASE + { + public: + SUBOBJECT_HELPER_BASE() noexcept { Init(); } + virtual ~SUBOBJECT_HELPER_BASE() = default; + virtual D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept = 0; + void AddToStateObject(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + m_pSubobject = ContainingStateObject.TrackSubobject(Type(), Data()); + } + protected: + virtual void* Data() noexcept = 0; + void Init() noexcept { m_pSubobject = nullptr; } + D3D12_STATE_SUBOBJECT* m_pSubobject; + }; + +#if(__cplusplus >= 201103L) + std::list> m_OwnedSubobjectHelpers; +#else + class OWNED_HELPER + { + public: + OWNED_HELPER(const SUBOBJECT_HELPER_BASE* pHelper) noexcept { m_pHelper = pHelper; } + ~OWNED_HELPER() { delete m_pHelper; } + const SUBOBJECT_HELPER_BASE* m_pHelper; + }; + + std::list m_OwnedSubobjectHelpers; +#endif + + friend class CD3DX12_DXIL_LIBRARY_SUBOBJECT; + friend class CD3DX12_EXISTING_COLLECTION_SUBOBJECT; + friend class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT; + friend class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION; + friend class CD3DX12_HIT_GROUP_SUBOBJECT; + friend class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT; + friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT; + friend class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT; + friend class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT; + friend class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT; + friend class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT; + friend class CD3DX12_NODE_MASK_SUBOBJECT; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_DXIL_LIBRARY_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_DXIL_LIBRARY_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_DXIL_LIBRARY_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetDXILLibrary(const D3D12_SHADER_BYTECODE* pCode) noexcept + { + static const D3D12_SHADER_BYTECODE Default = {}; + m_Desc.DXILLibrary = pCode ? *pCode : Default; + } + void DefineExport( + LPCWSTR Name, + LPCWSTR ExportToRename = nullptr, + D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE) + { + D3D12_EXPORT_DESC Export; + Export.Name = m_Strings.LocalCopy(Name); + Export.ExportToRename = m_Strings.LocalCopy(ExportToRename); + Export.Flags = Flags; + m_Exports.push_back(Export); + m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined + m_Desc.NumExports = static_cast(m_Exports.size()); + } + template + void DefineExports(LPCWSTR(&Exports)[N]) + { + for (UINT i = 0; i < N; i++) + { + DefineExport(Exports[i]); + } + } + void DefineExports(const LPCWSTR* Exports, UINT N) + { + for (UINT i = 0; i < N; i++) + { + DefineExport(Exports[i]); + } + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_DXIL_LIBRARY_DESC&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + m_Strings.clear(); + m_Exports.clear(); + } + void* Data() noexcept override { return &m_Desc; } + D3D12_DXIL_LIBRARY_DESC m_Desc; + CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings; + std::vector m_Exports; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_EXISTING_COLLECTION_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_EXISTING_COLLECTION_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_EXISTING_COLLECTION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetExistingCollection(ID3D12StateObject*pExistingCollection) noexcept + { + m_Desc.pExistingCollection = pExistingCollection; + m_CollectionRef = pExistingCollection; + } + void DefineExport( + LPCWSTR Name, + LPCWSTR ExportToRename = nullptr, + D3D12_EXPORT_FLAGS Flags = D3D12_EXPORT_FLAG_NONE) + { + D3D12_EXPORT_DESC Export; + Export.Name = m_Strings.LocalCopy(Name); + Export.ExportToRename = m_Strings.LocalCopy(ExportToRename); + Export.Flags = Flags; + m_Exports.push_back(Export); + m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined + m_Desc.NumExports = static_cast(m_Exports.size()); + } + template + void DefineExports(LPCWSTR(&Exports)[N]) + { + for (UINT i = 0; i < N; i++) + { + DefineExport(Exports[i]); + } + } + void DefineExports(const LPCWSTR* Exports, UINT N) + { + for (UINT i = 0; i < N; i++) + { + DefineExport(Exports[i]); + } + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_EXISTING_COLLECTION_DESC&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + m_CollectionRef = nullptr; + m_Strings.clear(); + m_Exports.clear(); + } + void* Data() noexcept override { return &m_Desc; } + D3D12_EXISTING_COLLECTION_DESC m_Desc; + D3DX12_COM_PTR m_CollectionRef; + CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings; + std::vector m_Exports; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_SUBOBJECT_TO_EXPORTS_ASSOCIATION_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetSubobjectToAssociate(const D3D12_STATE_SUBOBJECT& SubobjectToAssociate) noexcept + { + m_Desc.pSubobjectToAssociate = &SubobjectToAssociate; + } + void AddExport(LPCWSTR Export) + { + m_Desc.NumExports++; + m_Exports.push_back(m_Strings.LocalCopy(Export)); + m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined + } + template + void AddExports(LPCWSTR (&Exports)[N]) + { + for (UINT i = 0; i < N; i++) + { + AddExport(Exports[i]); + } + } + void AddExports(const LPCWSTR* Exports, UINT N) + { + for (UINT i = 0; i < N; i++) + { + AddExport(Exports[i]); + } + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_SUBOBJECT_TO_EXPORTS_ASSOCIATION; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + m_Strings.clear(); + m_Exports.clear(); + } + void* Data() noexcept override { return &m_Desc; } + D3D12_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc; + CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings; + std::vector m_Exports; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION() noexcept + { + Init(); + } + CD3DX12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetSubobjectNameToAssociate(LPCWSTR SubobjectToAssociate) + { + m_Desc.SubobjectToAssociate = m_SubobjectName.LocalCopy(SubobjectToAssociate, true); + } + void AddExport(LPCWSTR Export) + { + m_Desc.NumExports++; + m_Exports.push_back(m_Strings.LocalCopy(Export)); + m_Desc.pExports = &m_Exports[0]; // using ugly way to get pointer in case .data() is not defined + } + template + void AddExports(LPCWSTR (&Exports)[N]) + { + for (UINT i = 0; i < N; i++) + { + AddExport(Exports[i]); + } + } + void AddExports(const LPCWSTR* Exports, UINT N) + { + for (UINT i = 0; i < N; i++) + { + AddExport(Exports[i]); + } + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + m_Strings.clear(); + m_SubobjectName.clear(); + m_Exports.clear(); + } + void* Data() noexcept override { return &m_Desc; } + D3D12_DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION m_Desc; + CD3DX12_STATE_OBJECT_DESC::StringContainer m_Strings; + CD3DX12_STATE_OBJECT_DESC::StringContainer m_SubobjectName; + std::vector m_Exports; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_HIT_GROUP_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_HIT_GROUP_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_HIT_GROUP_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetHitGroupExport(LPCWSTR exportName) + { + m_Desc.HitGroupExport = m_Strings[0].LocalCopy(exportName, true); + } + void SetHitGroupType(D3D12_HIT_GROUP_TYPE Type) noexcept { m_Desc.Type = Type; } + void SetAnyHitShaderImport(LPCWSTR importName) + { + m_Desc.AnyHitShaderImport = m_Strings[1].LocalCopy(importName, true); + } + void SetClosestHitShaderImport(LPCWSTR importName) + { + m_Desc.ClosestHitShaderImport = m_Strings[2].LocalCopy(importName, true); + } + void SetIntersectionShaderImport(LPCWSTR importName) + { + m_Desc.IntersectionShaderImport = m_Strings[3].LocalCopy(importName, true); + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_HIT_GROUP; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_HIT_GROUP_DESC&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + for (UINT i = 0; i < m_NumStrings; i++) + { + m_Strings[i].clear(); + } + } + void* Data() noexcept override { return &m_Desc; } + D3D12_HIT_GROUP_DESC m_Desc; + static constexpr UINT m_NumStrings = 4; + CD3DX12_STATE_OBJECT_DESC::StringContainer + m_Strings[m_NumStrings]; // one string for every entrypoint name +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_RAYTRACING_SHADER_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void Config(UINT MaxPayloadSizeInBytes, UINT MaxAttributeSizeInBytes) noexcept + { + m_Desc.MaxPayloadSizeInBytes = MaxPayloadSizeInBytes; + m_Desc.MaxAttributeSizeInBytes = MaxAttributeSizeInBytes; + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_RAYTRACING_SHADER_CONFIG&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + } + void* Data() noexcept override { return &m_Desc; } + D3D12_RAYTRACING_SHADER_CONFIG m_Desc; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_RAYTRACING_PIPELINE_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void Config(UINT MaxTraceRecursionDepth) noexcept + { + m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth; + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_RAYTRACING_PIPELINE_CONFIG&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + } + void* Data() noexcept override { return &m_Desc; } + D3D12_RAYTRACING_PIPELINE_CONFIG m_Desc; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_RAYTRACING_PIPELINE_CONFIG1_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void Config(UINT MaxTraceRecursionDepth, D3D12_RAYTRACING_PIPELINE_FLAGS Flags) noexcept + { + m_Desc.MaxTraceRecursionDepth = MaxTraceRecursionDepth; + m_Desc.Flags = Flags; + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_PIPELINE_CONFIG1; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_RAYTRACING_PIPELINE_CONFIG1&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + } + void* Data() noexcept override { return &m_Desc; } + D3D12_RAYTRACING_PIPELINE_CONFIG1 m_Desc; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_GLOBAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept + { + m_pRootSig = pRootSig; + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_pRootSig = nullptr; + } + void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); } + D3DX12_COM_PTR m_pRootSig; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_LOCAL_ROOT_SIGNATURE_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetRootSignature(ID3D12RootSignature* pRootSig) noexcept + { + m_pRootSig = pRootSig; + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_LOCAL_ROOT_SIGNATURE; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator ID3D12RootSignature*() const noexcept { return D3DX12_COM_PTR_GET(m_pRootSig); } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_pRootSig = nullptr; + } + void* Data() noexcept override { return D3DX12_COM_PTR_ADDRESSOF(m_pRootSig); } + D3DX12_COM_PTR m_pRootSig; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_STATE_OBJECT_CONFIG_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetFlags(D3D12_STATE_OBJECT_FLAGS Flags) noexcept + { + m_Desc.Flags = Flags; + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_STATE_OBJECT_CONFIG; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_STATE_OBJECT_CONFIG&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + } + void* Data() noexcept override { return &m_Desc; } + D3D12_STATE_OBJECT_CONFIG m_Desc; +}; + +//------------------------------------------------------------------------------------------------ +class CD3DX12_NODE_MASK_SUBOBJECT + : public CD3DX12_STATE_OBJECT_DESC::SUBOBJECT_HELPER_BASE +{ +public: + CD3DX12_NODE_MASK_SUBOBJECT() noexcept + { + Init(); + } + CD3DX12_NODE_MASK_SUBOBJECT(CD3DX12_STATE_OBJECT_DESC& ContainingStateObject) + { + Init(); + AddToStateObject(ContainingStateObject); + } + void SetNodeMask(UINT NodeMask) noexcept + { + m_Desc.NodeMask = NodeMask; + } + D3D12_STATE_SUBOBJECT_TYPE Type() const noexcept override + { + return D3D12_STATE_SUBOBJECT_TYPE_NODE_MASK; + } + operator const D3D12_STATE_SUBOBJECT&() const noexcept { return *m_pSubobject; } + operator const D3D12_NODE_MASK&() const noexcept { return m_Desc; } +private: + void Init() noexcept + { + SUBOBJECT_HELPER_BASE::Init(); + m_Desc = {}; + } + void* Data() noexcept override { return &m_Desc; } + D3D12_NODE_MASK m_Desc; +}; + +#endif // #ifndef D3DX12_NO_STATE_OBJECT_HELPERS + + +#if (defined(NTDDI_WIN10_CO) || defined(USING_D3D12_AGILITY_SDK)) && !defined(D3DX12_NO_CHECK_FEATURE_SUPPORT_CLASS) + +//------------------------------------------------------------------------------------------------ +#include + +class CD3DX12FeatureSupport +{ +public: // Function declaration + // Default constructor that creates an empty object + CD3DX12FeatureSupport() noexcept; + + // Initialize data from the given device + HRESULT Init(ID3D12Device* pDevice); + + // Retreives the status of the object. If an error occurred in the initialization process, the function returns the error code. + HRESULT GetStatus() const noexcept { return m_hStatus; } + + // Getter functions for each feature class + // D3D12_OPTIONS + BOOL DoublePrecisionFloatShaderOps() const noexcept; + BOOL OutputMergerLogicOp() const noexcept; + D3D12_SHADER_MIN_PRECISION_SUPPORT MinPrecisionSupport() const noexcept; + D3D12_TILED_RESOURCES_TIER TiledResourcesTier() const noexcept; + D3D12_RESOURCE_BINDING_TIER ResourceBindingTier() const noexcept; + BOOL PSSpecifiedStencilRefSupported() const noexcept; + BOOL TypedUAVLoadAdditionalFormats() const noexcept; + BOOL ROVsSupported() const noexcept; + D3D12_CONSERVATIVE_RASTERIZATION_TIER ConservativeRasterizationTier() const noexcept; + BOOL StandardSwizzle64KBSupported() const noexcept; + BOOL CrossAdapterRowMajorTextureSupported() const noexcept; + BOOL VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation() const noexcept; + D3D12_RESOURCE_HEAP_TIER ResourceHeapTier() const noexcept; + D3D12_CROSS_NODE_SHARING_TIER CrossNodeSharingTier() const noexcept; + UINT MaxGPUVirtualAddressBitsPerResource() const noexcept; + + // FEATURE_LEVELS + D3D_FEATURE_LEVEL MaxSupportedFeatureLevel() const noexcept; + + // FORMAT_SUPPORT + HRESULT FormatSupport(DXGI_FORMAT Format, D3D12_FORMAT_SUPPORT1& Support1, D3D12_FORMAT_SUPPORT2& Support2) const; + + // MUTLTISAMPLE_QUALITY_LEVELS + HRESULT MultisampleQualityLevels(DXGI_FORMAT Format, UINT SampleCount, D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags, UINT& NumQualityLevels) const; + + // FORMAT_INFO + HRESULT FormatInfo(DXGI_FORMAT Format, UINT8& PlaneCount) const; + + // GPU_VIRTUAL_ADDRESS_SUPPORT + UINT MaxGPUVirtualAddressBitsPerProcess() const noexcept; + + // SHADER_MODEL + D3D_SHADER_MODEL HighestShaderModel() const noexcept; + + // D3D12_OPTIONS1 + BOOL WaveOps() const noexcept; + UINT WaveLaneCountMin() const noexcept; + UINT WaveLaneCountMax() const noexcept; + UINT TotalLaneCount() const noexcept; + BOOL ExpandedComputeResourceStates() const noexcept; + BOOL Int64ShaderOps() const noexcept; + + // PROTECTED_RESOURCE_SESSION_SUPPORT + D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS ProtectedResourceSessionSupport(UINT NodeIndex = 0) const; + + // ROOT_SIGNATURE + D3D_ROOT_SIGNATURE_VERSION HighestRootSignatureVersion() const noexcept; + + // ARCHITECTURE1 + BOOL TileBasedRenderer(UINT NodeIndex = 0) const; + BOOL UMA(UINT NodeIndex = 0) const; + BOOL CacheCoherentUMA(UINT NodeIndex = 0) const; + BOOL IsolatedMMU(UINT NodeIndex = 0) const; + + // D3D12_OPTIONS2 + BOOL DepthBoundsTestSupported() const noexcept; + D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER ProgrammableSamplePositionsTier() const noexcept; + + // SHADER_CACHE + D3D12_SHADER_CACHE_SUPPORT_FLAGS ShaderCacheSupportFlags() const noexcept; + + // COMMAND_QUEUE_PRIORITY + BOOL CommandQueuePrioritySupported(D3D12_COMMAND_LIST_TYPE CommandListType, UINT Priority); + + // D3D12_OPTIONS3 + BOOL CopyQueueTimestampQueriesSupported() const noexcept; + BOOL CastingFullyTypedFormatSupported() const noexcept; + D3D12_COMMAND_LIST_SUPPORT_FLAGS WriteBufferImmediateSupportFlags() const noexcept; + D3D12_VIEW_INSTANCING_TIER ViewInstancingTier() const noexcept; + BOOL BarycentricsSupported() const noexcept; + + // EXISTING_HEAPS + BOOL ExistingHeapsSupported() const noexcept; + + // D3D12_OPTIONS4 + BOOL MSAA64KBAlignedTextureSupported() const noexcept; + D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER SharedResourceCompatibilityTier() const noexcept; + BOOL Native16BitShaderOpsSupported() const noexcept; + + // SERIALIZATION + D3D12_HEAP_SERIALIZATION_TIER HeapSerializationTier(UINT NodeIndex = 0) const; + + // CROSS_NODE + // CrossNodeSharingTier handled in D3D12Options + BOOL CrossNodeAtomicShaderInstructions() const noexcept; + + // D3D12_OPTIONS5 + BOOL SRVOnlyTiledResourceTier3() const noexcept; + D3D12_RENDER_PASS_TIER RenderPassesTier() const noexcept; + D3D12_RAYTRACING_TIER RaytracingTier() const noexcept; + + // DISPLAYABLE + BOOL DisplayableTexture() const noexcept; + // SharedResourceCompatibilityTier handled in D3D12Options4 + + // D3D12_OPTIONS6 + BOOL AdditionalShadingRatesSupported() const noexcept; + BOOL PerPrimitiveShadingRateSupportedWithViewportIndexing() const noexcept; + D3D12_VARIABLE_SHADING_RATE_TIER VariableShadingRateTier() const noexcept; + UINT ShadingRateImageTileSize() const noexcept; + BOOL BackgroundProcessingSupported() const noexcept; + + // QUERY_META_COMMAND + HRESULT QueryMetaCommand(D3D12_FEATURE_DATA_QUERY_META_COMMAND& dQueryMetaCommand) const; + + // D3D12_OPTIONS7 + D3D12_MESH_SHADER_TIER MeshShaderTier() const noexcept; + D3D12_SAMPLER_FEEDBACK_TIER SamplerFeedbackTier() const noexcept; + + // PROTECTED_RESOURCE_SESSION_TYPE_COUNT + UINT ProtectedResourceSessionTypeCount(UINT NodeIndex = 0) const; + + // PROTECTED_RESOURCE_SESSION_TYPES + std::vector ProtectedResourceSessionTypes(UINT NodeIndex = 0) const; + + // D3D12_OPTIONS8 + BOOL UnalignedBlockTexturesSupported() const noexcept; + + // D3D12_OPTIONS9 + BOOL MeshShaderPipelineStatsSupported() const noexcept; + BOOL MeshShaderSupportsFullRangeRenderTargetArrayIndex() const noexcept; + BOOL AtomicInt64OnTypedResourceSupported() const noexcept; + BOOL AtomicInt64OnGroupSharedSupported() const noexcept; + BOOL DerivativesInMeshAndAmplificationShadersSupported() const noexcept; + D3D12_WAVE_MMA_TIER WaveMMATier() const noexcept; + + // D3D12_OPTIONS10 + BOOL VariableRateShadingSumCombinerSupported() const noexcept; + BOOL MeshShaderPerPrimitiveShadingRateSupported() const noexcept; + + // D3D12_OPTIONS11 + BOOL AtomicInt64OnDescriptorHeapResourceSupported() const noexcept; + +private: // Private structs and helpers declaration + struct ProtectedResourceSessionTypesLocal : D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPES + { + std::vector TypeVec; + }; + + // Helper function to decide the highest shader model supported by the system + // Stores the result in m_dShaderModel + // Must be updated whenever a new shader model is added to the d3d12.h header + HRESULT QueryHighestShaderModel(); + + // Helper function to decide the highest root signature supported + // Must be updated whenever a new root signature version is added to the d3d12.h header + HRESULT QueryHighestRootSignatureVersion(); + + // Helper funcion to decide the highest feature level + HRESULT QueryHighestFeatureLevel(); + + // Helper function to initialize local protected resource session types structs + HRESULT QueryProtectedResourceSessionTypes(UINT NodeIndex, UINT Count); + +private: // Member data + // Pointer to the underlying device + ID3D12Device* m_pDevice; + + // Stores the error code from initialization + HRESULT m_hStatus; + + // Feature support data structs + D3D12_FEATURE_DATA_D3D12_OPTIONS m_dOptions; + D3D_FEATURE_LEVEL m_eMaxFeatureLevel; + D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT m_dGPUVASupport; + D3D12_FEATURE_DATA_SHADER_MODEL m_dShaderModel; + D3D12_FEATURE_DATA_D3D12_OPTIONS1 m_dOptions1; + std::vector m_dProtectedResourceSessionSupport; + D3D12_FEATURE_DATA_ROOT_SIGNATURE m_dRootSignature; + std::vector m_dArchitecture1; + D3D12_FEATURE_DATA_D3D12_OPTIONS2 m_dOptions2; + D3D12_FEATURE_DATA_SHADER_CACHE m_dShaderCache; + D3D12_FEATURE_DATA_COMMAND_QUEUE_PRIORITY m_dCommandQueuePriority; + D3D12_FEATURE_DATA_D3D12_OPTIONS3 m_dOptions3; + D3D12_FEATURE_DATA_EXISTING_HEAPS m_dExistingHeaps; + D3D12_FEATURE_DATA_D3D12_OPTIONS4 m_dOptions4; + std::vector m_dSerialization; // Cat2 NodeIndex + D3D12_FEATURE_DATA_CROSS_NODE m_dCrossNode; + D3D12_FEATURE_DATA_D3D12_OPTIONS5 m_dOptions5; + D3D12_FEATURE_DATA_DISPLAYABLE m_dDisplayable; + D3D12_FEATURE_DATA_D3D12_OPTIONS6 m_dOptions6; + D3D12_FEATURE_DATA_D3D12_OPTIONS7 m_dOptions7; + std::vector m_dProtectedResourceSessionTypeCount; // Cat2 NodeIndex + std::vector m_dProtectedResourceSessionTypes; // Cat3 + D3D12_FEATURE_DATA_D3D12_OPTIONS8 m_dOptions8; + D3D12_FEATURE_DATA_D3D12_OPTIONS9 m_dOptions9; + D3D12_FEATURE_DATA_D3D12_OPTIONS10 m_dOptions10; + D3D12_FEATURE_DATA_D3D12_OPTIONS11 m_dOptions11; +}; + +// Implementations for CD3DX12FeatureSupport functions + +// Macro to set up a getter function for each entry in feature support data +// The getter function will have the same name as the feature option name +#define FEATURE_SUPPORT_GET(RETTYPE,FEATURE,OPTION) \ +inline RETTYPE CD3DX12FeatureSupport::OPTION() const noexcept \ +{ \ + return FEATURE.OPTION; \ +} + +// Macro to set up a getter function for each entry in feature support data +// Also specifies the name for the function which can be different from the feature name +#define FEATURE_SUPPORT_GET_NAME(RETTYPE,FEATURE,OPTION,NAME) \ +inline RETTYPE CD3DX12FeatureSupport::NAME() const noexcept \ +{\ + return FEATURE.OPTION; \ +} + +// Macro to set up a getter function for feature data indexed by the graphics node ID +// The default parameter is 0, or the first availabe graphics device node +#define FEATURE_SUPPORT_GET_NODE_INDEXED(RETTYPE,FEATURE,OPTION) \ +inline RETTYPE CD3DX12FeatureSupport::OPTION(UINT NodeIndex) const \ +{\ + return FEATURE[NodeIndex].OPTION; \ +} + +// Macro to set up a getter function for feature data indexed by NodeIndex +// Allows a custom name for the getter function +#define FEATURE_SUPPORT_GET_NODE_INDEXED_NAME(RETTYPE,FEATURE,OPTION,NAME) \ +inline RETTYPE CD3DX12FeatureSupport::NAME(UINT NodeIndex) const \ +{\ + return FEATURE[NodeIndex].OPTION; \ +} + +inline CD3DX12FeatureSupport::CD3DX12FeatureSupport() noexcept +: m_pDevice(nullptr) +, m_hStatus(E_INVALIDARG) +, m_dOptions{} +, m_eMaxFeatureLevel{} +, m_dGPUVASupport{} +, m_dShaderModel{} +, m_dOptions1{} +, m_dRootSignature{} +, m_dOptions2{} +, m_dShaderCache{} +, m_dCommandQueuePriority{} +, m_dOptions3{} +, m_dExistingHeaps{} +, m_dOptions4{} +, m_dCrossNode{} +, m_dOptions5{} +, m_dDisplayable{} +, m_dOptions6{} +, m_dOptions7{} +, m_dOptions8{} +, m_dOptions9{} +, m_dOptions10{} +, m_dOptions11{} +{} + +inline HRESULT CD3DX12FeatureSupport::Init(ID3D12Device* pDevice) +{ + if (!pDevice) + { + m_hStatus = E_INVALIDARG; + return m_hStatus; + } + + m_pDevice = pDevice; + + // Initialize static feature support data structures + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &m_dOptions, sizeof(m_dOptions)))) + { + m_dOptions.DoublePrecisionFloatShaderOps = false; + m_dOptions.OutputMergerLogicOp = false; + m_dOptions.MinPrecisionSupport = D3D12_SHADER_MIN_PRECISION_SUPPORT_NONE; + m_dOptions.TiledResourcesTier = D3D12_TILED_RESOURCES_TIER_NOT_SUPPORTED; + m_dOptions.ResourceBindingTier = static_cast(0); + m_dOptions.PSSpecifiedStencilRefSupported = false; + m_dOptions.TypedUAVLoadAdditionalFormats = false; + m_dOptions.ROVsSupported = false; + m_dOptions.ConservativeRasterizationTier = D3D12_CONSERVATIVE_RASTERIZATION_TIER_NOT_SUPPORTED; + m_dOptions.MaxGPUVirtualAddressBitsPerResource = 0; + m_dOptions.StandardSwizzle64KBSupported = false; + m_dOptions.CrossNodeSharingTier = D3D12_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED; + m_dOptions.CrossAdapterRowMajorTextureSupported = false; + m_dOptions.VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation = false; + m_dOptions.ResourceHeapTier = static_cast(0); + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT, &m_dGPUVASupport, sizeof(m_dGPUVASupport)))) + { + m_dGPUVASupport.MaxGPUVirtualAddressBitsPerProcess = 0; + m_dGPUVASupport.MaxGPUVirtualAddressBitsPerResource = 0; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS1, &m_dOptions1, sizeof(m_dOptions1)))) + { + m_dOptions1.WaveOps = false; + m_dOptions1.WaveLaneCountMax = 0; + m_dOptions1.WaveLaneCountMin = 0; + m_dOptions1.TotalLaneCount = 0; + m_dOptions1.ExpandedComputeResourceStates = 0; + m_dOptions1.Int64ShaderOps = 0; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS2, &m_dOptions2, sizeof(m_dOptions2)))) + { + m_dOptions2.DepthBoundsTestSupported = false; + m_dOptions2.ProgrammableSamplePositionsTier = D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_NOT_SUPPORTED; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SHADER_CACHE, &m_dShaderCache, sizeof(m_dShaderCache)))) + { + m_dShaderCache.SupportFlags = D3D12_SHADER_CACHE_SUPPORT_NONE; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS3, &m_dOptions3, sizeof(m_dOptions3)))) + { + m_dOptions3.CopyQueueTimestampQueriesSupported = false; + m_dOptions3.CastingFullyTypedFormatSupported = false; + m_dOptions3.WriteBufferImmediateSupportFlags = D3D12_COMMAND_LIST_SUPPORT_FLAG_NONE; + m_dOptions3.ViewInstancingTier = D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED; + m_dOptions3.BarycentricsSupported = false; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_EXISTING_HEAPS, &m_dExistingHeaps, sizeof(m_dExistingHeaps)))) + { + m_dExistingHeaps.Supported = false; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS4, &m_dOptions4, sizeof(m_dOptions4)))) + { + m_dOptions4.MSAA64KBAlignedTextureSupported = false; + m_dOptions4.Native16BitShaderOpsSupported = false; + m_dOptions4.SharedResourceCompatibilityTier = D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_0; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_CROSS_NODE, &m_dCrossNode, sizeof(m_dCrossNode)))) + { + m_dCrossNode.SharingTier = D3D12_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED; + m_dCrossNode.AtomicShaderInstructions = false; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS5, &m_dOptions5, sizeof(m_dOptions5)))) + { + m_dOptions5.SRVOnlyTiledResourceTier3 = false; + m_dOptions5.RenderPassesTier = D3D12_RENDER_PASS_TIER_0; + m_dOptions5.RaytracingTier = D3D12_RAYTRACING_TIER_NOT_SUPPORTED; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_DISPLAYABLE, &m_dDisplayable, sizeof(m_dDisplayable)))) + { + m_dDisplayable.DisplayableTexture = false; + m_dDisplayable.SharedResourceCompatibilityTier = D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER_0; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS6, &m_dOptions6, sizeof(m_dOptions6)))) + { + m_dOptions6.AdditionalShadingRatesSupported = false; + m_dOptions6.PerPrimitiveShadingRateSupportedWithViewportIndexing = false; + m_dOptions6.VariableShadingRateTier = D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED; + m_dOptions6.ShadingRateImageTileSize = 0; + m_dOptions6.BackgroundProcessingSupported = false; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &m_dOptions7, sizeof(m_dOptions7)))) + { + m_dOptions7.MeshShaderTier = D3D12_MESH_SHADER_TIER_NOT_SUPPORTED; + m_dOptions7.SamplerFeedbackTier = D3D12_SAMPLER_FEEDBACK_TIER_NOT_SUPPORTED; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS8, &m_dOptions8, sizeof(m_dOptions8)))) + { + m_dOptions8.UnalignedBlockTexturesSupported = false; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS9, &m_dOptions9, sizeof(m_dOptions9)))) + { + m_dOptions9.MeshShaderPipelineStatsSupported = false; + m_dOptions9.MeshShaderSupportsFullRangeRenderTargetArrayIndex = false; + m_dOptions9.AtomicInt64OnGroupSharedSupported = false; + m_dOptions9.AtomicInt64OnTypedResourceSupported = false; + m_dOptions9.DerivativesInMeshAndAmplificationShadersSupported = false; + m_dOptions9.WaveMMATier = D3D12_WAVE_MMA_TIER_NOT_SUPPORTED; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS10, &m_dOptions10, sizeof(m_dOptions10)))) + { + m_dOptions10.MeshShaderPerPrimitiveShadingRateSupported = false; + m_dOptions10.VariableRateShadingSumCombinerSupported = false; + } + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS11, &m_dOptions11, sizeof(m_dOptions11)))) + { + m_dOptions11.AtomicInt64OnDescriptorHeapResourceSupported = false; + } + + // Initialize per-node feature support data structures + const UINT uNodeCount = m_pDevice->GetNodeCount(); + m_dProtectedResourceSessionSupport.resize(uNodeCount); + m_dArchitecture1.resize(uNodeCount); + m_dSerialization.resize(uNodeCount); + m_dProtectedResourceSessionTypeCount.resize(uNodeCount); + m_dProtectedResourceSessionTypes.resize(uNodeCount); + for (UINT NodeIndex = 0; NodeIndex < uNodeCount; NodeIndex++) + { + m_dProtectedResourceSessionSupport[NodeIndex].NodeIndex = NodeIndex; + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_SUPPORT, &m_dProtectedResourceSessionSupport[NodeIndex], sizeof(m_dProtectedResourceSessionSupport[NodeIndex])))) + { + m_dProtectedResourceSessionSupport[NodeIndex].Support = D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAG_NONE; + } + + m_dArchitecture1[NodeIndex].NodeIndex = NodeIndex; + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_ARCHITECTURE1, &m_dArchitecture1[NodeIndex], sizeof(m_dArchitecture1[NodeIndex])))) + { + D3D12_FEATURE_DATA_ARCHITECTURE dArchLocal = {}; + dArchLocal.NodeIndex = NodeIndex; + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_ARCHITECTURE, &dArchLocal, sizeof(dArchLocal)))) + { + dArchLocal.TileBasedRenderer = false; + dArchLocal.UMA = false; + dArchLocal.CacheCoherentUMA = false; + } + + m_dArchitecture1[NodeIndex].TileBasedRenderer = dArchLocal.TileBasedRenderer; + m_dArchitecture1[NodeIndex].UMA = dArchLocal.UMA; + m_dArchitecture1[NodeIndex].CacheCoherentUMA = dArchLocal.CacheCoherentUMA; + m_dArchitecture1[NodeIndex].IsolatedMMU = false; + } + + m_dSerialization[NodeIndex].NodeIndex = NodeIndex; + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SERIALIZATION, &m_dSerialization[NodeIndex], sizeof(m_dSerialization[NodeIndex])))) + { + m_dSerialization[NodeIndex].HeapSerializationTier = D3D12_HEAP_SERIALIZATION_TIER_0; + } + + m_dProtectedResourceSessionTypeCount[NodeIndex].NodeIndex = NodeIndex; + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_TYPE_COUNT, &m_dProtectedResourceSessionTypeCount[NodeIndex], sizeof(m_dProtectedResourceSessionTypeCount[NodeIndex])))) + { + m_dProtectedResourceSessionTypeCount[NodeIndex].Count = 0; + } + + // Special procedure to initialize local protected resource session types structs + // Must wait until session type count initialized + QueryProtectedResourceSessionTypes(NodeIndex, m_dProtectedResourceSessionTypeCount[NodeIndex].Count); + } + + // Initialize features that requires highest version check + if (FAILED(m_hStatus = QueryHighestShaderModel())) + { + return m_hStatus; + } + + if (FAILED(m_hStatus = QueryHighestRootSignatureVersion())) + { + return m_hStatus; + } + + // Initialize Feature Levels data + if (FAILED(m_hStatus = QueryHighestFeatureLevel())) + { + return m_hStatus; + } + + return m_hStatus; +} + +// 0: D3D12_OPTIONS +FEATURE_SUPPORT_GET(BOOL, m_dOptions, DoublePrecisionFloatShaderOps); +FEATURE_SUPPORT_GET(BOOL, m_dOptions, OutputMergerLogicOp); +FEATURE_SUPPORT_GET(D3D12_SHADER_MIN_PRECISION_SUPPORT, m_dOptions, MinPrecisionSupport); +FEATURE_SUPPORT_GET(D3D12_TILED_RESOURCES_TIER, m_dOptions, TiledResourcesTier); +FEATURE_SUPPORT_GET(D3D12_RESOURCE_BINDING_TIER, m_dOptions, ResourceBindingTier); +FEATURE_SUPPORT_GET(BOOL, m_dOptions, PSSpecifiedStencilRefSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions, TypedUAVLoadAdditionalFormats); +FEATURE_SUPPORT_GET(BOOL, m_dOptions, ROVsSupported); +FEATURE_SUPPORT_GET(D3D12_CONSERVATIVE_RASTERIZATION_TIER, m_dOptions, ConservativeRasterizationTier); +FEATURE_SUPPORT_GET(BOOL, m_dOptions, StandardSwizzle64KBSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions, CrossAdapterRowMajorTextureSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions, VPAndRTArrayIndexFromAnyShaderFeedingRasterizerSupportedWithoutGSEmulation); +FEATURE_SUPPORT_GET(D3D12_RESOURCE_HEAP_TIER, m_dOptions, ResourceHeapTier); + +// Special procedure for handling caps that is also part of other features +inline D3D12_CROSS_NODE_SHARING_TIER CD3DX12FeatureSupport::CrossNodeSharingTier() const noexcept +{ + if (m_dCrossNode.SharingTier > D3D12_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED) + { + return m_dCrossNode.SharingTier; + } + else + { + return m_dOptions.CrossNodeSharingTier; + } +} + +inline UINT CD3DX12FeatureSupport::MaxGPUVirtualAddressBitsPerResource() const noexcept +{ + if (m_dOptions.MaxGPUVirtualAddressBitsPerResource > 0) + { + return m_dOptions.MaxGPUVirtualAddressBitsPerResource; + } + else + { + return m_dGPUVASupport.MaxGPUVirtualAddressBitsPerResource; + } +} + +// 1: Architecture +// Combined with Architecture1 + +// 2: Feature Levels +// Simply returns the highest supported feature level +inline D3D_FEATURE_LEVEL CD3DX12FeatureSupport::MaxSupportedFeatureLevel() const noexcept +{ + return m_eMaxFeatureLevel; +} + +// 3: Feature Format Support +inline HRESULT CD3DX12FeatureSupport::FormatSupport(DXGI_FORMAT Format, D3D12_FORMAT_SUPPORT1& Support1, D3D12_FORMAT_SUPPORT2& Support2) const +{ + D3D12_FEATURE_DATA_FORMAT_SUPPORT dFormatSupport; + dFormatSupport.Format = Format; + + // It is possible that the function call returns an error + HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_SUPPORT, &dFormatSupport, sizeof(D3D12_FEATURE_DATA_FORMAT_SUPPORT)); + + Support1 = dFormatSupport.Support1; + Support2 = dFormatSupport.Support2; // Two outputs. Probably better just to take in the struct as an argument? + + return result; +} + +// 4: Multisample Quality Levels +inline HRESULT CD3DX12FeatureSupport::MultisampleQualityLevels(DXGI_FORMAT Format, UINT SampleCount, D3D12_MULTISAMPLE_QUALITY_LEVEL_FLAGS Flags, UINT& NumQualityLevels) const +{ + D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS dMultisampleQualityLevels; + dMultisampleQualityLevels.Format = Format; + dMultisampleQualityLevels.SampleCount = SampleCount; + dMultisampleQualityLevels.Flags = Flags; + + HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &dMultisampleQualityLevels, sizeof(D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS)); + + if (SUCCEEDED(result)) + { + NumQualityLevels = dMultisampleQualityLevels.NumQualityLevels; + } + else + { + NumQualityLevels = 0; + } + + return result; +} + +// 5: Format Info +inline HRESULT CD3DX12FeatureSupport::FormatInfo(DXGI_FORMAT Format, UINT8& PlaneCount) const +{ + D3D12_FEATURE_DATA_FORMAT_INFO dFormatInfo; + dFormatInfo.Format = Format; + + HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &dFormatInfo, sizeof(D3D12_FEATURE_DATA_FORMAT_INFO)); + if (FAILED(result)) + { + PlaneCount = 0; + } + else + { + PlaneCount = dFormatInfo.PlaneCount; + } + return result; +} + +// 6: GPU Virtual Address Support +// MaxGPUVirtualAddressBitsPerResource handled in D3D12Options +FEATURE_SUPPORT_GET(UINT, m_dGPUVASupport, MaxGPUVirtualAddressBitsPerProcess); + +// 7: Shader Model +inline D3D_SHADER_MODEL CD3DX12FeatureSupport::HighestShaderModel() const noexcept +{ + return m_dShaderModel.HighestShaderModel; +} + +// 8: D3D12 Options1 +FEATURE_SUPPORT_GET(BOOL, m_dOptions1, WaveOps); +FEATURE_SUPPORT_GET(UINT, m_dOptions1, WaveLaneCountMin); +FEATURE_SUPPORT_GET(UINT, m_dOptions1, WaveLaneCountMax); +FEATURE_SUPPORT_GET(UINT, m_dOptions1, TotalLaneCount); +FEATURE_SUPPORT_GET(BOOL, m_dOptions1, ExpandedComputeResourceStates); +FEATURE_SUPPORT_GET(BOOL, m_dOptions1, Int64ShaderOps); + +// 10: Protected Resource Session Support +inline D3D12_PROTECTED_RESOURCE_SESSION_SUPPORT_FLAGS CD3DX12FeatureSupport::ProtectedResourceSessionSupport(UINT NodeIndex) const +{ + return m_dProtectedResourceSessionSupport[NodeIndex].Support; +} + +// 12: Root Signature +inline D3D_ROOT_SIGNATURE_VERSION CD3DX12FeatureSupport::HighestRootSignatureVersion() const noexcept +{ + return m_dRootSignature.HighestVersion; +} + +// 16: Architecture1 +// Same data fields can be queried from m_dArchitecture +FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, TileBasedRenderer); +FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, UMA); +FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, CacheCoherentUMA); +FEATURE_SUPPORT_GET_NODE_INDEXED(BOOL, m_dArchitecture1, IsolatedMMU); + +// 18: D3D12 Options2 +FEATURE_SUPPORT_GET(BOOL, m_dOptions2, DepthBoundsTestSupported); +FEATURE_SUPPORT_GET(D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER, m_dOptions2, ProgrammableSamplePositionsTier); + +// 19: Shader Cache +FEATURE_SUPPORT_GET_NAME(D3D12_SHADER_CACHE_SUPPORT_FLAGS, m_dShaderCache, SupportFlags, ShaderCacheSupportFlags); + +// 20: Command Queue Priority +inline BOOL CD3DX12FeatureSupport::CommandQueuePrioritySupported(D3D12_COMMAND_LIST_TYPE CommandListType, UINT Priority) +{ + m_dCommandQueuePriority.CommandListType = CommandListType; + m_dCommandQueuePriority.Priority = Priority; + + if (FAILED(m_pDevice->CheckFeatureSupport(D3D12_FEATURE_COMMAND_QUEUE_PRIORITY, &m_dCommandQueuePriority, sizeof(D3D12_FEATURE_DATA_COMMAND_QUEUE_PRIORITY)))) + { + return false; + } + + return m_dCommandQueuePriority.PriorityForTypeIsSupported; +} + +// 21: D3D12 Options3 +FEATURE_SUPPORT_GET(BOOL, m_dOptions3, CopyQueueTimestampQueriesSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions3, CastingFullyTypedFormatSupported); +FEATURE_SUPPORT_GET(D3D12_COMMAND_LIST_SUPPORT_FLAGS, m_dOptions3, WriteBufferImmediateSupportFlags); +FEATURE_SUPPORT_GET(D3D12_VIEW_INSTANCING_TIER, m_dOptions3, ViewInstancingTier); +FEATURE_SUPPORT_GET(BOOL, m_dOptions3, BarycentricsSupported); + +// 22: Existing Heaps +FEATURE_SUPPORT_GET_NAME(BOOL, m_dExistingHeaps, Supported, ExistingHeapsSupported); + +// 23: D3D12 Options4 +FEATURE_SUPPORT_GET(BOOL, m_dOptions4, MSAA64KBAlignedTextureSupported); +FEATURE_SUPPORT_GET(D3D12_SHARED_RESOURCE_COMPATIBILITY_TIER, m_dOptions4, SharedResourceCompatibilityTier); +FEATURE_SUPPORT_GET(BOOL, m_dOptions4, Native16BitShaderOpsSupported); + +// 24: Serialization +FEATURE_SUPPORT_GET_NODE_INDEXED(D3D12_HEAP_SERIALIZATION_TIER, m_dSerialization, HeapSerializationTier); + +// 25: Cross Node +// CrossNodeSharingTier handled in D3D12Options +FEATURE_SUPPORT_GET_NAME(BOOL, m_dCrossNode, AtomicShaderInstructions, CrossNodeAtomicShaderInstructions); + +// 27: D3D12 Options5 +FEATURE_SUPPORT_GET(BOOL, m_dOptions5, SRVOnlyTiledResourceTier3); +FEATURE_SUPPORT_GET(D3D12_RENDER_PASS_TIER, m_dOptions5, RenderPassesTier); +FEATURE_SUPPORT_GET(D3D12_RAYTRACING_TIER, m_dOptions5, RaytracingTier); + +// 28: Displayable +FEATURE_SUPPORT_GET(BOOL, m_dDisplayable, DisplayableTexture); +// SharedResourceCompatibilityTier handled in D3D12Options4 + +// 30: D3D12 Options6 +FEATURE_SUPPORT_GET(BOOL, m_dOptions6, AdditionalShadingRatesSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions6, PerPrimitiveShadingRateSupportedWithViewportIndexing); +FEATURE_SUPPORT_GET(D3D12_VARIABLE_SHADING_RATE_TIER, m_dOptions6, VariableShadingRateTier); +FEATURE_SUPPORT_GET(UINT, m_dOptions6, ShadingRateImageTileSize); +FEATURE_SUPPORT_GET(BOOL, m_dOptions6, BackgroundProcessingSupported); + +// 31: Query Meta Command +// Keep the original call routine +inline HRESULT CD3DX12FeatureSupport::QueryMetaCommand(D3D12_FEATURE_DATA_QUERY_META_COMMAND& dQueryMetaCommand) const +{ + return m_pDevice->CheckFeatureSupport(D3D12_FEATURE_QUERY_META_COMMAND, &dQueryMetaCommand, sizeof(D3D12_FEATURE_DATA_QUERY_META_COMMAND)); +} + +// 32: D3D12 Options7 +FEATURE_SUPPORT_GET(D3D12_MESH_SHADER_TIER, m_dOptions7, MeshShaderTier); +FEATURE_SUPPORT_GET(D3D12_SAMPLER_FEEDBACK_TIER, m_dOptions7, SamplerFeedbackTier); + +// 33: Protected Resource Session Type Count +FEATURE_SUPPORT_GET_NODE_INDEXED_NAME(UINT, m_dProtectedResourceSessionTypeCount, Count, ProtectedResourceSessionTypeCount); + +// 34: Protected Resource Session Types +FEATURE_SUPPORT_GET_NODE_INDEXED_NAME(std::vector, m_dProtectedResourceSessionTypes, TypeVec, ProtectedResourceSessionTypes); + +// 36: Options8 +FEATURE_SUPPORT_GET(BOOL, m_dOptions8, UnalignedBlockTexturesSupported); + +// 37: Options9 +FEATURE_SUPPORT_GET(BOOL, m_dOptions9, MeshShaderPipelineStatsSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions9, MeshShaderSupportsFullRangeRenderTargetArrayIndex); +FEATURE_SUPPORT_GET(BOOL, m_dOptions9, AtomicInt64OnTypedResourceSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions9, AtomicInt64OnGroupSharedSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions9, DerivativesInMeshAndAmplificationShadersSupported); +FEATURE_SUPPORT_GET(D3D12_WAVE_MMA_TIER, m_dOptions9, WaveMMATier); + +// 39: Options10 +FEATURE_SUPPORT_GET(BOOL, m_dOptions10, VariableRateShadingSumCombinerSupported); +FEATURE_SUPPORT_GET(BOOL, m_dOptions10, MeshShaderPerPrimitiveShadingRateSupported); + +// 40: Options11 +FEATURE_SUPPORT_GET(BOOL, m_dOptions11, AtomicInt64OnDescriptorHeapResourceSupported); + +// Helper function to decide the highest shader model supported by the system +// Stores the result in m_dShaderModel +// Must be updated whenever a new shader model is added to the d3d12.h header +inline HRESULT CD3DX12FeatureSupport::QueryHighestShaderModel() +{ + // Check support in descending order + HRESULT result; + + const D3D_SHADER_MODEL allModelVersions[] = + { + D3D_SHADER_MODEL_6_7, + D3D_SHADER_MODEL_6_6, + D3D_SHADER_MODEL_6_5, + D3D_SHADER_MODEL_6_4, + D3D_SHADER_MODEL_6_3, + D3D_SHADER_MODEL_6_2, + D3D_SHADER_MODEL_6_1, + D3D_SHADER_MODEL_6_0, + D3D_SHADER_MODEL_5_1 + }; + constexpr size_t numModelVersions = sizeof(allModelVersions) / sizeof(D3D_SHADER_MODEL); + + for (size_t i = 0; i < numModelVersions; i++) + { + m_dShaderModel.HighestShaderModel = allModelVersions[i]; + result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &m_dShaderModel, sizeof(D3D12_FEATURE_DATA_SHADER_MODEL)); + if (result != E_INVALIDARG) + { + // Indicates that the version is recognizable by the runtime and stored in the struct + // Also terminate on unexpected error code + if (FAILED(result)) + { + m_dShaderModel.HighestShaderModel = static_cast(0); + } + return result; + } + } + + // Shader model may not be supported. Continue the rest initializations + m_dShaderModel.HighestShaderModel = static_cast(0); + return S_OK; +} + +// Helper function to decide the highest root signature supported +// Must be updated whenever a new root signature version is added to the d3d12.h header +inline HRESULT CD3DX12FeatureSupport::QueryHighestRootSignatureVersion() +{ + HRESULT result; + + const D3D_ROOT_SIGNATURE_VERSION allRootSignatureVersions[] = + { + D3D_ROOT_SIGNATURE_VERSION_1_1, + D3D_ROOT_SIGNATURE_VERSION_1_0, + D3D_ROOT_SIGNATURE_VERSION_1, + }; + constexpr size_t numRootSignatureVersions = sizeof(allRootSignatureVersions) / sizeof(D3D_ROOT_SIGNATURE_VERSION); + + for (size_t i = 0; i < numRootSignatureVersions; i++) + { + m_dRootSignature.HighestVersion = allRootSignatureVersions[i]; + result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_ROOT_SIGNATURE, &m_dRootSignature, sizeof(D3D12_FEATURE_DATA_ROOT_SIGNATURE)); + if (result != E_INVALIDARG) + { + if (FAILED(result)) + { + m_dRootSignature.HighestVersion = static_cast(0); + } + // If succeeded, the highest version is already written into the member struct + return result; + } + } + + // No version left. Set to invalid value and continue. + m_dRootSignature.HighestVersion = static_cast(0); + return S_OK; +} + +// Helper funcion to decide the highest feature level +inline HRESULT CD3DX12FeatureSupport::QueryHighestFeatureLevel() +{ + HRESULT result; + + // Check against a list of all feature levels present in d3dcommon.h + // Needs to be updated for future feature levels + const D3D_FEATURE_LEVEL allLevels[] = + { + D3D_FEATURE_LEVEL_12_2, + D3D_FEATURE_LEVEL_12_1, + D3D_FEATURE_LEVEL_12_0, + D3D_FEATURE_LEVEL_11_1, + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, + D3D_FEATURE_LEVEL_9_2, + D3D_FEATURE_LEVEL_9_1, + D3D_FEATURE_LEVEL_1_0_CORE + }; + + D3D12_FEATURE_DATA_FEATURE_LEVELS dFeatureLevel; + dFeatureLevel.NumFeatureLevels = static_cast(sizeof(allLevels) / sizeof(D3D_FEATURE_LEVEL)); + dFeatureLevel.pFeatureLevelsRequested = allLevels; + + result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &dFeatureLevel, sizeof(D3D12_FEATURE_DATA_FEATURE_LEVELS)); + if (SUCCEEDED(result)) + { + m_eMaxFeatureLevel = dFeatureLevel.MaxSupportedFeatureLevel; + } + else + { + m_eMaxFeatureLevel = static_cast(0); + + if (result == DXGI_ERROR_UNSUPPORTED) + { + // Indicates that none supported. Continue initialization + result = S_OK; + } + } + return result; +} + +// Helper function to initialize local protected resource session types structs +inline HRESULT CD3DX12FeatureSupport::QueryProtectedResourceSessionTypes(UINT NodeIndex, UINT Count) +{ + auto& CurrentPRSTypes = m_dProtectedResourceSessionTypes[NodeIndex]; + CurrentPRSTypes.NodeIndex = NodeIndex; + CurrentPRSTypes.Count = Count; + CurrentPRSTypes.TypeVec.resize(CurrentPRSTypes.Count); + CurrentPRSTypes.pTypes = CurrentPRSTypes.TypeVec.data(); + + HRESULT result = m_pDevice->CheckFeatureSupport(D3D12_FEATURE_PROTECTED_RESOURCE_SESSION_TYPES, &m_dProtectedResourceSessionTypes[NodeIndex], sizeof(D3D12_FEATURE_DATA_PROTECTED_RESOURCE_SESSION_TYPES)); + if (FAILED(result)) + { + // Resize TypeVec to empty + CurrentPRSTypes.TypeVec.clear(); + } + + return result; +} + +#undef FEATURE_SUPPORT_GET +#undef FEATURE_SUPPORT_GET_NAME +#undef FEATURE_SUPPORT_GET_NODE_INDEXED +#undef FEATURE_SUPPORT_GET_NODE_INDEXED_NAME + +// end CD3DX12FeatureSupport + +#endif // #ifndef D3DX12_NO_CHECK_FEATURE_SUPPORT_CLASS + +#undef D3DX12_COM_PTR +#undef D3DX12_COM_PTR_GET +#undef D3DX12_COM_PTR_ADDRESSOF + +#endif // defined( __cplusplus ) + +#endif //__D3DX12_H__ diff --git a/Test/PlayFabServicesTestApp/Generated/GeneratedTestsBootstrapper.h b/Test/PlayFabServicesTestApp/Generated/GeneratedTestsBootstrapper.h new file mode 100644 index 0000000..71914f9 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Generated/GeneratedTestsBootstrapper.h @@ -0,0 +1,58 @@ +#pragma once + +#include "TestTypes.h" +#include "FriendsTests.h" +#include "AccountManagementTests.h" +#include "PlatformSpecificTests.h" +#include "CharacterTests.h" +#include "SegmentsTests.h" +#include "TitleDataManagementTests.h" +#include "PlayerDataManagementTests.h" +#include "PushNotificationsTests.h" +#include "CloudScriptTests.h" +#include "DataTests.h" +#include "InventoryTests.h" +#include "CatalogTests.h" +#include "ExperimentationTests.h" +#include "GroupsTests.h" +#include "LocalizationTests.h" +#include "MultiplayerServerTests.h" +#include "ProfilesTests.h" + +namespace PlayFab +{ +namespace Test +{ + +/// +/// GetGeneratedTestClasses facilitates adding all generated tests to the TestRunner. This pattern allows us to keep generated code +/// contained in one place and not pollute other files that are changed more frequently. +/// +List> GetGeneratedTestClasses(TestTitleData& testTitleData) +{ + List> generatedTestClasses + { + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + MakeShared(testTitleData), + }; + + return generatedTestClasses; +} + +} +} diff --git a/Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.cpp b/Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.cpp new file mode 100644 index 0000000..64fac54 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.cpp @@ -0,0 +1,182 @@ +#include "TestAppPch.h" +#include "AuthenticationOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +LoginWithCustomIDOperation::LoginWithCustomIDOperation( + ServiceConfig serviceConfig, + RequestType request, + PlayFab::RunContext rc +) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_request{ std::move(request) } +{ +} + +HRESULT LoginWithCustomIDOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAuthenticationLoginWithCustomIDAsync(m_serviceConfig.Handle(), &m_request.Model(), async); +} + +Result LoginWithCustomIDOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize; + RETURN_IF_FAILED(PFAuthenticationLoginWithCustomIDGetResultSize(async, &bufferSize)); + Vector buffer(bufferSize); + PFEntityHandle entityHandle; + PFAuthenticationLoginResult const* loginResult; + RETURN_IF_FAILED(PFAuthenticationLoginWithCustomIDGetResult(async, &entityHandle, buffer.size(), buffer.data(), &loginResult, nullptr)); + return LoginResult{ Entity::Wrap(entityHandle), *loginResult }; +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +GetEntityWithSecretKeyOperation::GetEntityWithSecretKeyOperation( + ServiceConfig serviceConfig, + String secretKey, + RequestType request, + PlayFab::RunContext rc +) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_secretKey{ std::move(secretKey) }, + m_request{ std::move(request) } +{ +} + +HRESULT GetEntityWithSecretKeyOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAuthenticationGetEntityWithSecretKeyAsync(m_serviceConfig.Handle(), m_secretKey.data(), &m_request.Model(), async); +} + +Result GetEntityWithSecretKeyOperation::GetResult(XAsyncBlock* async) noexcept +{ + PFEntityHandle entityHandle; + RETURN_IF_FAILED(PFAuthenticationGetEntityWithSecretKeyGetResult(async, &entityHandle)); + return Entity::Wrap(entityHandle); +} + +#if 0 // removed for now +ServerLoginWithServerCustomIdOperation::ServerLoginWithServerCustomIdOperation( + ServiceConfig serviceConfig, + String secretKey, + RequestType request, + PlayFab::RunContext rc +) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_secretKey{ std::move(secretKey) }, + m_request{ std::move(request) } +{ +} + +HRESULT ServerLoginWithServerCustomIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAuthenticationServerLoginWithServerCustomIdAsync(m_serviceConfig.Handle(), m_secretKey.c_str(), &m_request.Model(), async); +} + +Result ServerLoginWithServerCustomIdOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithServerCustomIdGetResultSize(async, &bufferSize)); + Vector buffer(bufferSize); + PFAuthenticationEntityTokenResponse const* entityTokenResponse; + PFAuthenticationLoginResult const* loginResult; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithServerCustomIdGetResult(async, &entityTokenResponse, buffer.size(), buffer.data(), &loginResult, nullptr)); + return ServerLoginResult{ *entityTokenResponse, *loginResult }; +} + +ServerLoginWithSteamIdOperation::ServerLoginWithSteamIdOperation( + ServiceConfig serviceConfig, + String secretKey, + RequestType request, + PlayFab::RunContext rc +) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_secretKey{ std::move(secretKey) }, + m_request{ std::move(request) } +{ +} + +HRESULT ServerLoginWithSteamIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAuthenticationServerLoginWithSteamIdAsync(m_serviceConfig.Handle(), m_secretKey.c_str(), &m_request.Model(), async); +} + +Result ServerLoginWithSteamIdOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithSteamIdGetResultSize(async, &bufferSize)); + Vector buffer(bufferSize); + PFAuthenticationEntityTokenResponse const* entityTokenResponse; + PFAuthenticationLoginResult const* loginResult; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithSteamIdGetResult(async, &entityTokenResponse, buffer.size(), buffer.data(), &loginResult, nullptr)); + return ServerLoginResult{ *entityTokenResponse, *loginResult }; +} + +ServerLoginWithXboxOperation::ServerLoginWithXboxOperation( + ServiceConfig serviceConfig, + String secretKey, + RequestType request, + PlayFab::RunContext rc +) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_secretKey{ std::move(secretKey) }, + m_request{ std::move(request) } +{ +} + +HRESULT ServerLoginWithXboxOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAuthenticationServerLoginWithXboxAsync(m_serviceConfig.Handle(), m_secretKey.c_str(), &m_request.Model(), async); +} + +Result ServerLoginWithXboxOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithXboxGetResultSize(async, &bufferSize)); + Vector buffer(bufferSize); + PFAuthenticationEntityTokenResponse const* entityTokenResponse; + PFAuthenticationLoginResult const* loginResult; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithXboxGetResult(async, &entityTokenResponse, buffer.size(), buffer.data(), &loginResult, nullptr)); + return ServerLoginResult{ *entityTokenResponse, *loginResult }; +} + +ServerLoginWithXboxIdOperation::ServerLoginWithXboxIdOperation( + ServiceConfig serviceConfig, + String secretKey, + RequestType request, + PlayFab::RunContext rc +) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_secretKey{ std::move(secretKey) }, + m_request{ std::move(request) } +{ +} + +HRESULT ServerLoginWithXboxIdOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAuthenticationServerLoginWithXboxIdAsync(m_serviceConfig.Handle(), m_secretKey.c_str(), &m_request.Model(), async); +} + +Result ServerLoginWithXboxIdOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithXboxIdGetResultSize(async, &bufferSize)); + Vector buffer(bufferSize); + PFAuthenticationEntityTokenResponse const* entityTokenResponse; + PFAuthenticationLoginResult const* loginResult; + RETURN_IF_FAILED(PFAuthenticationServerLoginWithXboxIdGetResult(async, &entityTokenResponse, buffer.size(), buffer.data(), &loginResult, nullptr)); + return ServerLoginResult{ *entityTokenResponse, *loginResult }; +} +#endif // 0 +#endif // HC_PLATFORM == HC_PLATFORM_WIN32 + +} +} diff --git a/Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.h b/Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.h new file mode 100644 index 0000000..048cb1f --- /dev/null +++ b/Test/PlayFabServicesTestApp/Operations/Core/AuthenticationOperations.h @@ -0,0 +1,116 @@ +#pragma once + +#include + +namespace PlayFab +{ +namespace Test +{ + +class LoginWithCustomIDOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAuthenticationLoginWithCustomIDRequestWrapper; + + LoginWithCustomIDOperation(ServiceConfig serviceConfig, RequestType request, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + RequestType m_request; +}; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +struct ServerLoginResult +{ + Wrappers::PFAuthenticationEntityTokenResponseWrapper entityTokenResponse; + Wrappers::PFAuthenticationLoginResultWrapper loginResult; +}; + +class GetEntityWithSecretKeyOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAuthenticationGetEntityRequestWrapper; + + GetEntityWithSecretKeyOperation(ServiceConfig serviceConfig, String secretKey, RequestType request, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + String m_secretKey; + RequestType m_request; +}; + +#if 0 // removed for now +class ServerLoginWithServerCustomIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAuthenticationLoginWithServerCustomIdRequestWrapper; + + ServerLoginWithServerCustomIdOperation(ServiceConfig serviceConfig, String secretKey, RequestType request, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + String m_secretKey; + RequestType m_request; +}; + +class ServerLoginWithSteamIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAuthenticationLoginWithSteamIdRequestWrapper; + + ServerLoginWithSteamIdOperation(ServiceConfig serviceConfig, String secretKey, RequestType request, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + String m_secretKey; + RequestType m_request; +}; + +class ServerLoginWithXboxOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAuthenticationServerLoginWithXboxRequestWrapper; + + ServerLoginWithXboxOperation(ServiceConfig serviceConfig, String secretKey, RequestType request, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + String m_secretKey; + RequestType m_request; +}; + +class ServerLoginWithXboxIdOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAuthenticationLoginWithXboxIdRequestWrapper; + + ServerLoginWithXboxIdOperation(ServiceConfig serviceConfig, String secretKey, RequestType request, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + String m_secretKey; + RequestType m_request; +}; +#endif // 0 +#endif // HC_PLATFORM == HC_PLATFORM_WIN32 + +} +} diff --git a/Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.cpp b/Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.cpp new file mode 100644 index 0000000..31d4fc6 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.cpp @@ -0,0 +1,15 @@ +#include "TestAppPch.h" +#include "CoreOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +HRESULT CoreUninitializeOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFUninitializeAsync(async); +} + +} +} diff --git a/Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.h b/Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.h new file mode 100644 index 0000000..56fb719 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Operations/Core/CoreOperations.h @@ -0,0 +1,18 @@ +#pragma once + +namespace PlayFab +{ +namespace Test +{ + +class CoreUninitializeOperation : public XAsyncOperation +{ +public: + using XAsyncOperation::XAsyncOperation; + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; +}; + +} +} diff --git a/Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.cpp b/Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.cpp new file mode 100644 index 0000000..a88a407 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.cpp @@ -0,0 +1,15 @@ +#include "TestAppPch.h" +#include "ServicesOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +HRESULT ServicesUninitializeOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFServicesUninitializeAsync(async); +} + +} +} diff --git a/Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.h b/Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.h new file mode 100644 index 0000000..a73d084 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Operations/Services/ServicesOperations.h @@ -0,0 +1,18 @@ +#pragma once + +namespace PlayFab +{ +namespace Test +{ + +class ServicesUninitializeOperation : public XAsyncOperation +{ +public: + using XAsyncOperation::XAsyncOperation; + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; +}; + +} +} \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/Platform/GDK/PlayFabGDK.cpp b/Test/PlayFabServicesTestApp/Platform/GDK/PlayFabGDK.cpp new file mode 100644 index 0000000..722195d --- /dev/null +++ b/Test/PlayFabServicesTestApp/Platform/GDK/PlayFabGDK.cpp @@ -0,0 +1,101 @@ +#include "TestAppPch.h" +#include "Platform/PlayFabPal.h" +#include "Platform/Generic/MemoryManager.h" +#include "Operations/Core/AuthenticationOperations.h" +#include "GDK/PlatformUser_GDK.h" + +using namespace PlayFab::Platform; + +namespace PlayFab +{ +namespace Test +{ +namespace Platform +{ + +HRESULT SetHooks() +{ + // Using built in LocalStorage on Win32 + RETURN_IF_FAILED(MemoryManager::Instance().SetHooks()); + return S_OK; +} + +HRESULT CoreInitialize(XTaskQueueHandle queue) noexcept +{ + return PFInitialize(queue); +} + +AsyncOp GetDefaultPlatformUser( + RunContext rc +) noexcept +{ + return XUser::Add(XUserAddOptions::AddDefaultUserAllowingUI, rc).Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + return MakeShared(result.ExtractPayload()); + }); +} + +class LoginWithXUserOperation : public XAsyncOperation +{ +public: + using RequestType = Wrappers::PFAuthenticationLoginWithXUserRequestWrapper; + + LoginWithXUserOperation(ServiceConfig serviceConfig, RequestType request, PlayFab::RunContext rc); + +private: // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override; + Result GetResult(XAsyncBlock* async) noexcept override; + + ServiceConfig m_serviceConfig; + RequestType m_request; +}; + +LoginWithXUserOperation::LoginWithXUserOperation( + ServiceConfig serviceConfig, + RequestType request, + PlayFab::RunContext rc +) : + XAsyncOperation{ std::move(rc) }, + m_serviceConfig{ std::move(serviceConfig) }, + m_request{ std::move(request) } +{ +} + +HRESULT LoginWithXUserOperation::OnStarted(XAsyncBlock* async) noexcept +{ + return PFAuthenticationLoginWithXUserAsync(m_serviceConfig.Handle(), &m_request.Model(), async); +} + +Result LoginWithXUserOperation::GetResult(XAsyncBlock* async) noexcept +{ + size_t bufferSize; + RETURN_IF_FAILED(PFAuthenticationLoginWithXUserGetResultSize(async, &bufferSize)); + Vector buffer(bufferSize); + PFEntityHandle entityHandle; + PFAuthenticationLoginResult const* loginResult; + RETURN_IF_FAILED(PFAuthenticationLoginWithXUserGetResult(async, &entityHandle, buffer.size(), buffer.data(), &loginResult, nullptr)); + return LoginResult{ Entity::Wrap(entityHandle), *loginResult }; +} + +AsyncOp LoginDefaultTitlePlayer( + ServiceConfig serviceConfig, + UserPtr platformUser, + RunContext rc +) noexcept +{ + RETURN_HR_INVALIDARG_IF_NULL(platformUser); + LoginWithXUserOperation::RequestType loginRequest{ Wrappers::XUser::Duplicate(platformUser->Handle()) }; + loginRequest.SetCreateAccount(true); + return RunOperation(MakeUnique(serviceConfig, std::move(loginRequest), rc)); +} + +// Platform dependent PlayFabServices wrappers +HRESULT ServicesInitialize() +{ + return PFServicesInitialize(nullptr); +} + +} +} +} \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.cpp b/Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.cpp new file mode 100644 index 0000000..7f89bdf --- /dev/null +++ b/Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.cpp @@ -0,0 +1,70 @@ +#include "TestAppPch.h" +#include "Platform/Generic/MemoryManager.h" +#include "XAsyncProviderBase.h" + +namespace PlayFab +{ +namespace Test +{ +namespace Platform +{ + +MemoryManager::~MemoryManager() +{ + // Unfreed allocation! an allocation made by the SDK leaked. This could be because the title forgot to close a handle + // or because the SDK failed to delete something it internally allocated + assert(m_allocations.empty()); +} + +MemoryManager& MemoryManager::Instance() +{ + static MemoryManager s_memoryManager; + return s_memoryManager; +} + +HRESULT MemoryManager::SetHooks() +{ + // Init PlayFab hooks. These will be used by allocations with the PlayFab SDK + PFMemoryHooks playFabHooks{ AllocHook, FreeHook }; + return PFMemSetFunctions(&playFabHooks); +} + +String MemoryManager::Summary() +{ + std::unique_lock lock{ m_mutex }; + + Stringstream ss; + ss << "Total allocations: " << m_nextId << " Un-freed allocations: " << m_allocations.size(); + return ss.str(); +} + +void* STDAPIVCALLTYPE MemoryManager::AllocHook(size_t size) +{ + auto& memoryManager = MemoryManager::Instance(); + + std::unique_lock lock{ memoryManager.m_mutex }; + + void* ptr = malloc(size); + memoryManager.m_allocations[ptr] = memoryManager.m_nextId++; + return ptr; +} + +void STDAPIVCALLTYPE MemoryManager::FreeHook(void* pointer) +{ + auto& memoryManager = MemoryManager::Instance(); + + std::unique_lock lock{ memoryManager.m_mutex }; + + auto iter = memoryManager.m_allocations.find(pointer); + if (iter == memoryManager.m_allocations.end()) + { + throw Exception{ "PlayFab Free with no matching Alloc!" }; + } + memoryManager.m_allocations.erase(iter); + + free(pointer); +} + +} // namespace Platform +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.h b/Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.h new file mode 100644 index 0000000..0ee3b02 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Platform/Generic/MemoryManager.h @@ -0,0 +1,37 @@ +#pragma once + +namespace PlayFab +{ +namespace Test +{ +namespace Platform +{ + +// Simple XPlat MemoryManager +class MemoryManager +{ +public: + static MemoryManager& Instance(); + + MemoryManager(MemoryManager const&) = delete; + MemoryManager& operator=(MemoryManager) = delete; + ~MemoryManager(); + + HRESULT SetHooks(); + String Summary(); // For logging purposes + +private: + MemoryManager() = default; + + // PlayFab SDK Callbacks + static void* STDAPIVCALLTYPE AllocHook(size_t size); + static void STDAPIVCALLTYPE FreeHook(void* pointer); + + std::mutex m_mutex; + uint64_t m_nextId{ 0 }; + Map m_allocations; +}; + +} // namespace Platform +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/Platform/PlatformUtils.h b/Test/PlayFabServicesTestApp/Platform/PlatformUtils.h new file mode 100644 index 0000000..b6f13d4 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Platform/PlatformUtils.h @@ -0,0 +1,31 @@ +#pragma once + +#include "TestTypes.h" + +namespace PlayFab +{ +namespace Test +{ +namespace Platform +{ + +HRESULT GetTestTitleData( + TestTitleData& testTitleData +) noexcept; + +time_t GetSystemTime() noexcept; + +String GetTimeString() noexcept; + +void TraceMessage( + PFHCTraceLevel level, + String const& message +) noexcept; + +void Sleep( + uint64_t durationMs +) noexcept; + +} +} +} diff --git a/Test/PlayFabServicesTestApp/Platform/PlayFabPal.h b/Test/PlayFabServicesTestApp/Platform/PlayFabPal.h new file mode 100644 index 0000000..320000a --- /dev/null +++ b/Test/PlayFabServicesTestApp/Platform/PlayFabPal.h @@ -0,0 +1,35 @@ +#pragma once + +#include "TestTypes.h" +#include "PlatformUser.h" + +namespace PlayFab +{ +namespace Test +{ +namespace Platform +{ + +HRESULT SetHooks(); + +// Platform dependent PlayFabCore wrappers +HRESULT CoreInitialize( + XTaskQueueHandle queue +) noexcept; + +AsyncOp GetDefaultPlatformUser( + RunContext rc +) noexcept; + +AsyncOp LoginDefaultTitlePlayer( + ServiceConfig serviceConfig, + PlayFab::Platform::UserPtr platformUser, + RunContext rc +) noexcept; + +// Platform dependent PlayFabServices wrappers +HRESULT ServicesInitialize(); + +} +} +} diff --git a/Test/PlayFabServicesTestApp/Platform/Win32/PlayFabWin32.cpp b/Test/PlayFabServicesTestApp/Platform/Win32/PlayFabWin32.cpp new file mode 100644 index 0000000..f0efcec --- /dev/null +++ b/Test/PlayFabServicesTestApp/Platform/Win32/PlayFabWin32.cpp @@ -0,0 +1,61 @@ +#include "TestAppPch.h" +#include "Platform/PlayFabPal.h" +#include "Platform/Generic/MemoryManager.h" +#include "Operations/Core/AuthenticationOperations.h" + +using namespace PlayFab::Platform; + +namespace PlayFab +{ +namespace Test +{ +namespace Platform +{ + +constexpr char defaultPlayerCustomId[] = "TestCustomId"; + +HRESULT SetHooks() +{ + // Using built in LocalStorage on Win32 + RETURN_IF_FAILED(MemoryManager::Instance().SetHooks()); + return S_OK; +} + +HRESULT CoreInitialize(XTaskQueueHandle queue) noexcept +{ + return PFInitialize(queue); +} + +AsyncOp GetDefaultPlatformUser( + RunContext rc +) noexcept +{ + // There is no platform user for Win32 + UNREFERENCED_PARAMETER(rc); + return UserPtr{ nullptr }; +} + +AsyncOp LoginDefaultTitlePlayer( + ServiceConfig serviceConfig, + UserPtr platformUser, + RunContext rc +) noexcept +{ + assert(!platformUser); + UNREFERENCED_PARAMETER(platformUser); + + LoginWithCustomIDOperation::RequestType request; + request.SetCustomId(defaultPlayerCustomId); + request.SetCreateAccount(true); + return RunOperation(MakeUnique(serviceConfig, request, rc)); +} + +// Platform dependent PlayFabServices wrappers +HRESULT ServicesInitialize() +{ + return PFServicesInitialize(nullptr); +} + +} +} +} \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/Platform/Windows/PlatfromUtilsWindows.cpp b/Test/PlayFabServicesTestApp/Platform/Windows/PlatfromUtilsWindows.cpp new file mode 100644 index 0000000..01dc786 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Platform/Windows/PlatfromUtilsWindows.cpp @@ -0,0 +1,159 @@ +#include "TestAppPch.h" +#include "Platform/PlatformUtils.h" +#if defined(_GAMING_DESKTOP) +#include +#endif + +namespace PlayFab +{ +namespace Test +{ +namespace Platform +{ + +String GetExeDirectory() +{ + char path[MAX_PATH]; + GetModuleFileNameA(NULL, path, MAX_PATH); + String::size_type pos = String(path).find_last_of("\\/"); + return String(path).substr(0, pos); +} + +HRESULT GetTestTitleData(TestTitleData& testTitleData) noexcept +{ + // Read the title data from the file into the output character array. + std::ifstream titleDataFile; + SetCurrentDirectoryA(GetExeDirectory().c_str()); + + std::ios_base::iostate exceptionMask = titleDataFile.exceptions() | std::ios::failbit; + titleDataFile.exceptions(exceptionMask); + + titleDataFile.open("testTitleData.json", std::ios::in | std::ios::ate); + if (!titleDataFile.is_open()) + { + return E_FAIL; + } + + int64_t size = titleDataFile.tellg(); + if (size < 0) + { + return E_FAIL; + } + + titleDataFile.seekg(0); + + Vector data(static_cast(size + 1), 0); + titleDataFile.read(reinterpret_cast(data.data()), static_cast(size)); + if (!titleDataFile.good()) + { + return E_FAIL; + } + + titleDataFile.close(); + + // Parse JSON string into output TestTitleData. + rapidjson::Document titleDataJson; + titleDataJson.Parse(data.data()); + + if (titleDataJson.HasParseError()) + { + TraceMessage(PFHCTraceLevel::Error, "Unable to parse testTitleData.json"); + return E_FAIL; + } + + testTitleData.titleId = titleDataJson["titleId"].GetString(); + testTitleData.secretKey = titleDataJson["secretKey"].GetString(); + testTitleData.connectionString = titleDataJson["connectionString"].GetString(); + + return S_OK; +} + +time_t GetSystemTime() noexcept +{ + return std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); +} + +String GetTimeString() noexcept +{ + SYSTEMTIME st; + GetLocalTime(&st); + char szTime[256]{ 0 }; + sprintf_s(szTime, 255, "[%0.2d/%0.2d %0.2d:%0.2d:%0.2d:%0.4d] ", st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); + return szTime; +} + +void WriteLogToFile(const char* strIn, const char* strFileName) +{ + HANDLE hFile; + std::string str = strIn; + DWORD dwBytesToWrite = (DWORD)str.length(); + DWORD dwBytesWritten = 0; + BOOL bErrorFlag = FALSE; + + static bool firstLogLine = true; + DWORD dwCreationDisposition = OPEN_ALWAYS; + if (firstLogLine) + { + firstLogLine = false; + dwCreationDisposition = CREATE_ALWAYS; // recreate log upon start + } + +#if defined(_GAMING_DESKTOP) + char szPath[MAX_PATH]; + SHGetSpecialFolderPathA(HWND_DESKTOP, szPath, CSIDL_DESKTOP, FALSE); + std::string strFullPath = szPath; +#else + std::string strFullPath = "D:"; +#endif + strFullPath += "\\"; + strFullPath += strFileName; + hFile = CreateFileA(strFullPath.c_str(), FILE_APPEND_DATA, 0, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); + + if (hFile == INVALID_HANDLE_VALUE) + { + return; + } + + bErrorFlag = WriteFile( + hFile, // open file handle + str.data(), // start of data to write + dwBytesToWrite, // number of bytes to write + &dwBytesWritten, // number of bytes that were written + NULL); // no overlapped structure + + if (!bErrorFlag && dwBytesWritten != dwBytesToWrite) + { + OutputDebugStringA("Log file error: dwBytesWritten != dwBytesToWrite\n"); + } + + CloseHandle(hFile); +} + +void TraceMessage(PFHCTraceLevel level, String const& message) noexcept +{ + // Trace all messages to debugger output + OutputDebugStringA(message.data()); + + // If PFHCTraceLevel <= Important direct to PFTestAppSummary.txt + if (level <= PFHCTraceLevel::Important) + { + WriteLogToFile(message.data(), "PFTestAppSummary.txt"); + } + + // Trace all messages to PFTestAppEventsLog.txt + WriteLogToFile(message.data(), "PFTestAppEventsLog.txt"); + +#if HC_PLATFORM == HC_PLATFORM_WIN32 + // On Win32 also redirect to STDOUT + std::cout << message; +#endif +} + +void Sleep(uint64_t durationMs) noexcept +{ + ::Sleep((DWORD)durationMs); +} + +} +} +} \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems b/Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems new file mode 100644 index 0000000..16c2837 --- /dev/null +++ b/Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems @@ -0,0 +1,71 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + {7efaab05-6336-49b3-9262-13fd023bede5} + + + + TestAppPch.h + %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory);$(MSBuildThisFileDirectory)\TestFramework + + + + + + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems.filters b/Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems.filters new file mode 100644 index 0000000..6a794df --- /dev/null +++ b/Test/PlayFabServicesTestApp/PlayFabServicesTestApp.Common.vcxitems.filters @@ -0,0 +1,186 @@ + + + + + {22a6cb8e-6e14-42ca-b08d-39f471d92bea} + + + {879164c4-7718-473a-8d53-053a0f9df315} + + + {a0f35dfe-b0a6-4a65-9601-9ffe6d39c0b5} + + + {2b47b374-9508-4ac6-8f35-9a9860bd9d0b} + + + {625892a9-d1e9-4078-98b4-acf0ff6dda53} + + + {15f9c822-cee8-4ae9-81b4-301054fec8f0} + + + {80478cd3-22e6-4437-b40f-fe0ddf99bea8} + + + {ba50c026-99c5-4208-9ab6-12facd8d6fea} + + + {99548c0b-7382-44d1-8b8c-058893d10b79} + + + {d6b6498f-6213-4e12-802c-419629e525b4} + + + {9611a56c-76d2-4d34-bbbb-590b576982d6} + + + + + Source + + + Source\Tests\Core + + + Source\Tests\Core + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\Tests\Services + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\Operations\Core + + + Source\Operations\Core + + + Source\Operations\Services + + + Source\Platform\Generic + + + + + Source + + + Source\Generated + + + Source\Tests\Core + + + Source\Tests\Core + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\TestFramework + + + Source\Operations\Core + + + Source\Operations\Core + + + Source\Operations\Services + + + Source\Platform + + + Source\Platform + + + Source\Platform\Generic + + + \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/TestAppPch.cpp b/Test/PlayFabServicesTestApp/TestAppPch.cpp new file mode 100644 index 0000000..bf97efa --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestAppPch.cpp @@ -0,0 +1,3 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "TestAppPch.h" \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/TestAppPch.h b/Test/PlayFabServicesTestApp/TestAppPch.h new file mode 100644 index 0000000..b0e2043 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestAppPch.h @@ -0,0 +1,52 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// PlayFab Services include +#include + +// Platform specific includes +#if defined(_GAMING_DESKTOP) +#include +#define WIN32_LEAN_AND_MEAN +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +#include "GDK/GDKPch.h" +#endif + +// PlayFabSharedInternal includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// TestApp headers +#include "TestTypes.h" +#include "TestException.h" diff --git a/Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.cpp b/Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.cpp new file mode 100644 index 0000000..6cc0d4a --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.cpp @@ -0,0 +1,53 @@ +#include "TestAppPch.h" +#include "CoreTestClass.h" +#include "Operations/Core/CoreOperations.h" +#include "Platform/PlayFabPal.h" + +namespace PlayFab +{ +namespace Test +{ + +CoreTestClass::CoreTestClass(TestTitleData testTitleData) : + m_testTitleData{ std::move(testTitleData) }, + m_runContext{ RunContext::Root(nullptr) } +{ +} + +void CoreTestClass::ClassSetUp() +{ + THROW_IF_FAILED(Initialize().Wait().hr); +} + +void CoreTestClass::ClassTearDown() +{ + THROW_IF_FAILED(Uninitialize().Wait().hr); +} + +AsyncOp CoreTestClass::Initialize() +{ + RETURN_IF_FAILED(Platform::CoreInitialize(nullptr)); + m_serviceConfig.emplace(m_testTitleData.connectionString.data(), m_testTitleData.titleId.data()); + return S_OK; +} + +AsyncOp CoreTestClass::Uninitialize() +{ + // Destroy ServiceConfig + m_serviceConfig.reset(); + return RunOperation(MakeUnique(RunContext())); +} + +RunContext CoreTestClass::RunContext() const +{ + return m_runContext; +} + +ServiceConfig CoreTestClass::ServiceConfig() +{ + assert(m_serviceConfig.has_value()); + return *m_serviceConfig; +} + +} +} diff --git a/Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.h b/Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.h new file mode 100644 index 0000000..52e1ffd --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/CoreTestClass.h @@ -0,0 +1,41 @@ +#pragma once + +#include "TestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +/// +/// Base class for TestClasses testing PlayFabCore functionality. Providers helpers for intialization, cleanup, etc. +/// +class CoreTestClass : public TestClass +{ +public: + // Add optional way to specify Test RunContext queue and PlayFab background queue. Will default to process queue for both + CoreTestClass(TestTitleData testTitleData); + + void ClassSetUp() override; + void ClassTearDown() override; + +protected: + virtual AsyncOp Initialize(); + virtual AsyncOp Uninitialize(); + + // RunContext for tests + RunContext RunContext() const; + + // ServiceConfig created from testTitleData + ServiceConfig ServiceConfig(); + +protected: + TestTitleData m_testTitleData; + +private: + PlayFab::RunContext m_runContext; + std::optional m_serviceConfig; // optional because intialization is delayed until Initialize +}; + +} +} diff --git a/Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.cpp b/Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.cpp new file mode 100644 index 0000000..01375da --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.cpp @@ -0,0 +1,134 @@ +#include "TestAppPch.h" +#include "ServicesTestClass.h" +#include "Operations/Core/AuthenticationOperations.h" +#include "Operations/Services/ServicesOperations.h" +#include "AccountManagementOperations.h" +#include "Platform/PlayFabPal.h" + +using namespace PlayFab::Platform; + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp ServicesTestClass::Initialize() +{ + auto operation = CoreTestClass::Initialize().Then([this](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + RETURN_IF_FAILED(Platform::ServicesInitialize()); + return Platform::GetDefaultPlatformUser(RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + m_defaultPlatformUser = result.ExtractPayload(); + return Platform::LoginDefaultTitlePlayer(ServiceConfig(), m_defaultPlatformUser, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + m_defaultTitlePlayer.emplace(result.ExtractPayload()); + return S_OK; + }); + +#if HC_PLATFORM == HC_PLATFORM_WIN32 + return operation.Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + return RunOperation(MakeUnique(ServiceConfig(), m_testTitleData.secretKey, GetEntityWithSecretKeyOperation::RequestType{}, RunContext())); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + m_titleEntity.emplace(std::move(result.ExtractPayload())); + return S_OK; + }); +#else + return operation; +#endif +} + +AsyncOp ServicesTestClass::Uninitialize() +{ + m_defaultTitlePlayer.reset(); + m_defaultPlatformUser.reset(); +#if HC_PLATFORM == HC_PLATFORM_WIN32 + m_titleEntity.reset(); +#endif + + return RunOperation(MakeUnique(RunContext())).Then([this](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + return CoreTestClass::Uninitialize(); + }); +} + +UserPtr ServicesTestClass::DefaultPlatformUser() noexcept +{ + return m_defaultPlatformUser; +} + +Entity ServicesTestClass::DefaultTitlePlayer() noexcept +{ + assert(m_defaultTitlePlayer.has_value()); + return m_defaultTitlePlayer->entity; +} + +String ServicesTestClass::DefaultTitlePlayerId() noexcept +{ + assert(m_defaultTitlePlayer.has_value()); + return m_defaultTitlePlayer->loginResult.Model().playFabId; +} + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +Entity ServicesTestClass::TitleEntity() noexcept +{ + assert(m_titleEntity.has_value()); + return *m_titleEntity; +} +#endif + +AsyncOp ServicesTestClass::GetTitlePlayer(String customId) noexcept +{ + auto iter = m_playersByCustomId.find(customId); + if (iter != m_playersByCustomId.end()) + { + return Result{ Entity{ iter->second.entity } }; + } + + LoginWithCustomIDOperation::RequestType request; + request.SetCustomId(customId); + request.SetCreateAccount(true); + return RunOperation(MakeUnique(ServiceConfig(), request, RunContext())).Then([this, customId](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto entity = result.Payload().entity; + m_playersByCustomId.emplace(customId, result.ExtractPayload()); + return entity; + }); +} + +AsyncOp ServicesTestClass::GetPlayFabIdFromCustomId(String customId) noexcept +{ + auto iter = m_playersByCustomId.find(customId); + if (iter != m_playersByCustomId.end()) + { + return Result{ iter->second.loginResult.Model().playFabId }; + } + + LoginWithCustomIDOperation::RequestType request; + request.SetCustomId(customId); + request.SetCreateAccount(true); + return RunOperation(MakeUnique(ServiceConfig(), request, RunContext())).Then([this, customId](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + String playFabId = result.Payload().loginResult.Model().playFabId; + m_playersByCustomId.emplace(customId, result.ExtractPayload()); + return playFabId; + }); +} + +} +} diff --git a/Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.h b/Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.h new file mode 100644 index 0000000..7956595 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/ServicesTestClass.h @@ -0,0 +1,51 @@ +#pragma once + +#include "CoreTestClass.h" +#include "PlatformUser.h" + +namespace PlayFab +{ +namespace Test +{ + +class ServicesTestClass : public CoreTestClass +{ +public: + using CoreTestClass::CoreTestClass; + +protected: + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + // Default Platform user. May be null on some platforms + PlayFab::Platform::UserPtr DefaultPlatformUser() noexcept; + + // Default TitlePlayer. Implementation may vary by platform. + // On GDK this will be a TitlePlayer associated with the default XUser. + Entity DefaultTitlePlayer() noexcept; + + // PlayFabId for DefaultTitlePlayer + String DefaultTitlePlayerId() noexcept; + +#if HC_PLATFORM == HC_PLATFORM_WIN32 + // Title Entity, need to call certain APIs + Entity TitleEntity() noexcept; +#endif + + // Get TitlePlayer by customId, performing a login if needed + AsyncOp GetTitlePlayer(String customId) noexcept; + + // Get a PlayFabId from a customId. This may create a player with customId if one doesn't exist + AsyncOp GetPlayFabIdFromCustomId(String customId) noexcept; + +private: + PlayFab::Platform::UserPtr m_defaultPlatformUser; + std::optional m_defaultTitlePlayer; + Map m_playersByCustomId; +#if HC_PLATFORM == HC_PLATFORM_WIN32 + std::optional m_titleEntity; +#endif +}; + +} +} diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestClass.cpp b/Test/PlayFabServicesTestApp/TestFramework/TestClass.cpp new file mode 100644 index 0000000..1ae39e3 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestClass.cpp @@ -0,0 +1,19 @@ +#include "TestAppPch.h" +#include "TestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +TestList const& TestClass::GetTests() +{ + if (m_testList.empty()) + { + AddTests(); + } + return m_testList; +} + +} +} diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestClass.h b/Test/PlayFabServicesTestApp/TestFramework/TestClass.h new file mode 100644 index 0000000..44b4414 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestClass.h @@ -0,0 +1,77 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +using TestList = List>; + +/// +/// A TestClass implements a set of Tests to be run by a TestRunner +/// +class TestClass +{ +public: + TestClass() = default; + virtual ~TestClass() = default; + + /// + /// Provide read-only access to the test list. + /// Will trigger building the test list, if it's not already populated. + /// + TestList const& GetTests(); + + /// + /// During testing, this is the first function that will be called for each TestClass. + /// This is run exactly once for this type. + /// + virtual void ClassSetUp() {} + + /// + /// During testing, this will be called every tick that a test is asynchronous. + /// This is run every tick until testContext.EndTest() is called, or until the test times out. + /// This is considered part of the active test. A failure or exception in this method will be considered a failure for the active test. + /// + virtual void Tick(TestContext& /*testContext*/) {} + + /// + /// During testing, this is the last function that will be called for each TestClass. + /// This is run exactly once for this type. + /// It is not considered part of any test. A failure or exception in this method will halt the test framework. + /// + virtual void ClassTearDown() {} + +protected: + /// + /// Before testing, this function is called to gather the list of tests to run for each TestClass. + /// It is not considered part of any test. + /// + virtual void AddTests() = 0; + + /// + /// Helper method to add a Test to the TestList + /// + template + void AddTest(const char* testName, void(T::* testCaseFunc)(TestContext&)); + +private: + TestList m_testList; +}; + +template +void TestClass::AddTest(const char* testName, void(T::* testCaseFunc)(TestContext&)) +{ + T* testClass = static_cast(this); + const auto& testFunc = std::bind(testCaseFunc, testClass, std::placeholders::_1); + SharedPtr testContext = MakeShared(*testClass, testName, testFunc); + + m_testList.push_back(testContext); +} + +} +} diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestContext.cpp b/Test/PlayFabServicesTestApp/TestFramework/TestContext.cpp new file mode 100644 index 0000000..8939a08 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestContext.cpp @@ -0,0 +1,161 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "TestAppPch.h" +#include "TestContext.h" +#include "TestClass.h" +#include "EnumTraits.h" +#include "TestReport.h" + +namespace PlayFab +{ +namespace Test +{ + +TestContext::TestContext(Test::TestClass& testClass, const char* name, TestFunc func) : + m_testName{ name }, + m_testFunc{ std::move(func) }, + m_testClass{ testClass } +{ +} + +String const& TestContext::TestName() const +{ + return m_testName; +} + +TestActiveState TestContext::ActiveState() const +{ + return m_activeState; +} + +TestFinishState TestContext::FinishState() const +{ + return m_finishState; +} + +int64_t TestContext::StartTime() const +{ + return m_startTime; +} + +int64_t TestContext::EndTime() const +{ + return m_endTime; +} + +String const& TestContext::Summary() const +{ + return m_testResultMsg; +} + +void TestContext::StartTest() +{ + assert(m_activeState == TestActiveState::PENDING); + + m_startTime = GetMilliTicks(); + m_activeState = TestActiveState::ACTIVE; + m_testFunc(*this); +} + +void TestContext::AssertEqual(const char* expected, const char* actual, const char* propertyName) +{ + if (expected && actual && std::strcmp(expected, actual)) + { + Stringstream ss; + ss << "Result property verification failed: propertyName=\"" << propertyName << "\", expected=\"" << expected << "\" actual=\"" << actual << "\""; + throw Exception{ ss.str() }; + } + else if ((!expected && actual) || (expected && !actual)) + { + Stringstream ss; + ss << "Result property verification failed: propertyName=\"" << propertyName << "\""; + throw Exception{ ss.str() }; + } +} + +void TestContext::AssertTrue(bool statement, const char* errorMessage) +{ + if (!statement) + { + throw Exception{ errorMessage }; + } +} + +void TestContext::EndTest(Result&& finalResult) noexcept +{ + RecordResult(std::move(finalResult)); + EndTest(); +} + +void TestContext::EndTest() noexcept +{ + TestFinishState finishState{ TestFinishState::PASSED }; + + Stringstream ss; + ss << "Test failed with " << m_intermediateResults.size() << " intermediate result(s):"; + for (auto& result : m_intermediateResults) + { + if (Failed(result)) + { + finishState = TestFinishState::FAILED; + } + ss << "\n\thr=" << std::hex << result.hr << ", errorMessage=" << result.errorMessage; + } + EndTest(finishState, finishState == TestFinishState::FAILED ? ss.str() : String{}); +} + +void TestContext::EndTest(TestFinishState state, String resultMsg) noexcept +{ + if (m_finishState == TestFinishState::PENDING) // This means that we finish successfully + { + auto now = GetMilliTicks(); + if (m_activeState == TestActiveState::PENDING) + { + // Test was never started. Set start time now so runtime calculation works + m_startTime = now; + } + + m_endTime = now; + m_testResultMsg = resultMsg; + m_finishState = state; + m_activeState = TestActiveState::COMPLETE; + } + else + { + // Test was previously completed + if (!m_testResultMsg.empty()) + { + m_testResultMsg += "\n"; + } + m_testResultMsg += EnumName(m_finishState) + String{ "->" } + EnumName(state) + " - Cannot declare test finished twice."; + if (!resultMsg.empty()) + { + m_testResultMsg += "\n: " + resultMsg; + } + m_finishState = TestFinishState::FAILED; + } +} + +void TestContext::Skip() +{ + // Tests should not be skipped after results have been recorded + assert(m_intermediateResults.empty()); + EndTest(TestFinishState::SKIPPED, String{}); +} + +void TestContext::Timeout() +{ + EndTest(TestFinishState::TIMEDOUT, String{}); +} + +static const int64_t TEST_TIMEOUT_MILLISECONDS = 150000; + +bool TestContext::IsExpired() +{ + int64_t timeNow = GetMilliTicks(); + bool timeExpired = (timeNow - m_startTime) > TEST_TIMEOUT_MILLISECONDS; + return timeExpired; +} + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestContext.h b/Test/PlayFabServicesTestApp/TestFramework/TestContext.h new file mode 100644 index 0000000..4a6c34a --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestContext.h @@ -0,0 +1,150 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include "XAsyncOperation.h" +#include + +namespace PlayFab +{ +namespace Test +{ + +// TestClass forward declaration +class TestClass; + +enum class TestActiveState +{ + PENDING, // Not started + ACTIVE, // Currently testing + COMPLETE, // Test Complete +}; + +enum class TestFinishState +{ + PENDING, + PASSED, + FAILED, + SKIPPED, + TIMEDOUT +}; + +/// +/// A TestContext contains metadata about a test including the TestClass it belongs to, the test function, and the result +/// +class TestContext +{ +public: + using TestFunc = std::function; + + TestContext(TestClass& testClass, const char* name, TestFunc func); + + // Test metadata + String const& TestName() const; + TestActiveState ActiveState() const; + TestFinishState FinishState() const; + int64_t StartTime() const; + int64_t EndTime() const; + String const& Summary() const; + + // Start the test by invoking TestClass::SetUp followed by the TestFunc + void StartTest(); + + // Record an intermediate result but do not end the test. If any intermediate results fail, the entire test will be considered failed + template + void RecordResult(Result&& result) noexcept; + + // Verify a field of a result object, throwing a PlayFab::Test::Exception if validation fails + template>* = nullptr> + void AssertEqual(T const& expected, T const& actual, const char* propertyName); + + // Verify an enum field of a result object, throwing a PlayFab::Test::Exception if validation fails + template>* = nullptr> + void AssertEqual(EnumT expected, EnumT actual, const char* propertyName); + + // Verify a string field of a result object, throwing a PlayFab::Test::Exception if validation fails + void AssertEqual(const char* expected, const char* actual, const char* propertyName); + + // Validate a statement is true, throwing a PlayFab::Test::Exception if validation fails + void AssertTrue(bool statement, const char* errorMessage); + + // Validate that an operation which was expected to fail actually fails + template + void AssertFailed(Result&& result, const char* errorMessage); + + // Add a final result and end the test + void EndTest(Result&& finalResult) noexcept; + template + void EndTest(Result&& finalResult) noexcept; + + // End this test immediately with TestFinishState::SKIPPED + void Skip(); + // End this test immediately with TestFinishState::TIMEDOUT + void Timeout(); + // Check if the test has been running for too long and should be timed out + bool IsExpired(); + +private: + void EndTest() noexcept; + void EndTest(TestFinishState state, String resultMsg) noexcept; + + String const m_testName; + TestActiveState m_activeState{ TestActiveState::PENDING }; + TestFinishState m_finishState{ TestFinishState::PENDING }; + String m_testResultMsg; + TestFunc m_testFunc; + Test::TestClass& m_testClass; + int64_t m_startTime; + int64_t m_endTime; + Vector> m_intermediateResults; +}; + +template +void TestContext::RecordResult(Result&& result) noexcept +{ + if (Failed(result)) + { + m_intermediateResults.emplace_back(result.hr, std::move(result.errorMessage)); + } +} + +template>*> +void TestContext::AssertEqual(T const& expected, T const& actual, const char* propertyName) +{ + if (!(expected == actual)) + { + Stringstream ss; + ss << "Result property verification failed: propertyName=\"" << propertyName << "\", expected=\"" << expected << "\" actual=\"" << actual << "\""; + throw Exception{ ss.str() }; + } +} + +template>*> +void TestContext::AssertEqual(EnumT expected, EnumT actual, const char* propertyName) +{ + if (!(expected == actual)) + { + Stringstream ss; + ss << "Result property verification failed: propertyName=\"" << propertyName << "\", expected=\"" << EnumName(expected) << "\" actual=\"" << EnumName(actual) << "\""; + throw Exception{ ss.str() }; + } +} + +template +void TestContext::AssertFailed(Result&& result, const char* errorMessage) +{ + if (!Failed(result)) + { + throw Exception{ errorMessage }; + } +} + +template +void TestContext::EndTest(Result&& finalResult) noexcept +{ + RecordResult(std::move(finalResult)); + EndTest(); +} + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestException.h b/Test/PlayFabServicesTestApp/TestFramework/TestException.h new file mode 100644 index 0000000..f1d06b2 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestException.h @@ -0,0 +1,24 @@ +#pragma once + +namespace PlayFab +{ +namespace Test +{ + +class Exception : public std::exception +{ +public: + Exception(String message) : m_message{ std::move(message) } + { + } + + const char* what() const noexcept + { + return m_message.data(); + } +private: + String m_message; +}; + +} +} \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestReport.cpp b/Test/PlayFabServicesTestApp/TestFramework/TestReport.cpp new file mode 100644 index 0000000..33043c4 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestReport.cpp @@ -0,0 +1,70 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "TestAppPch.h" +#include "TestReport.h" +#include "EnumTraits.h" + +using namespace PlayFab; + +namespace PlayFab +{ +namespace Test +{ + +TestReport::TestReport(String testReportName) +{ + m_internalReport.name = std::move(testReportName); + m_internalReport.timeStamp = GetMilliTicks(); + m_internalReport.tests = 0; + m_internalReport.failures = 0; + m_internalReport.errors = 0; + m_internalReport.skipped = 0; + m_internalReport.passed = 0; +} + +void TestReport::TestStarted() +{ + m_internalReport.tests += 1; +} + +void TestReport::TestComplete(String testName, TestFinishState testFinishState, int64_t testDurationMs, String message) +{ + // Add a new TestCaseReport for the completed test. + std::shared_ptr testReport = std::make_shared(); + m_internalReport.testResults.push_back(testReport); + + testReport->classname = m_internalReport.name; + testReport->name = testName; + testReport->time = std::chrono::duration(testDurationMs).count(); + testReport->message = message; + testReport->finishState = testFinishState; + testReport->failureText = EnumName(testFinishState); + + // Update statistics. + switch (testFinishState) + { + case TestFinishState::PASSED: m_internalReport.passed += 1; break; + case TestFinishState::FAILED: m_internalReport.failures += 1; break; + case TestFinishState::SKIPPED: m_internalReport.skipped += 1; break; + case TestFinishState::PENDING: + break; + case TestFinishState::TIMEDOUT: + break; + default: + break; + } + + // Update overall runtime. + // TODO: Add hooks for SuiteSetUp and SuiteTearDown, so this can be estimated more accurately + m_internalReport.time = (GetMilliTicks() - m_internalReport.timeStamp) / 1000.0; // For now, update the duration on every test complete - the last one will be essentially correct +} + +bool TestReport::AllTestsPassed() const +{ + return (m_internalReport.tests > 0) && + ((m_internalReport.passed + m_internalReport.skipped) == m_internalReport.tests) && + (0 == m_internalReport.failures); +} + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestReport.h b/Test/PlayFabServicesTestApp/TestFramework/TestReport.h new file mode 100644 index 0000000..4518d3f --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestReport.h @@ -0,0 +1,62 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include "TestContext.h" + +namespace PlayFab +{ +namespace Test +{ + +/// +/// Data container defining the test-case data saved to JUnit XML format +/// +class TestCaseReport +{ +public: + String classname; // suite class name + String name; // test name + double time; // Duration in seconds + // Sub-Fields in the XML spec + /// message is the descriptive text used to debug the test failure + String message; + /// The xml spec allows failureText to be an arbitrary string. When possible it should match FinishState (But not required) + String failureText; + TestFinishState finishState; +}; + +/// +/// Data container defining the test-suite data saved to JUnit XML format +/// +class TestSuiteReport +{ +public: + String name = "default"; // suite class name + int tests; // total test count + int failures; // count tests in state + int errors; // count tests in state + int skipped; // count tests in state + double time; // Duration in seconds + // Useful for debugging but not part of the serialized format + int64_t timeStamp; + int passed; // Could be calculated from the others, but sometimes knowing if they don't add up means something + List> testResults; +}; + +class TestReport +{ +public: + TestReport(String testReportName); + + void TestStarted(); + void TestComplete(String testName, TestFinishState testFinishState, int64_t testDurationMs, String message); + bool AllTestsPassed() const; + +private: + TestSuiteReport m_internalReport; + +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestRunner.cpp b/Test/PlayFabServicesTestApp/TestFramework/TestRunner.cpp new file mode 100644 index 0000000..a3db260 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestRunner.cpp @@ -0,0 +1,306 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "TestAppPch.h" +#include +#include "TestClass.h" +#include "TestContext.h" +#include "TestRunner.h" +#include "EnumTraits.h" +#include "TestTypes.h" +#include "Platform/PlatformUtils.h" +#include "Platform/PlayFabPal.h" +#include "Tests/Core/AuthenticationTests.h" +#include "Tests/Core/EventPipelineTests.h" +#include "Generated/GeneratedTestsBootstrapper.h" + +#include +#include +#include +#include + +namespace PlayFab +{ +namespace Test +{ + +std::atomic TestRunner::s_hcTraceCallbackContext = nullptr; + +HRESULT TestRunner::Initialize() +{ + // Init tracing + RETURN_IF_FAILED(PFHCSettingsSetTraceLevel(PFHCTraceLevel::Verbose)); + PFHCTraceSetTraceToDebugger(true); + + // LHC doesn't have a context pointer for the trace callback, so we're using a static member as a callback context + s_hcTraceCallbackContext = this; + PFHCTraceSetClientCallback(PFHCTraceCallback); + + // Init Platform hooks to be used throughout PlayFab tests + RETURN_IF_FAILED(Platform::SetHooks()); + + // Load the TestTitleData + TestTitleData titleData; + RETURN_IF_FAILED(Platform::GetTestTitleData(titleData)); + + // Initialize the list of TestClasses + m_testClasses.emplace_back(MakeShared(titleData)); + m_testClasses.emplace_back(MakeShared(titleData)); + + // Add autogenerated tests + auto generatedTests = GetGeneratedTestClasses(titleData); + m_testClasses.insert(m_testClasses.end(), generatedTests.begin(), generatedTests.end()); + + m_activeTestClass = m_testClasses.begin(); + + return S_OK; +} + +void TestRunner::SetTestList(Set testNames) +{ + m_testList = std::move(testNames); +} + +bool TestRunner::Update() +{ + if (m_activeTestClass == m_testClasses.end()) + { + // All tests done, log test summary. Update() should not be called again after this + auto testSummary = GenerateTestSummary(); + AddLog(PFHCTraceLevel::Important, testSummary.c_str()); + return true; + } + + if (!m_activeTestClassInitialized) + { + // Add the tests from the current TestClass. + auto& testClassTests = (*m_activeTestClass)->GetTests(); + + // If this test class has no tests on m_testList, skip it + if (!m_testList.empty()) + { + bool haveTestsToRun = false; + for (auto& test : testClassTests) + { + if (m_testList.find(test->TestName()) != m_testList.end()) + { + haveTestsToRun = true; + break; + } + } + if (!haveTestsToRun) + { + ++m_activeTestClass; + return false; + } + } + + m_activeTestClassTests.insert(m_activeTestClassTests.end(), testClassTests.begin(), testClassTests.end()); + m_activeTest = m_activeTestClassTests.begin(); + + // Initialize TestClass + // TODO: this should probably be changed to asynchronous at some point - ClassSetUp often involves async API + // calls and this just blocks until they complete currently + AddLog(PFHCTraceLevel::Verbose, "[TestClass] Starting"); + (*m_activeTestClass)->ClassSetUp(); + + m_activeTestClassInitialized = true; + } + + if (m_activeTest == m_activeTestClassTests.end()) + { + // If we are at the end of the current TestClass's tests, cleanup + m_activeTestClassTests.clear(); + (*m_activeTestClass)->ClassTearDown(); + + // Move to the next test class and return. It will be initialized and run next time Update is called + ++m_activeTestClass; + m_activeTestClassInitialized = false; + + return false; + } + + auto& test{ *m_activeTest }; + + if (!m_testList.empty() && (m_testList.find(test->TestName()) == m_testList.end())) + { + ++m_activeTest; + return false; + } + + switch (test->ActiveState()) + { + case TestActiveState::PENDING: + { + // Begin test + test->StartTest(); + AddLog(PFHCTraceLevel::Verbose, "[Test] Starting: %s", test->TestName().c_str()); + + // Update TestReport + m_testReport.TestStarted(); + + break; + } + case TestActiveState::ACTIVE: + { + if (!test->IsExpired()) + { + (*m_activeTestClass)->Tick(*test); + } + else + { + test->Timeout(); + } + break; + } + case TestActiveState::COMPLETE: + { + String testFinishStateText = EnumName(test->FinishState()); + AddLog(PFHCTraceLevel::Important, "[Test] Completed: %s %s", test->TestName().c_str(), testFinishStateText.c_str()); + + // Update TestReport + int64_t testDurationMs = test->EndTime() - test->StartTime(); + m_testReport.TestComplete(test->TestName(), test->FinishState(), testDurationMs, test->Summary()); + + // Move to next test + ++m_activeTest; + + break; + } + default: + { + assert(false); // shouldn't get here + break; + } + } + + return false; +} + +// Run the remainder of the currently executing test, cleanup the active TestClass and then return +bool TestRunner::Cleanup() +{ + if (m_activeTestClass != m_testClasses.end()) + { + if (m_activeTest != m_activeTestClassTests.end()) + { + auto& test = *m_activeTest; + while (test->ActiveState() == TestActiveState::ACTIVE) + { + Update(); + std::this_thread::yield(); + } + } + + (*m_activeTestClass)->ClassTearDown(); + } + + // Reset LHC trace callback + PFHCTraceSetClientCallback(nullptr); + s_hcTraceCallbackContext = nullptr; + + return m_testReport.AllTestsPassed(); +} + +String TestRunner::GenerateTestSummary() +{ + Stringstream summaryStream; + + int64_t timeNow = GetMilliTicks(); + int64_t testStartTime, testEndTime; + size_t testsCount = 0, testsFinishedCount = 0, testsPassedCount = 0, testsFailedCount = 0, testsSkippedCount = 0; + + for (auto& testClass : m_testClasses) + { + auto& testClassTests = testClass->GetTests(); + for (auto& test : testClassTests) + { + testsCount += 1; + + // Count tests + if (TestActiveState::COMPLETE == test->ActiveState()) + { + testsFinishedCount += 1; + + testStartTime = test->StartTime(); + testEndTime = test->EndTime(); + + if (TestFinishState::PASSED == test->FinishState()) + { + testsPassedCount += 1; + } + else if (TestFinishState::SKIPPED == test->FinishState()) + { + testsSkippedCount += 1; + } + else + { + testsFailedCount += 1; + } + } + else + { + testStartTime = (TestActiveState::PENDING == test->ActiveState()) ? timeNow : test->StartTime(); + testEndTime = timeNow; + } + + // Line for each test report + int64_t testDurationMs = testEndTime - testStartTime; + summaryStream << std::setw(10) << testDurationMs << " ms"; + summaryStream << " - " << EnumName(test->FinishState()); + summaryStream << " - " << test->TestName(); + auto& testSummary = test->Summary(); + if (!testSummary.empty()) + { + summaryStream << " - " << testSummary; + } + summaryStream << "\n"; + } + } + + summaryStream << " - Testing complete: "; + summaryStream << testsFinishedCount << "/" << testsCount << " tests run, "; + summaryStream << testsPassedCount << " tests passed, "; + summaryStream << testsFailedCount << " tests failed, "; + summaryStream << testsSkippedCount << " tests skipped."; + + return summaryStream.str(); +} + +void TestRunner::AddLog(PFHCTraceLevel level, _In_z_ _Printf_format_string_ const char* format, ...) +{ + va_list args; + va_start(args, format); + Vector buf(1 + std::vsnprintf(NULL, 0, format, args)); + auto ret = std::vsnprintf(buf.data(), buf.size(), format, args); + va_end(args); + + if (ret < 0) + { + return; + } + + Stringstream message; + message << Platform::GetTimeString(); + message << buf.data(); + message << std::endl; + + // Log message inside lock to keep them serialized + std::lock_guard lock{ m_mutex }; + Platform::TraceMessage(level, message.str()); +} + +void TestRunner::PFHCTraceCallback(_In_z_ const char* areaName, _In_ PFHCTraceLevel level, _In_ uint64_t threadId, _In_ uint64_t timestamp, _In_z_ const char* message) +{ + UNREFERENCED_PARAMETER(areaName); + UNREFERENCED_PARAMETER(threadId); + UNREFERENCED_PARAMETER(timestamp); + + TestRunner* runner{ s_hcTraceCallbackContext.load() }; + if (runner) + { + runner->AddLog(level, message); + } +} + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestRunner.h b/Test/PlayFabServicesTestApp/TestFramework/TestRunner.h new file mode 100644 index 0000000..69eeffc --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestRunner.h @@ -0,0 +1,62 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include "TestReport.h" +#include "TestClass.h" +#include "TestTypes.h" + +namespace PlayFab +{ +namespace Test +{ + +/// +/// Class the controls execution and flow of a Suite of tests +/// +class TestRunner +{ +public: + TestRunner() = default; + + // Initialize TestRunner + HRESULT Initialize(); + + // Set a specific subset of tests to be run. Useful for debugging failing tests. + // If this is not called, all tests will be run by default. + void SetTestList(Set testNames); + + // Tick current test. To be called from game loop. + // Returns true if testing is complete. + bool Update(); + + // Cleanup TestRunner + // Returns true if all tests passed + bool Cleanup(); + +private: + String GenerateTestSummary(); + void AddLog(PFHCTraceLevel level, _In_z_ _Printf_format_string_ const char* format, ...); + static void CALLBACK PFHCTraceCallback(_In_z_ const char* areaName, _In_ PFHCTraceLevel level, _In_ uint64_t threadId, _In_ uint64_t timestamp, _In_z_ const char* message); + +private: + std::mutex m_mutex; + + bool m_bCleanup{ false }; + + TestReport m_testReport{ "PlayFabServicesTestReport" }; + + List> m_testClasses; + List>::iterator m_activeTestClass; + bool m_activeTestClassInitialized{ false }; + + List> m_activeTestClassTests; + List>::iterator m_activeTest; + + Set m_testList; + + static std::atomic s_hcTraceCallbackContext; +}; + +} // namespace Test +} // namespace PlayFab diff --git a/Test/PlayFabServicesTestApp/TestFramework/TestTypes.h b/Test/PlayFabServicesTestApp/TestFramework/TestTypes.h new file mode 100644 index 0000000..71933d4 --- /dev/null +++ b/Test/PlayFabServicesTestApp/TestFramework/TestTypes.h @@ -0,0 +1,37 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#pragma once + +#include +#include +#include +#include +#include "Types.h" + +namespace PlayFab +{ +namespace Test +{ + +using ServiceConfig = Wrappers::ServiceConfig; +using EventPipeline = Wrappers::EventPipeline; +using Entity = Wrappers::Entity; +using EntityKey = Wrappers::PFEntityKeyWrapper; +template +using ModelVector = Wrappers::ModelVector; + +struct TestTitleData +{ + String titleId; + String secretKey; + String connectionString; +}; + +struct LoginResult +{ + Entity entity; + Wrappers::PFAuthenticationLoginResultWrapper loginResult; +}; + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.cpp b/Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.cpp new file mode 100644 index 0000000..726e979 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.cpp @@ -0,0 +1,110 @@ +#include "TestAppPch.h" +#include "AuthenticationTests.h" +#include "Operations/Core/AuthenticationOperations.h" +#include "Platform/PlayFabPal.h" + +using namespace PlayFab::Platform; + +namespace PlayFab +{ +namespace Test +{ + +void AuthenticationTests::AddTests() +{ +#if 0 // removed until GetEntity is enabled + AddTest("TestGetEntity", &AuthenticationTests::TestGetEntity); + AddTest("TestGetEntityMasterPlayerAccount", &AuthenticationTests::TestGetEntityMasterPlayerAccount); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + AddTest("TestGetEntityWithSecretKey", &AuthenticationTests::TestGetEntityWithSecretKey); +#endif +} + +AsyncOp AuthenticationTests::LoginDefaultTitlePlayer() +{ + return Platform::GetDefaultPlatformUser(RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + return Platform::LoginDefaultTitlePlayer(ServiceConfig(), result.ExtractPayload(), RunContext()); + }); +} + +#if 0 +void AuthenticationTests::TestGetEntity(TestContext& tc) +{ + SharedPtr> defaultTitlePlayer = MakeShared>(); + + LoginDefaultTitlePlayer().Then([&, defaultTitlePlayer](Result result)->AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + *defaultTitlePlayer = result.ExtractPayload(); + Wrappers::PFAuthenticationGetEntityRequestWrapper request{}; + return RunOperation(MakeUnique(defaultTitlePlayer->value().entity, std::move(request), RunContext())); + }) + .Then([&, defaultTitlePlayer](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(defaultTitlePlayer->value().entity.EntityKey().Model().id, result.Payload().EntityKey().Model().id, "entityKeyId"); + tc.AssertEqual(defaultTitlePlayer->value().entity.EntityKey().Model().type, result.Payload().EntityKey().Model().type, "entityKeyType"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +constexpr char kMasterAccountType[]{ "master_player_account" }; + +void AuthenticationTests::TestGetEntityMasterPlayerAccount(TestContext& tc) +{ + SharedPtr> defaultTitlePlayer = MakeShared>(); + + LoginDefaultTitlePlayer().Then([&, defaultTitlePlayer](Result result)->AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + *defaultTitlePlayer = result.ExtractPayload(); + Wrappers::PFAuthenticationGetEntityRequestWrapper request{}; + Wrappers::PFEntityKeyWrapper key{}; + key.SetId(defaultTitlePlayer->value().loginResult.Model().playFabId); + key.SetType(kMasterAccountType); + request.SetEntity(key); + return RunOperation(MakeUnique(defaultTitlePlayer->value().entity, std::move(request), RunContext())); + }) + .Then([&, defaultTitlePlayer](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(defaultTitlePlayer->value().loginResult.Model().playFabId, result.Payload().EntityKey().Model().id, "entityKeyId"); + tc.AssertEqual(kMasterAccountType, result.Payload().EntityKey().Model().type, "entityKeyType"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_WIN32 +constexpr char kTitleType[]{ "title" }; + +void AuthenticationTests::TestGetEntityWithSecretKey(TestContext& tc) +{ + Wrappers::PFAuthenticationGetEntityRequestWrapper request{}; + RunOperation(MakeUnique(ServiceConfig(), m_testTitleData.secretKey.data(), std::move(request), RunContext())).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(m_testTitleData.titleId.data(), result.Payload().EntityKey().Model().id, "titleId"); + tc.AssertEqual(kTitleType, result.Payload().EntityKey().Model().type, "titleType"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} +#endif // HC_PLATFORM == HC_PLATFORM_WIN32 + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.h b/Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.h new file mode 100644 index 0000000..accdd90 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Core/AuthenticationTests.h @@ -0,0 +1,32 @@ +#pragma once + +#include "CoreTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +class AuthenticationTests : public CoreTestClass +{ +public: + using CoreTestClass::CoreTestClass; + +private: + // TestClass overrides + void AddTests() override; + + // Test Methods +#if 0 // removed until GetEntity is enabled + void TestGetEntity(TestContext& testContext); + void TestGetEntityMasterPlayerAccount(TestContext& testContext); +#endif +#if HC_PLATFORM == HC_PLATFORM_WIN32 + void TestGetEntityWithSecretKey(TestContext& testContext); +#endif + + AsyncOp LoginDefaultTitlePlayer(); +}; + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.cpp b/Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.cpp new file mode 100644 index 0000000..2b7fd30 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.cpp @@ -0,0 +1,1600 @@ +#include "TestAppPch.h" +#include "EventPipelineTests.h" +#include "Operations/Core/AuthenticationOperations.h" +#include "Platform/PlatformUtils.h" +#include "Platform/PlayFabPal.h" + +using namespace PlayFab::Platform; + +namespace PlayFab +{ +namespace Test +{ + +void EventPipelineTests::AddTests() +{ + AddTest("TestEmitPlayStreamEvents", &EventPipelineTests::TestEmitPlayStreamEvents); + AddTest("TestEmitTelemetryEvents", &EventPipelineTests::TestEmitTelemetryEvents); + AddTest("TestEmitBarebonesEventPipeline", &EventPipelineTests::TestEmitBarebonesEventPipeline); + AddTest("TestEmitMalformedPlayStreamEvent", &EventPipelineTests::TestEmitMalformedPlayStreamEvent); + AddTest("TestEmitMalformedTelemetryEvent", &EventPipelineTests::TestEmitMalformedTelemetryEvent); + AddTest("TestInvalidParamsRetryPlayStreamEvent", &EventPipelineTests::TestInvalidParamsRetryPlayStreamEvent); + AddTest("TestInvalidParamsRetryTelemetryEvent", &EventPipelineTests::TestInvalidParamsRetryTelemetryEvent); + AddTest("TestEmitMalformedJSONPlayStreamEvent", &EventPipelineTests::TestEmitMalformedJSONPlayStreamEvent); + AddTest("TestEmitMalformedJSONTelemetryEvent", &EventPipelineTests::TestEmitMalformedJSONTelemetryEvent); + AddTest("TestEmitTelemetryEventsWithInvalidTelemetryKey", &EventPipelineTests::TestEmitTelemetryEventsWithInvalidTelemetryKey); + AddTest("TestEmitTelemetryEventsWithInactiveTelemetryKey", &EventPipelineTests::TestEmitTelemetryEventsWithInactiveTelemetryKey); + AddTest("TestEmitTelemetryEventsWithTelemetryKey", &EventPipelineTests::TestEmitTelemetryEventsWithTelemetryKey); + AddTest("TestEmitTelemetryEventsAddRemoveEntity", &EventPipelineTests::TestEmitTelemetryEventsAddRemoveEntity); + AddTest("TestEmitTelemetryEventsUpdateBatchSize", &EventPipelineTests::TestEmitTelemetryEventsUpdateBatchSize); + AddTest("TestRemoveEntityFromPlayStreamPipeline", &EventPipelineTests::TestRemoveEntityFromPlayStreamPipeline); + AddTest("TestRemoveEntityNoFallbackAuth", &EventPipelineTests::TestRemoveEntityNoFallbackAuth); +} + +AsyncOp EventPipelineTests::Initialize() +{ + return CoreTestClass::Initialize().Then([this](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + return Platform::GetDefaultPlatformUser(RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + return Platform::LoginDefaultTitlePlayer(ServiceConfig(), result.ExtractPayload(), RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + m_defaultTitlePlayer.emplace(std::move(result.ExtractPayload().entity)); + return S_OK; + }); +} + +AsyncOp EventPipelineTests::Uninitialize() +{ + m_defaultTitlePlayer.reset(); + return CoreTestClass::Uninitialize(); +} + +Entity EventPipelineTests::DefaultTitlePlayer() const +{ + assert(m_defaultTitlePlayer.has_value()); + return *m_defaultTitlePlayer; +} + +class EventPipelineTestState +{ +public: + EventPipelineTestState(TestContext& tc, Entity uploadingEntity, RunContext pipelineRunContext); + EventPipelineTestState(TestContext& tc, PFEventPipelineTelemetryKeyConfig* telemetryKeyConfig, RunContext pipelineRunContext); + virtual ~EventPipelineTestState() = default; + + TestContext& TestContext() const; + EventPipeline const& PlayStreamEventPipeline() const; + EventPipeline const& TelemetryEventPipeline() const; + EventPipeline const& BarebonesEventPipeline() const; + EventPipeline const& NoAuthEventPipeline() const; + +protected: + virtual void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount); + virtual void OnBatchUploadFailed(HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount); + +private: + static void CALLBACK OnBatchUploadedHandler(void* context, PFUploadedEvent const* const* events, size_t eventsCount); + static void CALLBACK OnBatchUploadFailedHandler(void* context, HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount); + + Test::TestContext& m_tc; + EventPipeline m_playStreamEventPipeline; + EventPipeline m_telemetryEventPipeline; + EventPipeline m_barebonesEventPipeline; + EventPipeline m_noAuthEventPipeline; +}; + +void EventPipelineTests::TestEmitTelemetryEventsWithInvalidTelemetryKey(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + PFEvent event + { + nullptr, + "custom.playfab.events.PlayFab.Test.EventsWithInvalidTelemetryKey", + "TelemetryEvent", + nullptr, + "{}" + }; + + for (auto& eventId : m_eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(NoAuthEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + private: + void OnBatchUploaded(PFUploadedEvent const* const* /*events*/, size_t /*eventsCount*/) + { + // Batch should fail validation because there is an inactive telemetry key + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + + try + { + TestContext().AssertEqual(E_PF_TELEMETRY_KEY_INVALID, hr, "Unexpected error received"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + m_completedEvents += eventsCount; + + if (m_completedEvents == m_eventIdsToWrite.size()) + { + TestContext().EndTest(unexpectedResponse ? E_FAIL : S_OK); + + lock.unlock(); + UniquePtr reclaim{ this }; + } + } + + std::mutex m_mutex; + bool unexpectedResponse = false; + Set const m_eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + size_t m_completedEvents{ 0 }; + }; + + PlayFab::Test::ServiceConfig serviceConfig = ServiceConfig(); + PFEventPipelineTelemetryKeyConfig telemetryKeyConfig{ "invalidKey", serviceConfig.Handle()}; + UniquePtr state = MakeUnique(tc, &telemetryKeyConfig, RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestEmitTelemetryEventsWithInactiveTelemetryKey(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + PFEvent event + { + nullptr, + "custom.playfab.events.PlayFab.Test.EventsWithInactiveTelemetryKey", + "TelemetryEvent", + nullptr, + "{}" + }; + + for (auto& eventId : m_eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(NoAuthEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + private: + void OnBatchUploaded(PFUploadedEvent const* const* /*events*/, size_t /*eventsCount*/) + { + // Batch should fail validation because there is an inactive telemetry key + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + + try + { + TestContext().AssertEqual(E_PF_TELEMETRY_KEY_DEACTIVATED, hr, "Unexpected error received"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + m_completedEvents += eventsCount; + + if (m_completedEvents == m_eventIdsToWrite.size()) + { + TestContext().EndTest(unexpectedResponse ? E_FAIL : S_OK); + + lock.unlock(); + UniquePtr reclaim{ this }; + } + } + + std::mutex m_mutex; + bool unexpectedResponse = false; + Set const m_eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + size_t m_completedEvents{ 0 }; + }; + + PlayFab::Test::ServiceConfig serviceConfig = ServiceConfig(); + PFEventPipelineTelemetryKeyConfig telemetryKeyConfig{ kInactiveTelemetryKey, serviceConfig.Handle() }; + UniquePtr state = MakeUnique(tc, &telemetryKeyConfig, RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestEmitTelemetryEventsWithTelemetryKey(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + PFEntityKey pfEntityKey { "my-unique-ID", "external"}; + + PFEvent event + { + &pfEntityKey, + "custom.playfab.events.PlayFab.Test.EventsWithTelemetryKey", + "TelemetryEvent", + nullptr, + "{}" + }; + + for (auto& eventId : m_eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(NoAuthEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + private: + void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFUploadedEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void OnBatchUploadFailed(HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + TestContext().RecordResult(Result{ hr, errorMessage }); + + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void ValidateEvents(Vector&& eventClientIds, std::unique_lock&& lock) + { + for (auto& id : eventClientIds) + { + TestContext().AssertTrue(m_eventIdsToWrite.find(id) != m_eventIdsToWrite.end(), "Unexpected EventId"); + } + + m_completedEvents += eventClientIds.size(); + if (m_completedEvents == m_eventIdsToWrite.size()) + { + TestContext().EndTest(S_OK); + + lock.unlock(); + UniquePtr reclaim{ this }; + } + } + + std::mutex m_mutex; + Set const m_eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + size_t m_completedEvents{ 0 }; + }; + + PlayFab::Test::ServiceConfig serviceConfig = ServiceConfig(); + PFEventPipelineTelemetryKeyConfig telemetryKeyConfig{ kActiveTelemetryKey, serviceConfig.Handle() }; + UniquePtr state = MakeUnique(tc, &telemetryKeyConfig, RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestRemoveEntityNoFallbackAuth(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT RemoveUploadingEntity() + { + RETURN_IF_FAILED(TelemetryEventPipeline().RemoveUploadingEntity()); + + return S_OK; + } + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->RemoveUploadingEntity(); + + state.reset(); // Destroy pipeline so no callback arrive after we end the test + + if (FAILED(hr)) + { + hr == E_FAIL ? tc.EndTest(S_OK) : tc.EndTest(hr); + } + else + { + tc.EndTest(E_FAIL); + } +} + +void EventPipelineTests::TestEmitTelemetryEventsAddRemoveEntity(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents(std::string eventSuffix) + { + std::string eventName = "custom.playfab.events.PlayFab.Test." + eventSuffix; + + PFEvent event + { + nullptr, + eventName.c_str(), + "TelemetryEvent", + nullptr, + "{}" + }; + + Set eventIdsToWrite = eventSuffix == "EventsWithEntity" ? m_eventIdsToWriteWithEntity : m_eventIdsToWriteWithoutEntity; + + for (auto& eventId : eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(NoAuthEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + HRESULT AddUploadingEntity(Entity uploadingEntity) + { + RETURN_IF_FAILED(NoAuthEventPipeline().AddUploadingEntity(std::move(uploadingEntity.Handle()))); + + return S_OK; + } + + HRESULT RemoveUploadingEntity() + { + RETURN_IF_FAILED(NoAuthEventPipeline().RemoveUploadingEntity()); + + return S_OK; + } + + private: + void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFUploadedEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void OnBatchUploadFailed(HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + TestContext().RecordResult(Result{ hr, errorMessage }); + + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void ValidateEvents(Vector&& eventClientIds, std::unique_lock&& lock) + { + for (auto& id : eventClientIds) + { + bool foundClientIdWithEntity = m_eventIdsToWriteWithEntity.find(id) != m_eventIdsToWriteWithEntity.end(); + bool foundClientIdWithoutEntity = m_eventIdsToWriteWithoutEntity.find(id) != m_eventIdsToWriteWithoutEntity.end(); + + TestContext().AssertTrue(foundClientIdWithEntity || foundClientIdWithoutEntity, "Unexpected EventId"); + } + + m_completedEvents += eventClientIds.size(); + if (m_completedEvents == m_eventIdsToWriteWithEntity.size() + m_eventIdsToWriteWithoutEntity.size()) + { + TestContext().EndTest(S_OK); + + lock.unlock(); + UniquePtr reclaim{ this }; + } + } + + std::mutex m_mutex; + Set const m_eventIdsToWriteWithEntity{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + Set const m_eventIdsToWriteWithoutEntity{ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; + size_t m_completedEvents{ 0 }; + }; + + PlayFab::Test::ServiceConfig serviceConfig = ServiceConfig(); + PFEventPipelineTelemetryKeyConfig telemetryKeyConfig{ kActiveTelemetryKey, serviceConfig.Handle() }; + UniquePtr state = MakeUnique(tc, &telemetryKeyConfig, RunContext().Derive()); + + HRESULT hr = state->AddUploadingEntity(DefaultTitlePlayer()); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + hr = state->EmitEvents("EventsWithEntity"); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + Platform::Sleep(3000); + + hr = state->RemoveUploadingEntity(); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + hr = state->EmitEvents("EventsWithoutEntity"); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } + } + } + } +} + +void EventPipelineTests::TestEmitTelemetryEventsUpdateBatchSize(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + PFEvent event + { + nullptr, + "custom.playfab.events.PlayFab.Test.UpdateBatchSize", + "TelemetryEvent", + nullptr, + "{}" + }; + + for (auto& eventId : m_eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(NoAuthEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + HRESULT UpdateConfiguration() + { + uint32_t batchSize = 4; + PFEventPipelineConfig config{ &batchSize }; + RETURN_IF_FAILED(NoAuthEventPipeline().UpdateConfiguration(config)); + + return S_OK; + } + + private: + void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFUploadedEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void OnBatchUploadFailed(HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + TestContext().RecordResult(Result{ hr, errorMessage }); + + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void ValidateEvents(Vector&& eventClientIds, std::unique_lock&& lock) + { + for (auto& id : eventClientIds) + { + TestContext().AssertTrue(m_eventIdsToWrite.find(id) != m_eventIdsToWrite.end(), "Unexpected EventId"); + } + + m_completedEvents += eventClientIds.size(); + if (m_completedEvents == m_eventIdsToWrite.size()) + { + TestContext().EndTest(S_OK); + + lock.unlock(); + UniquePtr reclaim{ this }; + } + } + + std::mutex m_mutex; + Set const m_eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + size_t m_completedEvents{ 0 }; + }; + + PlayFab::Test::ServiceConfig serviceConfig = ServiceConfig(); + PFEventPipelineTelemetryKeyConfig telemetryKeyConfig{ kActiveTelemetryKey, serviceConfig.Handle() }; + UniquePtr state = MakeUnique(tc, &telemetryKeyConfig, RunContext().Derive()); + + HRESULT hr = state->UpdateConfiguration(); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + hr = state->EmitEvents(); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } + } +} + +void EventPipelineTests::TestEmitTelemetryEvents(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + PFEvent event + { + nullptr, + "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests", + "TelemetryEvent", + nullptr, + "{}" + }; + + for (auto& eventId : m_eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + private: + void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFUploadedEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void OnBatchUploadFailed(HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + TestContext().RecordResult(Result{ hr, errorMessage }); + + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void ValidateEvents(Vector&& eventClientIds, std::unique_lock&& lock) + { + for (auto& id : eventClientIds) + { + TestContext().AssertTrue(m_eventIdsToWrite.find(id) != m_eventIdsToWrite.end(), "Unexpected EventId"); + } + + m_completedEvents += eventClientIds.size(); + if (m_completedEvents == m_eventIdsToWrite.size()) + { + TestContext().EndTest(S_OK); + + lock.unlock(); + UniquePtr reclaim{ this }; + } + } + + std::mutex m_mutex; + Set const m_eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + size_t m_completedEvents{ 0 }; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestEmitPlayStreamEvents(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + PFEvent event + { + nullptr, + "com.playfab.events.PlayFab.Test.PlayStreamEventPipelineTests", + "PlayStreamEvent", + nullptr, + "{}" + }; + + for (auto& eventId : m_eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + private: + void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFUploadedEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void OnBatchUploadFailed(HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + TestContext().RecordResult(Result{ hr, errorMessage }); + + Vector uploadedEvents(eventsCount); + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFEvent const* event) + { + return atoi(event->clientId); + }); + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void ValidateEvents(Vector&& eventClientIds, std::unique_lock&& lock) + { + for (auto& id : eventClientIds) + { + TestContext().AssertTrue(m_eventIdsToWrite.find(id) != m_eventIdsToWrite.end(), "Unexpected EventId"); + } + + m_completedEvents += eventClientIds.size(); + if (m_completedEvents == m_eventIdsToWrite.size()) + { + TestContext().EndTest(S_OK); + + lock.unlock(); + UniquePtr reclaim{ this }; + } + } + + std::mutex m_mutex; + Set const m_eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + size_t m_completedEvents{ 0 }; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestEmitBarebonesEventPipeline(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + PFEvent event + { + nullptr, + "com.playfab.events.PlayFab.Test.BarebonesEventPipelineTests", + "PlayStreamEvent", + nullptr, + "{}" + }; + + for (auto& eventId : m_eventIdsToWrite) + { + std::string clientId = std::to_string(eventId); + event.clientId = clientId.c_str(); + RETURN_IF_FAILED(BarebonesEventPipeline().EmitEvent(&event)); + } + + return S_OK; + } + + private: + + Set const m_eventIdsToWrite{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + tc.EndTest(S_OK); + } +} + +void EventPipelineTests::TestEmitMalformedPlayStreamEvent(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&malformedEvent)); + + return S_OK; + } + + private: + PFEvent malformedEvent + { + nullptr, + "PlayFab::Test", // Namespace can't contain ':' so this should be rejected + "MalformedPlayStreamEvent", + nullptr, + "{}" + }; + + void OnBatchUploaded(PFUploadedEvent const* const* /*events*/, size_t /*eventsCount*/) + { + // Batch should fail validation because there is a malformed event + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + try + { + TestContext().AssertEqual(E_PF_INVALID_PARAMS, hr, "Unexpected error received"); + TestContext().AssertEqual(1, eventsCount, "Unexpected eventsCount found"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + TestContext().EndTest(unexpectedResponse ? E_FAIL : S_OK); + UniquePtr reclaim{ this }; + } + + bool unexpectedResponse = false; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestEmitMalformedJSONTelemetryEvent(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&event)); + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&malformedJSONEvent)); + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&event)); + + return S_OK; + } + + private: + PFEvent event + { + nullptr, + "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests", + "TelemetryEvent", + nullptr, + "{}" + }; + + PFEvent malformedJSONEvent + { + nullptr, + "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests", + "MalformedJSONTelemetryEvent", + nullptr, + "{" + }; + + void OnBatchUploaded(PFUploadedEvent const* const* /*events*/, size_t /*eventsCount*/) + { + // Batch should fail validation because there is a malformed event + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + try + { + TestContext().AssertEqual(E_PF_INVALID_JSON_CONTENT, hr, "Unexpected error received"); + TestContext().AssertEqual(3, eventsCount, "Unexpected eventsCount found"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + TestContext().EndTest(unexpectedResponse ? E_FAIL : S_OK); + UniquePtr reclaim{ this }; + } + + bool unexpectedResponse = false; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestEmitMalformedJSONPlayStreamEvent(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&event)); + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&malformedJSONEvent)); + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&event)); + + return S_OK; + } + + private: + PFEvent event + { + nullptr, + "com.playfab.events.PlayFab.Test.PlayStreamEventPipelineTests", + "PlayStreamEvent", + nullptr, + "{}" + }; + + PFEvent malformedJSONEvent + { + nullptr, + "com.playfab.events.PlayFab.Test.PlayStreamEventPipelineTests", // Namespace can't contain ':' so this should be rejected + "MalformedJSONPlayStreamEvent", + nullptr, + "{" + }; + + void OnBatchUploaded(PFUploadedEvent const* const* /*events*/, size_t /*eventsCount*/) + { + // Batch should fail validation because there is a malformed event + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + try + { + TestContext().AssertEqual(E_PF_INVALID_JSON_CONTENT, hr, "Unexpected error received"); + TestContext().AssertEqual(3, eventsCount, "Unexpected eventsCount found"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + TestContext().EndTest(unexpectedResponse ? E_FAIL : S_OK); + UniquePtr reclaim{ this }; + } + + bool unexpectedResponse = false; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestEmitMalformedTelemetryEvent(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&malformedEvent)); + + return S_OK; + } + + private: + PFEvent malformedEvent + { + nullptr, + "PlayFab::Test", // Namespace can't contain ':' so this should be rejected + "MalformedTelemetryEvent", + nullptr, + "{}" + }; + + void OnBatchUploaded(PFUploadedEvent const* const* /*events*/, size_t /*eventsCount*/) + { + // Batch should fail validation because there is a malformed event + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + try + { + TestContext().AssertEqual(E_PF_INVALID_PARAMS, hr, "Unexpected error received"); + TestContext().AssertEqual(1, eventsCount, "Unexpected eventsCount found"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + TestContext().EndTest(unexpectedResponse ? E_FAIL : S_OK); + UniquePtr reclaim{ this }; + } + + bool unexpectedResponse = false; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestInvalidParamsRetryPlayStreamEvent(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + for (auto& eventId : m_retryEventIdsToWrite) + { + event.clientId = eventId.c_str(); + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&event)); + } + + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&malformedEvent)); + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&malformedEventLongNamespace)); + RETURN_IF_FAILED(PlayStreamEventPipeline().EmitEvent(&malformedEventLongEventId)); + + return S_OK; + } + + private: + PFEvent event + { + nullptr, + "com.playfab.events.PlayFab.Test.PlayStreamEventPipelineTests", + "PlayStreamEvent", + nullptr, + "{}" + }; + + PFEvent malformedEvent + { + nullptr, + "PlayFab::Test", // Namespace can't contain ':' so this should be rejected + "MalformedPlayStreamEvent", + nullptr, + "{}" + }; + + PFEvent malformedEventLongNamespace + { + nullptr, + "com.playfab.events.PlayFab.Test.PlayStreamEventPipelineTests.long.namespace", // Namespace can't contain ':' so this should be rejected + "MalformedPlayStreamEvent", + nullptr, + "{}" + }; + + PFEvent malformedEventLongEventId + { + nullptr, + "com.playfab.events.PlayFab.Test.PlayStreamEventPipelineTests", + "MalformedTelemetryEvent", + "MalformedPlayStreamEventIdLongerThan32Characters", + "{}" + }; + + void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + Vector uploadedEvents(eventsCount); + + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFUploadedEvent const* event) + { + return event->clientId; + }); + + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + try + { + TestContext().AssertEqual(E_PF_INVALID_PARAMS, hr, "translatedError"); + TestContext().AssertEqual(3, eventsCount, "eventsCount"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + if (unexpectedResponse) + { + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + else + { + if (handlerCompleted) + { + TestContext().EndTest(S_OK); + UniquePtr reclaim{ this }; + } + else + { + handlerCompleted = true; + } + } + } + + void ValidateEvents(Vector&& eventClientIds, std::unique_lock&& lock) + { + try + { + TestContext().AssertEqual(int(eventClientIds.size()), 2, "Unexpected events size"); + + for (auto id : eventClientIds) + { + std::string str(id); + TestContext().AssertTrue(m_retryEventIdsToWrite.find(str) != m_retryEventIdsToWrite.end(), "Unexpected EventId"); + } + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + if (unexpectedResponse) + { + TestContext().EndTest(S_OK); + lock.unlock(); + UniquePtr reclaim{ this }; + } + else + { + if (handlerCompleted) + { + TestContext().EndTest(S_OK); + lock.unlock(); + UniquePtr reclaim{ this }; + } + else + { + handlerCompleted = true; + } + } + } + + std::mutex m_mutex; + Set const m_retryEventIdsToWrite{ "retryEventId1", "retryEventId2" }; + bool handlerCompleted = false; + bool unexpectedResponse = false; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestInvalidParamsRetryTelemetryEvent(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT EmitEvents() + { + for (auto& eventId : m_retryEventIdsToWrite) + { + event.clientId = eventId.c_str(); + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&event)); + } + + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&malformedEvent)); + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&malformedEventLongNamespace)); + RETURN_IF_FAILED(TelemetryEventPipeline().EmitEvent(&malformedEventLongEventId)); + + return S_OK; + } + + private: + PFEvent event + { + nullptr, + "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests", + "TelemetryEvent", + nullptr, + "{}" + }; + + PFEvent malformedEvent + { + nullptr, + "PlayFab::Test", // Namespace can't contain ':' so this should be rejected + "MalformedTelemetryEvent", + nullptr, + "{}" + }; + + PFEvent malformedEventLongNamespace + { + nullptr, + "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests.long.namespace", // Namespace can't contain ':' so this should be rejected + "MalformedTelemetryEvent", + nullptr, + "{}" + }; + + PFEvent malformedEventLongEventId + { + nullptr, + "custom.playfab.events.PlayFab.Test.TelemetryEventPipelineTests", + "MalformedTelemetryEvent", + "MalformedTelemetryEventIdLongerThan32Characters", + "{}" + }; + + void OnBatchUploaded(PFUploadedEvent const* const* events, size_t eventsCount) + { + std::unique_lock lock{ m_mutex }; + Vector uploadedEvents(eventsCount); + + std::transform(events, events + eventsCount, uploadedEvents.begin(), [&](PFUploadedEvent const* event) + { + return event->clientId; + }); + + ValidateEvents(std::move(uploadedEvents), std::move(lock)); + } + + void OnBatchUploadFailed(HRESULT hr, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t eventsCount) + { + try + { + TestContext().AssertEqual(E_PF_INVALID_PARAMS, hr, "translatedError"); + TestContext().AssertEqual(3, eventsCount, "eventsCount"); + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + if (unexpectedResponse) + { + TestContext().EndTest(E_FAIL); + UniquePtr reclaim{ this }; + } + else + { + if (handlerCompleted) + { + TestContext().EndTest(S_OK); + UniquePtr reclaim{ this }; + } + else + { + handlerCompleted = true; + } + } + } + + void ValidateEvents(Vector&& eventClientIds, std::unique_lock&& lock) + { + try + { + TestContext().AssertEqual(int(eventClientIds.size()), 2, "Unexpected events size"); + + for (auto id : eventClientIds) + { + std::string str(id); + TestContext().AssertTrue(m_retryEventIdsToWrite.find(str) != m_retryEventIdsToWrite.end(), "Unexpected EventId"); + } + } + catch (Exception& e) + { + TestContext().RecordResult(Result{ E_FAIL, e.what() }); + unexpectedResponse = true; + } + + if (unexpectedResponse) + { + TestContext().EndTest(S_OK); + lock.unlock(); + UniquePtr reclaim{ this }; + } + else + { + if (handlerCompleted) + { + TestContext().EndTest(S_OK); + lock.unlock(); + UniquePtr reclaim{ this }; + } + else + { + handlerCompleted = true; + } + } + } + + std::mutex m_mutex; + Set const m_retryEventIdsToWrite{ "retryEventId1", "retryEventId2" }; + bool handlerCompleted = false; + bool unexpectedResponse = false; + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->EmitEvents(); + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(hr); + } + else + { + state.release(); // Reclaimed in Pipeline callbacks + } +} + +void EventPipelineTests::TestRemoveEntityFromPlayStreamPipeline(TestContext& tc) +{ + class State : public EventPipelineTestState + { + public: + using EventPipelineTestState::EventPipelineTestState; + + HRESULT RemoveUploadingEntity() + { + RETURN_IF_FAILED(PlayStreamEventPipeline().RemoveUploadingEntity()); + + return S_OK; + } + }; + + UniquePtr state = MakeUnique(tc, DefaultTitlePlayer(), RunContext().Derive()); + + HRESULT hr = state->RemoveUploadingEntity(); + + if (FAILED(hr)) + { + state.reset(); // Destroy pipeline so no callback arrive after we end the test + tc.EndTest(S_OK); + } + else + { + state.reset(); // Reclaimed in Pipeline callbacks + } +} + +// EventPipelineTestState Implementation +EventPipelineTestState::EventPipelineTestState(Test::TestContext& tc, Entity uploadingEntity, RunContext pipelineRunContext) + : m_tc{ tc }, + m_playStreamEventPipeline + { + PFEventPipelineType::PlayStream, + std::move(uploadingEntity.Handle()), + pipelineRunContext.TaskQueueHandle(), + &EventPipelineTestState::OnBatchUploadedHandler, + &EventPipelineTestState::OnBatchUploadFailedHandler, + this + }, + m_telemetryEventPipeline + { + PFEventPipelineType::Telemetry, + std::move(uploadingEntity.Handle()), + pipelineRunContext.TaskQueueHandle(), + &EventPipelineTestState::OnBatchUploadedHandler, + &EventPipelineTestState::OnBatchUploadFailedHandler, + this + }, + m_barebonesEventPipeline + { + PFEventPipelineType::PlayStream, + std::move(uploadingEntity.Handle()), + pipelineRunContext.TaskQueueHandle() + } +{ +} + +// EventPipelineTestState Implementation +EventPipelineTestState::EventPipelineTestState(Test::TestContext& tc, PFEventPipelineTelemetryKeyConfig* telemetryKeyConfig, RunContext pipelineRunContext) + : m_tc{ tc }, + m_noAuthEventPipeline { + telemetryKeyConfig, + pipelineRunContext.TaskQueueHandle(), + &EventPipelineTestState::OnBatchUploadedHandler, + &EventPipelineTestState::OnBatchUploadFailedHandler, + this + } +{ +} + +TestContext& EventPipelineTestState::TestContext() const +{ + return m_tc; +} + +EventPipeline const& EventPipelineTestState::PlayStreamEventPipeline() const +{ + return m_playStreamEventPipeline; +} + +EventPipeline const& EventPipelineTestState::TelemetryEventPipeline() const +{ + return m_telemetryEventPipeline; +} + +EventPipeline const& EventPipelineTestState::BarebonesEventPipeline() const +{ + return m_barebonesEventPipeline; +} + +EventPipeline const& EventPipelineTestState::NoAuthEventPipeline() const +{ + return m_noAuthEventPipeline; +} + +void EventPipelineTestState::OnBatchUploaded(PFUploadedEvent const* const* /*events*/, size_t /*eventsCount*/) +{ + // Override to handle batch uploaded events +} + +void EventPipelineTestState::OnBatchUploadFailed(HRESULT /*hr*/, const char* /*errorMessage*/, PFEvent const* const* /*events*/, size_t /*eventsCount*/) +{ + // Override to handle batch upload failed events +} + +void CALLBACK EventPipelineTestState::OnBatchUploadedHandler(void* context, PFUploadedEvent const* const* events, size_t eventsCount) +{ + auto testState = static_cast(context); + testState->OnBatchUploaded(events, eventsCount); +} + +void CALLBACK EventPipelineTestState::OnBatchUploadFailedHandler(void* context, HRESULT hr, const char* errorMessage, PFEvent const* const* events, size_t eventsCount) +{ + auto testState = static_cast(context); + testState->OnBatchUploadFailed(hr, errorMessage, events, eventsCount); +} + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.h b/Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.h new file mode 100644 index 0000000..fac8c1c --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Core/EventPipelineTests.h @@ -0,0 +1,51 @@ +#pragma once + +#include "CoreTestClass.h" + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kActiveTelemetryKey[]{ "AQAAAAAADhjXAIWNJNeN2T4" }; +constexpr char kInactiveTelemetryKey[]{ "AQAAAAAADhjXPF5gRF669kI" }; + +class EventPipelineTests : public CoreTestClass +{ +public: + using CoreTestClass::CoreTestClass; + +private: + // TestClass overrides + void AddTests() override; + + AsyncOp Initialize() override; + AsyncOp Uninitialize() override; + + Entity DefaultTitlePlayer() const; + + // Test Methods + void TestEmitTelemetryEvents(TestContext& testContext); + void TestEmitPlayStreamEvents(TestContext& testContext); + void TestEmitBarebonesEventPipeline(TestContext& testContext); + void TestEmitMalformedPlayStreamEvent(TestContext& testContext); + void TestEmitMalformedTelemetryEvent(TestContext& testContext); + void TestInvalidParamsRetryTelemetryEvent(TestContext& testContext); + void TestInvalidParamsRetryPlayStreamEvent(TestContext& testContext); + void TestEmitMalformedJSONPlayStreamEvent(TestContext& testContext); + void TestEmitMalformedJSONTelemetryEvent(TestContext& testContext); + void TestEmitTelemetryEventsWithInvalidTelemetryKey(TestContext& testContext); + void TestEmitTelemetryEventsWithInactiveTelemetryKey(TestContext& testContext); + void TestEmitTelemetryEventsWithTelemetryKey(TestContext& testContext); + void TestEmitTelemetryEventsAddRemoveEntity(TestContext& testContext); + void TestEmitTelemetryEventsUpdateBatchSize(TestContext& testContext); + void TestRemoveEntityFromPlayStreamPipeline(TestContext& testContext); + void TestRemoveEntityNoFallbackAuth(TestContext& testContext); + + +private: + std::optional m_defaultTitlePlayer; +}; + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/AccountManagementTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/AccountManagementTestsImpl.cpp new file mode 100644 index 0000000..22dc05f --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/AccountManagementTestsImpl.cpp @@ -0,0 +1,866 @@ +#include "TestAppPch.h" +#include "AccountManagementTests.h" +#include "AccountManagementOperations.h" +#include "Operations/Core/AuthenticationOperations.h" +#if HC_PLATFORM == HC_PLATFORM_GDK +#include "GDK/PlatformUser_GDK.h" +#endif + +namespace PlayFab +{ +namespace Test +{ + +struct AccountManagementTestsState +{ +#if HC_PLATFORM == HC_PLATFORM_GDK + String defaultXUserXuidString; +#endif +}; + +AsyncOp AccountManagementTests::Initialize() +{ + return ServicesTestClass::Initialize().Then([&](Result result) -> Result + { +#if HC_PLATFORM == HC_PLATFORM_GDK + auto user = DefaultPlatformUser(); + assert(user); + Stringstream xuidString; + xuidString << user->Id(); + m_state = MakeShared(AccountManagementTestsState{ xuidString.str() }); + return S_OK; +#else + return S_OK; +#endif + }); +} + +AsyncOp AccountManagementTests::Uninitialize() +{ + m_state.reset(); + return ServicesTestClass::Uninitialize(); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientAddOrUpdateContactEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientAddUsernamePassword(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM == HC_PLATFORM_GDK +void VerifyAccountInfoResultPlatformDependent(TestContext& tc, AccountManagementTestsState& testState, ClientGetAccountInfoOperation::ResultType const& result) +{ + auto& model = result.Model(); + tc.AssertEqual(testState.defaultXUserXuidString, model.accountInfo->xboxInfo->xboxUserId, "accountInfo->xboxInfo->xboxUserId"); +} +#else +void VerifyAccountInfoResultPlatformDependent(TestContext& tc, AccountManagementTestsState& testState, ClientGetAccountInfoOperation::ResultType const& result) +{ + UNREFERENCED_PARAMETER(tc); + UNREFERENCED_PARAMETER(testState); + UNREFERENCED_PARAMETER(result); +} +#endif + +void AccountManagementTests::TestClientGetAccountInfo(TestContext& tc) +{ + ClientGetAccountInfoOperation::Run(DefaultTitlePlayer(), {}, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, result.Payload().Model().accountInfo->titleInfo->titlePlayerAccount->id, "accountInfo->titleInfo->titlePlayerAccount->id"); + // Verify platform specific fields + VerifyAccountInfoResultPlatformDependent(tc, *this->m_state, result.Payload()); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void AccountManagementTests::TestClientGetPlayerCombinedInfo(TestContext& tc) +{ + ClientGetPlayerCombinedInfoOperation::RequestType request; + Wrappers::PFGetPlayerCombinedInfoRequestParamsWrapper requestParams; + requestParams.SetGetTitleData(true); + requestParams.SetGetPlayerProfile(true); + requestParams.SetGetUserData(true); + requestParams.SetGetUserAccountInfo(true); + request.SetInfoRequestParameters(requestParams); + + ClientGetPlayerCombinedInfoOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(DefaultTitlePlayerId(), result.Payload().Model().playFabId, "playFabId"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void AccountManagementTests::TestClientGetPlayerProfile(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK + // CustomId of the player whose profile we'll retreive + constexpr char customId[]{ "ProfileCustomId" }; + + auto playFabId = MakeShared(); + + GetPlayFabIdFromCustomId(customId).Then([&, playFabId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + *playFabId = result.ExtractPayload(); + + ClientGetPlayerProfileOperation::RequestType request; + request.SetPlayFabId(*playFabId); + return ClientGetPlayerProfileOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, playFabId](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(*playFabId, result.Payload().Model().playerProfile->playerId, "playerProfile->playerId"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // GDK doesn't support GetPlayFabIdFromCustomId + tc.Skip(); +#endif +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromFacebookIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromFacebookInstantGamesIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromGameCenterIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromGoogleIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromGooglePlayGamesPlayerIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromKongregateIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromNintendoServiceAccountIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromNintendoSwitchDeviceIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromPSNAccountIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientGetPlayFabIDsFromSteamIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientGetPlayFabIDsFromTwitchIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_SONY_PLAYSTATION_4 && HC_PLATFORM != HC_PLATFORM_SONY_PLAYSTATION_5 +constexpr char xboxLiveSandboxId[]{ "XDKS.1" }; + +void AccountManagementTests::TestClientGetPlayFabIDsFromXboxLiveIDs(TestContext& tc) +{ + ClientGetPlayFabIDsFromXboxLiveIDsOperation::RequestType request; + request.SetSandbox(xboxLiveSandboxId); +#if HC_PLATFORM == HC_PLATFORM_GDK + request.SetXboxLiveAccountIDs({ m_state->defaultXUserXuidString }); +#else + request.SetXboxLiveAccountIDs({ "2814639779201810" }); +#endif + + ClientGetPlayFabIDsFromXboxLiveIDsOperation::Run(DefaultTitlePlayer(), request, RunContext()) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.dataCount, "dataCount"); + tc.AssertEqual(1, model.dataCount, "model.dataCount"); + tc.AssertEqual(true, model.data[0]->playFabId != nullptr, "model.data[0]->playFabId null"); +#if HC_PLATFORM == HC_PLATFORM_GDK + tc.AssertEqual(DefaultTitlePlayerId(), model.data[0]->playFabId, "data[0]->playFabId"); +#else + tc.AssertEqual("A13E73660B38980B", model.data[0]->playFabId, "data[0]->playFabId"); +#endif + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkAndroidDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkApple(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientLinkCustomID(TestContext& tc) +{ + static constexpr char defaultUserNewCustomId[]{ "defaultUserNewCustomId" }; + + ClientLinkCustomIDOperation::RequestType request; + request.SetCustomId(defaultUserNewCustomId); + + ClientLinkCustomIDOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + LoginWithCustomIDOperation::RequestType request; + request.SetCustomId(defaultUserNewCustomId); + return RunOperation(MakeUnique(ServiceConfig(), request, RunContext())); + }) + .Then([&](Result result)-> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // basic sanity check that link worked + tc.AssertEqual(DefaultTitlePlayerId(), result.Payload().loginResult.Model().playFabId, "playFabId"); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, result.Payload().entity.EntityKey().Model().id, "EntityKey.id"); + return S_OK; + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + // Cleanup + return ClientUnlinkCustomIDOperation::Run(DefaultTitlePlayer(), {}, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + LoginWithCustomIDOperation::RequestType request; + request.SetCustomId(defaultUserNewCustomId); + return RunOperation(MakeUnique(ServiceConfig(), request, RunContext())); + }) + .Then([&](Result result) -> Result + { + // Login should fail after unlink since we specified createAccount=false in the request + tc.AssertFailed(std::move(result), "Login Succeeded unexpectedly after UnlinkCustomID"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkFacebookAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkFacebookInstantGamesId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkGameCenterAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkGoogleAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkGooglePlayGamesServicesAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkIOSDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkKongregate(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientLinkOpenIdConnect(TestContext& tc) +{ + tc.Skip(); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientLinkSteamAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientLinkTwitch(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientLinkXboxAccount(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_GDK + constexpr char customIdToLink[]{ "CustomIdToLinkXboxAccount" }; + + auto customIdEntityToLink = MakeShared>(); + + GetTitlePlayer(customIdToLink).Then([&, customIdEntityToLink](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + customIdEntityToLink->emplace(result.ExtractPayload()); + + assert(DefaultPlatformUser()); + ClientLinkXboxAccountOperation::RequestType request{ Wrappers::XUser::Duplicate(DefaultPlatformUser()->Handle()) }; + request.SetForceLink(true); + + return ClientLinkXboxAccountOperation::Run(**customIdEntityToLink, request, RunContext()); + }) + .Then([&, customIdEntityToLink](Result result) + { + tc.RecordResult(std::move(result)); + + // Cleanup + return ClientUnlinkXboxAccountOperation::Run(**customIdEntityToLink, {}, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // This test would be doable on Win32 but would need to bring in a XAL dependency to get an Xbox token. + // For now, this will be GDK only test. + tc.Skip(); +#endif +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientRemoveContactEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientReportPlayer(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK + constexpr char customIdToReport[]{ "customIdToReport" }; + + GetPlayFabIdFromCustomId(customIdToReport).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + ClientReportPlayerOperation::RequestType request; + request.SetReporteeId(result.ExtractPayload()); + return ClientReportPlayerOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + if (result.hr == E_PF_OVER_LIMIT) + { + // This API can only be called 5 times a day. Because of this low limit, don't treat E_PF_OVERGAMEMANAGERLIMIT results + // as test failures + tc.EndTest(S_OK); + } + else + { + tc.EndTest(std::move(result)); + } + }); +#else + // GDK doesn't support GetPlayFabIdFromCustomId + tc.Skip(); +#endif +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientSendAccountRecoveryEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkAndroidDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkApple(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientUnlinkCustomID(TestContext& tc) +{ + // Covered by TestClientLinkCustomID + tc.EndTest(S_OK); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkFacebookAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkFacebookInstantGamesId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkGameCenterAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkGoogleAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkGooglePlayGamesServicesAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkIOSDeviceID(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkKongregate(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void AccountManagementTests::TestClientUnlinkOpenIdConnect(TestContext& tc) +{ + tc.Skip(); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientUnlinkSteamAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUnlinkTwitch(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH +void AccountManagementTests::TestClientUnlinkXboxAccount(TestContext& tc) +{ + // Covered by TestClientLinkXboxAccount + tc.EndTest(S_OK); +} +#endif + +void AccountManagementTests::TestClientUpdateAvatarUrl(TestContext& tc) +{ + ClientUpdateAvatarUrlOperation::RequestType request; + request.SetImageUrl("dummyUrl"); + ClientUpdateAvatarUrlOperation::Run(DefaultTitlePlayer(), request, RunContext()).Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestClientUpdateUserTitleDisplayName(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerBanUsers(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerDeletePlayer(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayerCombinedInfo(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayerProfile(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromFacebookIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromFacebookInstantGamesIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromNintendoServiceAccountIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromNintendoSwitchDeviceIds(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromPSNAccountIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromSteamIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromTwitchIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetPlayFabIDsFromXboxLiveIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetServerCustomIDsFromPlayFabIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetUserAccountInfo(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerGetUserBans(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerLinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerLinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerLinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerLinkServerCustomId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerLinkSteamId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerLinkXboxAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerRevokeAllBansForUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerRevokeBans(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerSendCustomAccountRecoveryEmail(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerSendEmailFromTemplate(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUnlinkNintendoServiceAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUnlinkNintendoSwitchDeviceId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUnlinkPSNAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUnlinkServerCustomId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUnlinkSteamId(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUnlinkXboxAccount(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUpdateAvatarUrl(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestServerUpdateBans(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void AccountManagementTests::TestGetTitlePlayersFromXboxLiveIDs(TestContext& tc) +{ + tc.Skip(); +} +#endif + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/CatalogTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/CatalogTestsImpl.cpp new file mode 100644 index 0000000..030baab --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/CatalogTestsImpl.cpp @@ -0,0 +1,638 @@ +#include "TestAppPch.h" +#include "CatalogTests.h" +#include "CatalogOperations.h" +#include "JsonUtils.h" +#include + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kPermanentItemId[]{ "PermanentItemId" }; +constexpr char kPermanentBundleId[]{ "PermanentBundleId" }; + +namespace +{ +Wrappers::PFCatalogCatalogAlternateIdWrapper AltId(String id = "testId") +{ + Wrappers::PFCatalogCatalogAlternateIdWrapper altId; + altId.SetType("FriendlyId"); + altId.SetValue(id); + + return altId; +} +} + +Wrappers::PFCatalogCatalogItemWrapper MakeItem(EntityKey creator, String id = "testId") +{ + Wrappers::PFCatalogCatalogItemWrapper item; + + ModelVector> altIds; + altIds.push_back(AltId(id)); + item.SetAlternateIds(altIds); + item.SetCreatorEntity(creator); + item.SetIsHidden(false); + item.SetStartDate(12345); + StringDictionaryEntryVector title; + title.insert_or_assign("NEUTRAL", "titleVal"); + item.SetTitle(title); + item.SetType("ugc"); + + return item; +} + +void ValidateItem(PFCatalogCatalogItem expected, PFCatalogCatalogItem actual, TestContext& tc) +{ + tc.AssertEqual(1u, actual.alternateIdsCount, "alternateIdsCount"); + tc.AssertEqual(expected.alternateIds[0]->type, actual.alternateIds[0]->type, "alternateIds[0]->type"); + tc.AssertEqual(expected.alternateIds[0]->value, actual.alternateIds[0]->value, "alternateIds[0]->value"); + tc.AssertTrue(actual.isHidden, "isHidden"); + tc.AssertEqual(*expected.isHidden, *actual.isHidden, "isHidden"); + tc.AssertTrue(actual.startDate, "startDate"); + tc.AssertEqual(*expected.startDate, *actual.startDate, "startDate"); + tc.AssertEqual(1u, actual.titleCount, "titleCount"); + tc.AssertEqual(expected.title[0].key, actual.title[0].key, "title[0].key"); + tc.AssertEqual(expected.title[0].value, actual.title[0].value, "title[0].value"); + tc.AssertEqual(expected.type, actual.type, "type"); +} + +AsyncOp CreateDraftItem(Wrappers::PFCatalogCatalogItemWrapper item, Entity entity, RunContext rc, TestContext& tc) +{ + CreateDraftItemOperation::RequestType request; + request.SetItem(item); + + return CreateDraftItemOperation::Run(entity, request, rc).Then([&, item](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + ValidateItem(item.Model(), *result.Payload().Model().item, tc); + + return Result(result.ExtractPayload().Model().item->id); + }); +} + +AsyncOp ReviewItem(Entity reviewerEntity, String itemId, RunContext rc) +{ + ReviewItemOperation::RequestType request; + request.SetAlternateId(AltId(itemId)); + request.SetEntity(reviewerEntity.EntityKey()); + Wrappers::PFCatalogReviewWrapper review; + review.SetIsInstalled(true); + review.SetItemVersion("one"); + review.SetRating(1); + review.SetReviewText("text"); + review.SetTitle("title"); + request.SetReview(review); + + return ReviewItemOperation::Run(reviewerEntity, request, rc); +} + +AsyncOp DeleteDraftItem(Result result, String itemId, Entity entity, RunContext rc, TestContext& tc) +{ + tc.RecordResult(std::move(result)); + + PublishDraftItemOperation::RequestType request; + request.SetAlternateId(AltId(itemId)); + request.SetEntity(entity.EntityKey()); + + return PublishDraftItemOperation::Run(entity, request, rc).Then([&, itemId, entity, rc](Result result) -> AsyncOp + { + DeleteItemOperation::RequestType request; + request.SetEntity(entity.EntityKey()); + request.SetAlternateId(AltId(itemId)); + + return DeleteItemOperation::Run(entity, request, rc); + }); +} + +struct CatalogTestsState +{ + String permanentItemId; + String permanentBundleId; + Wrappers::PFCatalogCatalogItemWrapper permanentItem; + Wrappers::PFCatalogCatalogItemWrapper permanentBundle; +}; + +AsyncOp CatalogTests::Initialize() +{ + auto initResult = MakeShared(); + + return ServicesTestClass::Initialize().Then([&, initResult](Result result) -> AsyncOp + { + *initResult = result.hr; + + RETURN_IF_FAILED(*initResult); + + m_state = MakeShared(); + m_state->permanentItemId = kPermanentItemId + DefaultTitlePlayerId(); + m_state->permanentBundleId = kPermanentBundleId + DefaultTitlePlayerId(); + m_state->permanentItem = MakeItem(DefaultTitlePlayer().EntityKey(), m_state->permanentItemId); + + // Create a permanent item since the catalog publishing has possibly long processing times that can and do cause intermittent test failures + CreateDraftItemOperation::RequestType request; + request.SetItem(m_state->permanentItem); + request.SetPublish(true); + + return CreateDraftItemOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, initResult](Result result) -> Result + { + // We don't care if Creating/Publishing the permanent item and bundle fails since it should already exist most times + return *initResult; + }); +} + +AsyncOp CatalogTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void CatalogTests::TestCreateDraftItem(TestContext& tc) +{ + // Already covered in TestGetDraftItem + tc.EndTest(S_OK); +} + + +void CatalogTests::TestCreateUploadUrls(TestContext& tc) +{ + constexpr char kTestName[]{ "testName" }; + + CreateUploadUrlsOperation::RequestType request; + ModelVector> files; + Wrappers::PFCatalogUploadInfoWrapper file; + file.SetFileName(kTestName); + files.push_back(file); + request.SetFiles(files); + + CreateUploadUrlsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&, kTestName](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.uploadUrlsCount, "uploadUrlsCount"); + tc.AssertEqual(kTestName, model.uploadUrls[0]->fileName, "uploadUrls[0]->fileName"); + tc.AssertTrue(model.uploadUrls[0]->id, "uploadUrls[0]->id"); + tc.AssertTrue(model.uploadUrls[0]->url, "uploadUrls[0]->url"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void CatalogTests::TestDeleteEntityItemReviews(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestDeleteItem(TestContext& tc) +{ + // Already covered in TestGetDraftItem + tc.EndTest(S_OK); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void CatalogTests::TestGetCatalogConfig(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestGetDraftItem(TestContext& tc) +{ + GetDraftItemOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetAlternateId(AltId(m_state->permanentItemId)); + + return GetDraftItemOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + ValidateItem(m_state->permanentItem.Model(), *result.Payload().Model().item, tc); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestGetDraftItems(TestContext& tc) +{ + GetDraftItemsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + ModelVector> altIds; + altIds.push_back(AltId(m_state->permanentItemId)); + request.SetAlternateIds(altIds); + + return GetDraftItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.itemsCount, "itemsCount"); + ValidateItem(m_state->permanentItem.Model(), *model.items[0], tc); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestGetEntityDraftItems(TestContext& tc) +{ + GetEntityDraftItemsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetCount(1); + + return GetEntityDraftItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.itemsCount, "itemsCount"); + ValidateItem(m_state->permanentItem.Model(), *model.items[0], tc); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestGetEntityItemReview(TestContext& tc) +{ + auto reviewerEntity = MakeShared>(); + + GetTitlePlayer("ReviewerEntity").Then([&, reviewerEntity](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + *reviewerEntity = result.ExtractPayload(); + + return ReviewItem(reviewerEntity->value(), m_state->permanentItemId, RunContext()); + }) + .Then([&, reviewerEntity](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + GetEntityItemReviewOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetEntity(reviewerEntity->value().EntityKey()); + + return GetEntityItemReviewOperation::Run(reviewerEntity->value(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertTrue(result.Payload().Model().review, "review"); + tc.AssertEqual(1, result.Payload().Model().review->rating, "review->rating"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestGetItem(TestContext& tc) +{ + GetItemOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + GetItemOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + ValidateItem(m_state->permanentItem.Model(), *result.Payload().Model().item, tc); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestGetItemContainers(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + // Skipping until service paging bug is fixed + tc.Skip(); + /*auto permanentBundle = MakeShared>(MakeItem(TitleEntity().EntityKey(), m_state->permanentBundleId)); + + GetItemOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetEntity(TitleEntity().EntityKey()); + + GetItemOperation::Run(TitleEntity(), request, RunContext()).Then([&, permanentBundle](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Create a bundle that will not be deleted + CreateDraftItemOperation::RequestType request; + ModelVector> refs; + Wrappers::PFCatalogCatalogItemReferenceWrapper ref; + ref.SetId(result.Payload().Model().item->id); + refs.push_back(ref); + permanentBundle->SetItemReferences(refs); + permanentBundle->SetType("bundle"); + request.SetItem(*permanentBundle); + + return CreateDraftItemOperation::Run(TitleEntity(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + // Doesn't matter if the previous step failed + PublishDraftItemOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentBundleId)); + request.SetEntity(TitleEntity().EntityKey()); + + return PublishDraftItemOperation::Run(TitleEntity(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + // Doesn't matter if the previous step failed + GetItemContainersOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + return GetItemContainersOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, permanentBundle](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.containersCount, "containersCount"); + ValidateItem(permanentBundle->Model(), *model.containers[0], tc); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + });*/ +#else + // Test code above uses TitleEntity so skipping on GDK + tc.Skip(); +#endif +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void CatalogTests::TestGetItemModerationState(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestGetItemPublishStatus(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_WIN32 + GetItemPublishStatusOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetEntity(TitleEntity().EntityKey()); + + GetItemPublishStatusOperation::Run(TitleEntity(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(PFCatalogPublishResult::Succeeded, *result.Payload().Model().result, "result"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // Unsupported (requires Title Entity) + tc.Skip(); +#endif +} + +void CatalogTests::TestGetItemReviews(TestContext& tc) +{ + // Already covered in TestReportItemReview + tc.EndTest(S_OK); +} + +void CatalogTests::TestGetItemReviewSummary(TestContext& tc) +{ + GetTitlePlayer("ReviewerEntity").Then([&](Result result) -> AsyncOp + { + return ReviewItem(result.Payload(), m_state->permanentItemId, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + GetItemReviewSummaryOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + + return GetItemReviewSummaryOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(1, result.Payload().Model().reviewsCount, "reviewsCount"); + tc.AssertEqual(1, *result.Payload().Model().rating->count1Star, "rating->count1Star"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestGetItems(TestContext& tc) +{ + GetItemsOperation::RequestType request; + ModelVector> altIds; + altIds.push_back(AltId(m_state->permanentItemId)); + request.SetAlternateIds(altIds); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + GetItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.itemsCount, "itemsCount"); + ValidateItem(m_state->permanentItem.Model(), *model.items[0], tc); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestPublishDraftItem(TestContext& tc) +{ + // Already covered in TestGetDraftItem + tc.EndTest(S_OK); +} + +void CatalogTests::TestReportItem(TestContext& tc) +{ + ReportItemOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetConcernCategory(PFCatalogConcernCategory::Profanity); + + ReportItemOperation::Run(DefaultTitlePlayer(), request, RunContext()).Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestReportItemReview(TestContext& tc) +{ + GetTitlePlayer("ReviewerEntity").Then([&](Result result) -> AsyncOp + { + return ReviewItem(result.Payload(), m_state->permanentItemId, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + GetItemReviewsOperation::RequestType request; + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetCount(1); + + return GetItemReviewsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.reviewsCount, "reviewsCount"); + tc.AssertEqual(1, model.reviews[0]->rating, "reviews[0]->rating"); + + ReportItemReviewOperation::RequestType request; + request.SetReviewId(model.reviews[0]->reviewId); + request.SetAlternateId(AltId(m_state->permanentItemId)); + request.SetConcernCategory(PFCatalogConcernCategory::Profanity); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + return ReportItemReviewOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void CatalogTests::TestReviewItem(TestContext& tc) +{ + // Already covered in TestReportItemReview + tc.EndTest(S_OK); +} + +void CatalogTests::TestSearchItems(TestContext& tc) +{ + SearchItemsOperation::RequestType request; + request.SetCount(10); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetSelect("startDate"); + request.SetFilter("alternateIds/any(id: id/value eq '" + m_state->permanentItemId + "')"); + + SearchItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.itemsCount, "itemsCount"); + ValidateItem(m_state->permanentItem.Model(), *model.items[0], tc); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void CatalogTests::TestSetItemModerationState(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestSubmitItemReviewVote(TestContext& tc) +{ + // Already covered in TestGetItemReviewSummary + tc.EndTest(S_OK); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void CatalogTests::TestTakedownItemReviews(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void CatalogTests::TestUpdateCatalogConfig(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void CatalogTests::TestUpdateDraftItem(TestContext& tc) +{ + String itemId{ "updateDraftItemId" + DefaultTitlePlayerId() }; + auto item = MakeShared>(MakeItem(DefaultTitlePlayer().EntityKey(), itemId)); + CreateDraftItem(*item, DefaultTitlePlayer(), RunContext(), tc).Then([&, item](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + item->SetId(result.Payload()); + item->SetStartDate(time(nullptr)); + + UpdateDraftItemOperation::RequestType request; + request.SetItem(*item); + + return UpdateDraftItemOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, item](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + ValidateItem(item->Model(), *result.Payload().Model().item, tc); + + return S_OK; + }) + .Then([&, itemId](Result result) -> AsyncOp + { + // Cleanup + return DeleteDraftItem(result, itemId, DefaultTitlePlayer(), RunContext(), tc); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/CharacterTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/CharacterTestsImpl.cpp new file mode 100644 index 0000000..bc6c584 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/CharacterTestsImpl.cpp @@ -0,0 +1,120 @@ +#include "TestAppPch.h" +#include "CharacterTests.h" +#include "CharacterOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp CharacterTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp CharacterTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestClientGetAllUsersCharacters(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestClientGetCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestClientGetCharacterReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestClientGrantCharacterToUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestClientUpdateCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerDeleteCharacterFromUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerGetAllUsersCharacters(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerGetCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerGetCharacterInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerGetCharacterReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerGrantCharacterToUser(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerUpdateCharacterData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerUpdateCharacterInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void CharacterTests::TestServerUpdateCharacterReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/CloudScriptTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/CloudScriptTestsImpl.cpp new file mode 100644 index 0000000..7bb6aab --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/CloudScriptTestsImpl.cpp @@ -0,0 +1,41 @@ +#include "TestAppPch.h" +#include "CloudScriptTests.h" +#include "CloudScriptOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp CloudScriptTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp CloudScriptTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void CloudScriptTests::TestExecuteFunction(TestContext& tc) +{ + // Requires manual setup in Azure Portal and PlayFab Game Manager + ExecuteFunctionOperation::RequestType request; + request.SetFunctionName("CloudScriptTestFunction"); + + ExecuteFunctionOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual("CloudScriptTestFunction", result.Payload().Model().functionName, "functionName"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/DataTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/DataTestsImpl.cpp new file mode 100644 index 0000000..e514abd --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/DataTestsImpl.cpp @@ -0,0 +1,254 @@ +#include "TestAppPch.h" +#include "DataTests.h" +#include "DataOperations.h" +#include +#include + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kTestName[]{ "testName" }; +constexpr char kTestKey[]{ "testKey" }; +constexpr char kTestVal[]{ "testVal" }; +const PFJsonObject kObject{ "{ \"testKey\": \"testValue\" }" }; + + +HRESULT UploadFileSync(String url) +{ + JsonValue requestBody{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(requestBody, kTestKey, kTestVal); + + PFHCCallHandle callHandle{ nullptr }; + + // Set up HCHttpCallHandle + RETURN_IF_FAILED(PFHCHttpCallCreate(&callHandle)); + RETURN_IF_FAILED(PFHCHttpCallRequestSetUrl(callHandle, "PUT", url.c_str())); + + RETURN_IF_FAILED(PFHCHttpCallRequestSetHeader(callHandle, "Content-Type", "application/json; charset=utf-8", true)); + + RETURN_IF_FAILED(PFHCHttpCallRequestSetRequestBodyString(callHandle, PlayFab::JsonUtils::WriteToString(requestBody).c_str())); + + XAsyncBlock asyncBlock{}; + RETURN_IF_FAILED(PFHCHttpCallPerformAsync(callHandle, &asyncBlock)); + + RETURN_IF_FAILED(PFHCHttpCallCloseHandle(callHandle)); + + return XAsyncGetStatus(&asyncBlock, true); +} + +AsyncOp DataTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp DataTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void DataTests::TestAbortFileUploads(TestContext& tc) +{ + InitiateFileUploadsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetFileNames({ kTestName }); + + InitiateFileUploadsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, result.Payload().Model().entity->id, "entity->id"); + tc.AssertEqual(1u, result.Payload().Model().uploadDetailsCount, "uploadDetailsCount"); + tc.AssertEqual(kTestName, result.Payload().Model().uploadDetails[0]->fileName, "uploadDetails[0]->fileName"); + + return S_OK; + }) + .Then([&](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + AbortFileUploadsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetFileNames({ kTestName }); + + return AbortFileUploadsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, result.Payload().Model().entity->id, "entity->id"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void DataTests::TestDeleteFiles(TestContext& tc) +{ + // Already covered in TestGetFiles + tc.EndTest(S_OK); +} + +void DataTests::TestFinalizeFileUploads(TestContext& tc) +{ + // Already covered in TestGetFiles + tc.EndTest(S_OK); +} + +void DataTests::TestGetFiles(TestContext& tc) +{ + InitiateFileUploadsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetFileNames({ kTestName }); + + InitiateFileUploadsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.entity->id, "entity->id"); + tc.AssertEqual(1u, model.uploadDetailsCount, "uploadDetailsCount"); + tc.AssertEqual(kTestName, model.uploadDetails[0]->fileName, "uploadDetails[0]->fileName"); + tc.AssertTrue(model.uploadDetails[0]->uploadUrl, "uploadDetails[0]->uploadUrl"); + + return UploadFileSync(model.uploadDetails[0]->uploadUrl); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + FinalizeFileUploadsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetFileNames({ kTestName }); + + return FinalizeFileUploadsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.entity->id, "entity->id"); + tc.AssertEqual(1u, model.metadataCount, "metadataCount"); + + GetFilesOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + return GetFilesOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.entity->id, "entity->id"); + tc.AssertEqual(1u, model.metadataCount, "metadataCount"); + + return S_OK; + }) + .Then([&](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup: delete files + DeleteFilesOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetFileNames({ kTestName }); + + return DeleteFilesOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, result.Payload().Model().entity->id, "entity->id"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void DataTests::TestGetObjects(TestContext& tc) +{ + // Already covered in TestSetObjects + tc.EndTest(S_OK); +} + +void DataTests::TestInitiateFileUploads(TestContext& tc) +{ + // Already covered in TestGetFiles + tc.EndTest(S_OK); +} + +void DataTests::TestSetObjects(TestContext& tc) +{ + SetObjectsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + ModelVector> objects; + PFDataSetObject obj{}; + obj.dataObject = kObject; + obj.objectName = kTestName; + objects.push_back(obj); + request.SetObjects(objects); + + SetObjectsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + GetObjectsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + return GetObjectsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.entity->id, "entity->id"); + tc.AssertEqual(1u, model.objectsCount, "objectsCount"); + tc.AssertEqual(kTestName, model.objects[0].value->objectName, "objects[0].value->objectName"); + + JsonDocument expected; + expected.Parse(kObject.stringValue); + JsonDocument actual; + actual.Parse(model.objects[0].value->dataObject.stringValue); + tc.AssertTrue(actual.HasMember(kTestKey), "objects[0].value->dataObject.stringValue.key"); + tc.AssertEqual(expected[kTestKey].GetString(), actual[kTestKey].GetString(), "objects[0].value->dataObject.stringValue.key"); + + return S_OK; + }) + .Then([&](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup: remove object + SetObjectsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + ModelVector> objects; + bool deleteObject = true; + PFDataSetObject obj{}; + obj.deleteObject = &deleteObject; + obj.objectName = kTestName; + objects.push_back(obj); + request.SetObjects(objects); + + return SetObjectsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/ExperimentationTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/ExperimentationTestsImpl.cpp new file mode 100644 index 0000000..b46c556 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/ExperimentationTestsImpl.cpp @@ -0,0 +1,42 @@ +#include "TestAppPch.h" +#include "ExperimentationTests.h" +#include "ExperimentationOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp ExperimentationTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp ExperimentationTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void ExperimentationTests::TestGetTreatmentAssignment(TestContext& tc) +{ + GetTreatmentAssignmentOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + GetTreatmentAssignmentOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertTrue(model.treatmentAssignment, "treatmentAssignment"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/FriendsTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/FriendsTestsImpl.cpp new file mode 100644 index 0000000..b11eb77 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/FriendsTestsImpl.cpp @@ -0,0 +1,174 @@ +#include "TestAppPch.h" +#include "FriendsTests.h" +#include "FriendsOperations.h" +#if HC_PLATFORM == HC_PLATFORM_GDK +#include "GDK/PlatformUser_GDK.h" +#endif + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kFriendCustomId[]{ "FriendCustomId" }; + +AsyncOp FriendsTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp FriendsTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void FriendsTests::TestClientAddFriend(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + // Already covered by TestClientSetFriendTags + tc.EndTest(S_OK); +#else + // This test uses GetPlayFabIdFromCustomId which is not supported on GDK + tc.Skip(); +#endif +} + +void FriendsTests::TestClientGetFriendsList(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + SharedPtr friendId = MakeShared(); + + ServicesTestClass::GetPlayFabIdFromCustomId(kFriendCustomId).Then([&, friendId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + *friendId = result.ExtractPayload(); + ClientAddFriendOperation::RequestType request; + request.SetFriendPlayFabId(*friendId); + + return ClientAddFriendOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(true, result.Payload().Model().created, "created"); + + return ClientGetFriendsListOperation::Run(DefaultTitlePlayer(), ClientGetFriendsListOperation::RequestType{}, RunContext()); + }) + .Then([&, friendId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.friendsCount, "friendsCount"); + tc.AssertEqual(*friendId, model.friends[0]->friendPlayFabId, "friendPlayFabId"); + + return S_OK; + }) + .Then([&, friendId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + ClientRemoveFriendOperation::RequestType request; + request.SetFriendPlayFabId(*friendId); + + return ClientRemoveFriendOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + ClientGetFriendsListOperation::RequestType request{ Wrappers::XUser::Duplicate(DefaultPlatformUser()->Handle()) }; + + return ClientGetFriendsListOperation::Run(DefaultTitlePlayer(), request, RunContext()) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#endif +} + +void FriendsTests::TestClientRemoveFriend(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + // Already covered by TestClientSetFriendTags + tc.EndTest(S_OK); +#else + // This test uses GetPlayFabIdFromCustomId which is not supported on GDK + tc.Skip(); +#endif +} + +void FriendsTests::TestClientSetFriendTags(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + SharedPtr friendId = MakeShared(); + + ServicesTestClass::GetPlayFabIdFromCustomId(kFriendCustomId).Then([&, friendId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + *friendId = result.ExtractPayload(); + ClientAddFriendOperation::RequestType request; + request.SetFriendPlayFabId(*friendId); + return ClientAddFriendOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, friendId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + ClientSetFriendTagsOperation::RequestType request; + request.SetFriendPlayFabId(*friendId); + request.SetTags({ "tag1", "tag2" }); + return ClientSetFriendTagsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, friendId](Result result) + { + tc.RecordResult(std::move(result)); + // Cleanup + ClientRemoveFriendOperation::RequestType request; + request.SetFriendPlayFabId(*friendId); + return ClientRemoveFriendOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // This test uses GetPlayFabIdFromCustomId which is not supported on GDK + tc.Skip(); +#endif +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void FriendsTests::TestServerAddFriend(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void FriendsTests::TestServerGetFriendsList(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void FriendsTests::TestServerRemoveFriend(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void FriendsTests::TestServerSetFriendTags(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/GroupsTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/GroupsTestsImpl.cpp new file mode 100644 index 0000000..107703a --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/GroupsTestsImpl.cpp @@ -0,0 +1,577 @@ +#include "TestAppPch.h" +#include "GroupsTests.h" +#include "GroupsOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +constexpr char joinerCustomId[]{ "GroupJoinerCustomId" }; + +struct GroupsTestsState +{ + String groupName; + EntityKey group; + std::optional groupJoiner; + + // Helper to remove groupJoiner from the group + AsyncOp RemoveMember(Entity const& entity, RunContext rc) + { + RemoveMembersOperation::RequestType request; + request.SetGroup(group); + ModelVector members; + members.push_back(groupJoiner->EntityKey()); + request.SetMembers(std::move(members)); + return RemoveMembersOperation::Run(entity, std::move(request), rc); + } +}; + +AsyncOp GroupsTests::Initialize() +{ + m_state = MakeShared(); + + // Use a unique group name each run + Stringstream groupName; + groupName << "TestGroup" << time(nullptr); + m_state->groupName = groupName.str(); + + return ServicesTestClass::Initialize().Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + CreateGroupOperation::RequestType request; + request.SetGroupName(m_state->groupName); + return CreateGroupOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + m_state->group = *result.Payload().Model().group; + return GetTitlePlayer(joinerCustomId); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + m_state->groupJoiner.emplace(result.ExtractPayload()); + return S_OK; + }); +} + +AsyncOp GroupsTests::Uninitialize() +{ + DeleteGroupOperation::RequestType request; + request.SetGroup(m_state->group); + return DeleteGroupOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) + { + UNREFERENCED_PARAMETER(result);// Continue with uninitialize regardless of success deleting group + m_state.reset(); + return ServicesTestClass::Uninitialize(); + }); +} + +void GroupsTests::TestAcceptGroupApplication(TestContext& tc) +{ + ApplyToGroupOperation::RequestType request; + request.SetGroup(m_state->group); + ApplyToGroupOperation::Run(*m_state->groupJoiner, request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + AcceptGroupApplicationOperation::RequestType request; + request.SetEntity(*model.entity->key); + request.SetGroup(*model.group); + return AcceptGroupApplicationOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + // Remove member regardless of success + return m_state->RemoveMember(DefaultTitlePlayer(), RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestAcceptGroupInvitation(TestContext& tc) +{ + InviteToGroupOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetEntity(m_state->groupJoiner->EntityKey()); + InviteToGroupOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + ListGroupInvitationsOperation::RequestType request; + request.SetGroup(m_state->group); + return ListGroupInvitationsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) ->AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.invitationsCount, "invitationsCount"); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.invitations[0]->invitedByEntity->key->id, "invitations[0]->invitedByEntity->key->id"); + tc.AssertEqual(m_state->groupJoiner->EntityKey().Model().id, model.invitations[0]->invitedEntity->key->id, "invitations[0]->invitedEntity->key->id"); + + AcceptGroupInvitationOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetEntity(m_state->groupJoiner->EntityKey()); + return AcceptGroupInvitationOperation::Run(*m_state->groupJoiner, request, RunContext()); + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + // Remove member regardless of success + return m_state->RemoveMember(DefaultTitlePlayer(), RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestAddMembers(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_WIN32 + AddMembersOperation::RequestType request; + request.SetGroup(m_state->group); + ModelVector members; + members.push_back(m_state->groupJoiner->EntityKey()); + request.SetMembers(std::move(members)); + + AddMembersOperation::Run(TitleEntity(), request, RunContext()).Then([&](Result result) + { + tc.RecordResult(std::move(result)); + // Remove member regardless of success + return m_state->RemoveMember(DefaultTitlePlayer(), RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // Unsupported (Title Entity required) + tc.Skip(); +#endif +} + +void GroupsTests::TestApplyToGroup(TestContext& tc) +{ + // Covered by GroupsTests::TestAcceptGroupApplication + tc.EndTest(S_OK); +} + +void GroupsTests::TestBlockEntity(TestContext& tc) +{ + // Covered by GroupsTests::TestListGroupBlocks + tc.EndTest(S_OK); +} + +constexpr char testRoleId[]{ "testRole" }; +constexpr char testRoleName[]{ "Test Role" }; + +void GroupsTests::TestChangeMemberRole(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_WIN32 + CreateRoleOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetRoleId(testRoleId); + request.SetRoleName(testRoleName); + + CreateRoleOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(testRoleId, result.Payload().Model().roleId, "roleId"); + tc.AssertEqual(testRoleName, result.Payload().Model().roleName, "roleName"); + + AddMembersOperation::RequestType request; + request.SetGroup(m_state->group); + ModelVector members; + members.push_back(m_state->groupJoiner->EntityKey()); + request.SetMembers(std::move(members)); + return AddMembersOperation::Run(TitleEntity(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + ChangeMemberRoleOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetOriginRoleId("members"); + request.SetDestinationRoleId(testRoleId); + ModelVector members; + members.push_back(m_state->groupJoiner->EntityKey()); + request.SetMembers(std::move(members)); + + return ChangeMemberRoleOperation::Run(DefaultTitlePlayer(), std::move(request), RunContext()); + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + // Cleanup + RemoveMembersOperation::RequestType request; + request.SetGroup(m_state->group); + ModelVector members; + members.push_back(m_state->groupJoiner->EntityKey()); + request.SetMembers(std::move(members)); + return RemoveMembersOperation::Run(TitleEntity(), request, RunContext()); + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + // Cleanup + DeleteRoleOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetRoleId(testRoleId); + return DeleteRoleOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // Unsupported (Title Entity required) + tc.Skip(); +#endif +} + +void GroupsTests::TestCreateGroup(TestContext& tc) +{ + // Covered by GroupsTests::Initialize + tc.EndTest(S_OK); +} + +void GroupsTests::TestCreateRole(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_WIN32 + // Covered by GroupsTests::TestChangeMemberRole + tc.EndTest(S_OK); +#else + // Unsupported (Title Entity required) + tc.Skip(); +#endif +} + +void GroupsTests::TestDeleteGroup(TestContext& tc) +{ + // Covered by GroupsTests::Uninitialize + tc.EndTest(S_OK); +} + +void GroupsTests::TestDeleteRole(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_WIN32 + // Covered by GroupsTests::TestChangeMemberRole + tc.EndTest(S_OK); +#else + // Unsupported (Title Entity required) + tc.Skip(); +#endif +} + +void GroupsTests::TestGetGroup(TestContext& tc) +{ + GetGroupOperation::RequestType request; + request.SetGroupName(m_state->groupName); + GetGroupOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(m_state->group.Model().id, result.Payload().Model().group->id, "group.id"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestInviteToGroup(TestContext& tc) +{ + // Covered by GroupsTests::TestAcceptGroupInvitation + tc.EndTest(S_OK); +} + +void GroupsTests::TestIsMember(TestContext& tc) +{ + IsMemberOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + IsMemberOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(true, result.Payload().Model().isMember, "isMember"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestListGroupApplications(TestContext& tc) +{ + ApplyToGroupOperation::RequestType request; + request.SetGroup(m_state->group); + ApplyToGroupOperation::Run(*m_state->groupJoiner, request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + ListGroupApplicationsOperation::RequestType request; + request.SetGroup(m_state->group); + return ListGroupApplicationsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.applicationsCount, "applicationsCount"); + tc.AssertEqual(m_state->groupJoiner->EntityKey().Model().id, model.applications[0]->entity->key->id, "applications[0]->entity->key->id"); + return S_OK; + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + + // Cleanup + RemoveGroupApplicationOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetEntity(m_state->groupJoiner->EntityKey()); + return RemoveGroupApplicationOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestListGroupBlocks(TestContext& tc) +{ + BlockEntityOperation::RequestType request; + request.SetEntity(m_state->groupJoiner->EntityKey()); + request.SetGroup(m_state->group); + + BlockEntityOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + ListGroupBlocksOperation::RequestType request; + request.SetGroup(m_state->group); + return ListGroupBlocksOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.blockedEntitiesCount, "blockedEntitiesCount"); + tc.AssertEqual(m_state->groupJoiner->EntityKey().Model().id, model.blockedEntities[0]->entity->key->id, "model.blockedEntities[0]->entity->key->id"); + return S_OK; + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + // Cleanup step + UnblockEntityOperation::RequestType request; + request.SetEntity(m_state->groupJoiner->EntityKey()); + request.SetGroup(m_state->group); + return UnblockEntityOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestListGroupInvitations(TestContext& tc) +{ + // Covered by GroupsTests::TestAcceptGroupInvitation + tc.EndTest(S_OK); +} + +void GroupsTests::TestListGroupMembers(TestContext& tc) +{ + ListGroupMembersOperation::RequestType request; + request.SetGroup(m_state->group); + ListGroupMembersOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + uint32_t totalMembers{ 0 }; + for (auto i = 0u; i < model.membersCount; ++i) + { + totalMembers += model.members[i]->membersCount; + } + tc.AssertEqual(1u, totalMembers, "totalMembers"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestListMembership(TestContext& tc) +{ + ListMembershipOperation::Run(DefaultTitlePlayer(), {}, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertTrue(model.groupsCount >= 1, "No group memberships found"); + + bool groupFound = false; + for (size_t i = 0; i < model.groupsCount; ++i) + { + if (m_state->groupName == model.groups[i]->groupName) + { + groupFound = true; + break; + } + } + tc.AssertTrue(groupFound, "Expected group not found"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestListMembershipOpportunities(TestContext& tc) +{ + InviteToGroupOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetEntity(m_state->groupJoiner->EntityKey()); + + InviteToGroupOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + return ListMembershipOpportunitiesOperation::Run(*m_state->groupJoiner, {}, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + for (size_t i = 0; i < model.invitationsCount; ++i) + { + if (!std::strcmp(m_state->group.Model().id, model.invitations[i]->group->id)) + { + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.invitations[i]->invitedByEntity->key->id, "model.invitations[0]->invitedByEntity->key->id"); + return S_OK; + } + } + return E_FAIL; // invite not found + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + // Cleanup + RemoveGroupInvitationOperation::RequestType request; + request.SetEntity(m_state->groupJoiner->EntityKey()); + request.SetGroup(m_state->group); + return RemoveGroupInvitationOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestRemoveGroupApplication(TestContext& tc) +{ + // Covered by GroupsTests::TestListGroupApplications + tc.EndTest(S_OK); +} + +void GroupsTests::TestRemoveGroupInvitation(TestContext& tc) +{ + // Covered by GroupsTests::TestListMembershipOpportunities + tc.EndTest(S_OK); +} + +void GroupsTests::TestRemoveMembers(TestContext& tc) +{ + // Covered by GroupsTests::TestAcceptGroupInvitation + tc.EndTest(S_OK); +} + +void GroupsTests::TestUnblockEntity(TestContext& tc) +{ + // Covered by GroupsTests::TestListGroupBlocks + tc.EndTest(S_OK); +} + +void GroupsTests::TestUpdateGroup(TestContext& tc) +{ + constexpr char newGroupName[]{ "newGroupName" }; + + UpdateGroupOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetGroupName(newGroupName); + UpdateGroupOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertEqual(PFOperationTypes::Updated, *model.setResult, "setResult"); + return S_OK; + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + + // Cleanup + UpdateGroupOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetGroupName(m_state->groupName); + return UpdateGroupOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(PFOperationTypes::Updated, *result.Payload().Model().setResult, "setResult"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void GroupsTests::TestUpdateRole(TestContext& tc) +{ + CreateRoleOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetRoleId(testRoleId); + request.SetRoleName(testRoleName); + + CreateRoleOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + UpdateRoleOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetRoleName("updatedRoleName"); + request.SetRoleId(testRoleId); + return UpdateRoleOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertEqual(PFOperationTypes::Updated, *model.setResult, "setResult"); + return S_OK; + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + + // Cleanup + DeleteRoleOperation::RequestType request; + request.SetGroup(m_state->group); + request.SetRoleId(testRoleId); + return DeleteRoleOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/InventoryTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/InventoryTestsImpl.cpp new file mode 100644 index 0000000..226df0c --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/InventoryTestsImpl.cpp @@ -0,0 +1,677 @@ +#include "TestAppPch.h" +#include "InventoryTests.h" +#include "InventoryOperations.h" +#include "CatalogOperations.h" +#if HC_PLATFORM == HC_PLATFORM_GDK +#include "GDK/PlatformUser_GDK.h" +#endif + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kFriendlyId[]{ "FriendlyId" }; +constexpr char kPermanentCurrencyId[]{ "PermanentInventoryCurrencyId" }; +constexpr char kPermanentItemId[]{ "PermanentInventoryItemId" }; +constexpr char kPermanentItemType[]{ "catalogItem" }; +constexpr int kCurrencyAmount{ 1234 }; + +Wrappers::PFCatalogCatalogAlternateIdWrapper AltCatalogId(String id) +{ + Wrappers::PFCatalogCatalogAlternateIdWrapper altId; + altId.SetType("FriendlyId"); + altId.SetValue(id); + + return altId; +} + +namespace +{ +Wrappers::PFInventoryAlternateIdWrapper AltId(String id) +{ + Wrappers::PFInventoryAlternateIdWrapper altId; + altId.SetType("FriendlyId"); + altId.SetValue(id); + + return altId; +} +} + +AsyncOp AddInventoryItem(Entity entity, String collectionId, RunContext rc, TestContext& tc) +{ + AddInventoryItemsOperation::RequestType request; + request.SetAmount(1); + request.SetCollectionId(collectionId); + request.SetEntity(entity.EntityKey()); + Wrappers::PFInventoryInventoryItemReferenceWrapper item; + item.SetAlternateId(AltId(kPermanentItemId)); + request.SetItem(item); + + return AddInventoryItemsOperation::Run(entity, request, rc).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Add transaction (and possible CollectionCreated transaction if this is the first run on a title) + auto count = result.Payload().Model().transactionIdsCount; + tc.AssertTrue(2u == count || 1u == count, "transactionIdsCount"); + + return S_OK; + }); +} + +AsyncOp DeleteCollection(Entity titleEntity, EntityKey player, String collectionId, RunContext rc) +{ + DeleteInventoryCollectionOperation::RequestType request; + request.SetCollectionId(collectionId); + request.SetEntity(player); + + return DeleteInventoryCollectionOperation::Run(titleEntity, request, rc); +} + +AsyncOp DeleteItem(Entity player, String collectionId, TestContext& tc, RunContext rc, uint32_t transactionCount = 2) +{ + DeleteInventoryItemsOperation::RequestType request; + request.SetCollectionId(collectionId); + request.SetEntity(player.EntityKey()); + Wrappers::PFInventoryInventoryItemReferenceWrapper item; + Wrappers::PFInventoryAlternateIdWrapper altId; + item.SetAlternateId(AltId(kPermanentItemId)); + request.SetItem(item); + + return DeleteInventoryItemsOperation::Run(player, request, rc).Then([&, transactionCount](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Delete transaction (and possible Subtract transaction) + tc.AssertEqual(transactionCount, result.Payload().Model().transactionIdsCount, "transactionIdsCount"); + + return S_OK; + }); +} + +struct InventoryTestsState +{ + Wrappers::PFCatalogCatalogItemWrapper permanentItem; + Wrappers::PFCatalogCatalogItemWrapper permanentCurrency; + String currencyId; +}; + +// GDK runs for these tests depend on at least one Win32 run on the title for this currency/item setup via TitleEntity auth +AsyncOp InventoryTests::Initialize() +{ + auto initResult = MakeShared(); + + return ServicesTestClass::Initialize() + .Then([&, initResult](Result result) -> Result + { + *initResult = result.hr; + + RETURN_IF_FAILED(*initResult); + + Wrappers::PFCatalogCatalogItemWrapper currency; + + ModelVector> altCurrencyIds; + altCurrencyIds.push_back(AltCatalogId(kPermanentCurrencyId)); + currency.SetAlternateIds(altCurrencyIds); + EntityKey titleKey; + titleKey.SetId(m_testTitleData.titleId); + titleKey.SetType("title"); + currency.SetCreatorEntity(titleKey); + currency.SetIsHidden(false); + currency.SetStartDate(12345); + StringDictionaryEntryVector title; + title.insert_or_assign("NEUTRAL", "titleVal"); + currency.SetTitle(title); + currency.SetType("currency"); + + m_state = MakeShared(); + m_state->permanentCurrency = currency; + + return *initResult; + }) +#if HC_PLATFORM == HC_PLATFORM_WIN32 + .Then([&, initResult](Result result) -> AsyncOp + { + *initResult = result.hr; + + RETURN_IF_FAILED(*initResult); + + // Create a permanent currency since the catalog publishing has possibly long processing times that can and do cause intermittent test failures + CreateDraftItemOperation::RequestType request; + request.SetItem(m_state->permanentCurrency); + request.SetPublish(true); + + return CreateDraftItemOperation::Run(TitleEntity(), request, RunContext()); + }) + .Then([&](Result) -> AsyncOp + { + GetItemOperation::RequestType request; + request.SetAlternateId(AltCatalogId(kPermanentCurrencyId)); + request.SetEntity(TitleEntity().EntityKey()); + + return GetItemOperation::Run(TitleEntity(), request, RunContext()); + }) +#else + .Then([&](Result) -> AsyncOp + { + GetItemOperation::RequestType request; + request.SetAlternateId(AltCatalogId(kPermanentCurrencyId)); + EntityKey titleKey; + titleKey.SetId(m_testTitleData.titleId); + titleKey.SetType("title"); + request.SetEntity(titleKey); + + return GetItemOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) +#endif + .Then([&](Result result) -> Result + { + // Don't just fail because all non-purchase tests can still run + if (Succeeded(result)) + { + m_state->currencyId = result.ExtractPayload().Model().item->id; + } + else + { + m_state->currencyId = "couldNotGetCurrency"; + } + + Wrappers::PFCatalogCatalogItemWrapper item; + + ModelVector> altItemIds; + altItemIds.push_back(AltCatalogId(kPermanentItemId)); + item.SetAlternateIds(altItemIds); + EntityKey titleKey; + titleKey.SetId(m_testTitleData.titleId); + titleKey.SetType("title"); + item.SetCreatorEntity(titleKey); + item.SetIsHidden(false); + Wrappers::PFCatalogCatalogPriceOptionsWrapper priceOptions; + ModelVector> prices; + Wrappers::PFCatalogCatalogPriceWrapper price; + ModelVector> amounts; + Wrappers::PFCatalogCatalogPriceAmountWrapper amount; + amount.SetItemId(m_state->currencyId); + amount.SetAmount(kCurrencyAmount); + amounts.push_back(amount); + price.SetAmounts(amounts); + prices.push_back(price); + priceOptions.SetPrices(prices); + item.SetPriceOptions(priceOptions); + item.SetStartDate(12345); + StringDictionaryEntryVector title; + title.insert_or_assign("NEUTRAL", "titleVal"); + item.SetTitle(title); + item.SetType(kPermanentItemType); + + m_state->permanentItem = item; + + return S_OK; + }) +#if HC_PLATFORM == HC_PLATFORM_WIN32 + .Then([&](Result) -> AsyncOp + { + // Create a permanent buyable item since the catalog publishing has possibly long processing times that can and do cause intermittent test failures + CreateDraftItemOperation::RequestType request; + request.SetItem(m_state->permanentItem); + request.SetPublish(true); + + return CreateDraftItemOperation::Run(TitleEntity(), request, RunContext()); + }) + .Then([&, initResult](Result) -> Result + { + // We don't care if Creating/Publishing the permanent currency and item fails since it should already exist most times + return *initResult; + }); +#else + .Then([&, initResult](Result) -> Result + { + // We don't care if Creating/Publishing the permanent currency and item fails since it should already exist most times + return *initResult; + }); +#endif +} + +AsyncOp InventoryTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void InventoryTests::TestAddInventoryItems(TestContext& tc) +{ + // Already covered in TestGetInventoryCollectionIds + tc.EndTest(S_OK); +} + +void InventoryTests::TestDeleteInventoryCollection(TestContext& tc) +{ + // Already covered in TestGetInventoryCollectionIds + tc.EndTest(S_OK); +} + +void InventoryTests::TestDeleteInventoryItems(TestContext& tc) +{ + // Already covered in TestExecuteInventoryOperations + tc.EndTest(S_OK); +} + +void InventoryTests::TestExecuteInventoryOperations(TestContext& tc) +{ + constexpr char kCollectionId[]{ "executeInventoryOperationsCollection" }; + + ExecuteInventoryOperationsOperation::RequestType request; + request.SetCollectionId(kCollectionId); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + ModelVector> ops; + Wrappers::PFInventoryAddInventoryItemsOperationWrapper addOp; + Wrappers::PFInventoryInventoryOperationWrapper op; + addOp.SetAmount(1); + Wrappers::PFInventoryInventoryItemReferenceWrapper item; + Wrappers::PFInventoryAlternateIdWrapper altId; + altId.SetType(kFriendlyId); + altId.SetValue(kPermanentItemId); + item.SetAlternateId(altId); + addOp.SetItem(item); + op.SetAdd(addOp); + ops.push_back(op); + request.SetOperations(ops); + + ExecuteInventoryOperationsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Add transaction (and possible CollectionCreated transaction if this is the first run on a title) + auto count = result.Payload().Model().transactionIdsCount; + tc.AssertTrue(2u == count || 1u == count, "transactionIdsCount"); + + return S_OK; + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return DeleteItem(DefaultTitlePlayer(), kCollectionId, tc, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void InventoryTests::TestGetInventoryCollectionIds(TestContext& tc) +{ + constexpr char kCollectionId[]{ "getInventoryCollectionIdsCollection" }; + + AddInventoryItem(DefaultTitlePlayer(), kCollectionId, RunContext(), tc).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + GetInventoryCollectionIdsOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetCount(1); + + return GetInventoryCollectionIdsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Can't guarantee which collections are returned + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.collectionIdsCount, "collectionIdsCount"); + + return S_OK; + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return DeleteItem(DefaultTitlePlayer(), kCollectionId, tc, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void InventoryTests::TestGetInventoryItems(TestContext& tc) +{ + constexpr char kCollectionId[]{ "getInventoryItemsCollection" }; + + AddInventoryItem(DefaultTitlePlayer(), kCollectionId, RunContext(), tc).Then([&, kCollectionId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + GetInventoryItemsOperation::RequestType request; + request.SetCollectionId(kCollectionId); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + return GetInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.itemsCount, "itemsCount"); + tc.AssertEqual(kPermanentItemType, model.items[0]->type, "items[0]->type"); + + return S_OK; + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return DeleteItem(DefaultTitlePlayer(), kCollectionId, tc, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_SONY_PLAYSTATION_4 && HC_PLATFORM != HC_PLATFORM_SONY_PLAYSTATION_5 +void InventoryTests::TestGetMicrosoftStoreAccessTokens(TestContext& tc) +{ + // TODO: This test is currently failing due to the PlayFab service currently being reworked + tc.Skip(); + /*GetMicrosoftStoreAccessTokensOperation::Run(DefaultTitlePlayer(), GetMicrosoftStoreAccessTokensOperation::RequestType{}, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertTrue(model.collectionsAccessToken, "collectionsAccessToken"); + tc.AssertTrue(model.collectionsAccessTokenExpirationDate, "collectionsAccessTokenExpirationDate"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + });*/ +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void InventoryTests::TestGetTransactionHistory(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void InventoryTests::TestPurchaseInventoryItems(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + constexpr char kCollectionId[]{ "purchaseInventoryItemsCollection" }; + + AddInventoryItemsOperation::RequestType request; + request.SetAmount(kCurrencyAmount); + request.SetCollectionId(kCollectionId); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + Wrappers::PFInventoryInventoryItemReferenceWrapper item; + item.SetAlternateId(AltId(kPermanentCurrencyId)); + request.SetItem(item); + + AddInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Add transaction (and possible CollectionCreated transaction if this is the first run on a title) + auto count = result.Payload().Model().transactionIdsCount; + tc.AssertTrue(2u == count || 1u == count, "transactionIdsCount"); + + return S_OK; + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + PurchaseInventoryItemsOperation::RequestType request; + request.SetAmount(1); + request.SetCollectionId(kCollectionId); + request.SetDeleteEmptyStacks(true); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + Wrappers::PFInventoryInventoryItemReferenceWrapper item; + item.SetAlternateId(AltId(kPermanentItemId)); + request.SetItem(item); + ModelVector> amounts; + Wrappers::PFInventoryPurchasePriceAmountWrapper amount; + amount.SetAmount(kCurrencyAmount); + amount.SetItemId(m_state->currencyId); + amounts.push_back(amount); + request.SetPriceAmounts(amounts); + + return PurchaseInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Purchase transaction. The number of transactions returned can vary by platform but there should always be at least 1 + tc.AssertTrue(result.Payload().Model().transactionIdsCount >= 1u, "No transaction IDs returned"); + + return S_OK; + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return DeleteItem(DefaultTitlePlayer(), kCollectionId, tc, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + tc.Skip(); +#endif +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void InventoryTests::TestRedeemAppleAppStoreInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void InventoryTests::TestRedeemGooglePlayInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH +void InventoryTests::TestRedeemMicrosoftStoreInventoryItems(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_GDK + constexpr char kCollectionId[]{ "redeemMicrosoftStoreInventoryItemsCollection" }; + + assert(DefaultPlatformUser()); + RedeemMicrosoftStoreInventoryItemsOperation::RequestType request{ Wrappers::XUser::Duplicate(DefaultPlatformUser()->Handle()) }; + request.SetCollectionId(kCollectionId); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + + return RedeemMicrosoftStoreInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + tc.Skip(); +#endif +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_WIN32 +void InventoryTests::TestRedeemNintendoEShopInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void InventoryTests::TestRedeemPlayStationStoreInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH +void InventoryTests::TestRedeemSteamInventoryItems(TestContext& tc) +{ + tc.Skip(); +} +#endif + +void InventoryTests::TestSubtractInventoryItems(TestContext& tc) +{ + constexpr char kCollectionId[]{ "subtractInventoryItemsCollection" }; + + AddInventoryItem(DefaultTitlePlayer(), kCollectionId, RunContext(), tc).Then([&, kCollectionId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + SubtractInventoryItemsOperation::RequestType request; + request.SetAmount(1); + request.SetCollectionId(kCollectionId); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + Wrappers::PFInventoryInventoryItemReferenceWrapper item; + item.SetAlternateId(AltId(kPermanentItemId)); + request.SetItem(item); + + return SubtractInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Subtract transaction + tc.AssertEqual(1u, result.Payload().Model().transactionIdsCount, "transactionIdsCount"); + + return S_OK; + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup. Specify 1 transaction since the item has already been subtracted + return DeleteItem(DefaultTitlePlayer(), kCollectionId, tc, RunContext(), 1u); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void InventoryTests::TestTransferInventoryItems(TestContext& tc) +{ + constexpr char kCollectionId[]{ "transferInventoryItemsCollection" }; + constexpr char kAltCollectionId[]{ "transferInventoryItemsAltCollection" }; + + AddInventoryItem(DefaultTitlePlayer(), kCollectionId, RunContext(), tc).Then([&, kCollectionId, kAltCollectionId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + TransferInventoryItemsOperation::RequestType request; + request.SetAmount(1); + request.SetDeleteEmptyStacks(true); + request.SetGivingCollectionId(kCollectionId); + Wrappers::PFInventoryInventoryItemReferenceWrapper item; + item.SetAlternateId(AltId(kPermanentItemId)); + request.SetGivingItem(item); + request.SetReceivingCollectionId(kAltCollectionId); + request.SetReceivingEntity(DefaultTitlePlayer().EntityKey()); + request.SetReceivingItem(item); + + return TransferInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + // Subtract and Delete transactions + tc.AssertEqual(2u, model.givingTransactionIdsCount, "givingTransactionIdsCount"); + + // TransferExecuted transaction + tc.AssertEqual(1u, model.receivingTransactionIdsCount, "receivingTransactionIdsCount"); + + return S_OK; + }) + .Then([&, kAltCollectionId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return DeleteItem(DefaultTitlePlayer(), kAltCollectionId, tc, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void InventoryTests::TestUpdateInventoryItems(TestContext& tc) +{ + constexpr char kCollectionId[]{ "updateInventoryItemsCollection" }; + + AddInventoryItem(DefaultTitlePlayer(), kCollectionId, RunContext(), tc).Then([&, kCollectionId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + GetInventoryItemsOperation::RequestType request; + request.SetCollectionId(kCollectionId); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetCount(1); + + return GetInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.itemsCount, "itemsCount"); + tc.AssertEqual(kPermanentItemType, model.items[0]->type, "items[0]->type"); + + UpdateInventoryItemsOperation::RequestType request; + request.SetCollectionId(kCollectionId); + request.SetEntity(DefaultTitlePlayer().EntityKey()); + Wrappers::PFInventoryInventoryItemWrapper updatedItem; + updatedItem.SetId(model.items[0]->id); + updatedItem.SetAmount(5); + updatedItem.SetType(m_state->permanentItem.Model().type); + request.SetItem(updatedItem); + + return UpdateInventoryItemsOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Update transaction + tc.AssertEqual(1u, result.Payload().Model().transactionIdsCount, "transactionIdsCount"); + + return S_OK; + }) + .Then([&, kCollectionId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return DeleteItem(DefaultTitlePlayer(), kCollectionId, tc, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/LocalizationTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/LocalizationTestsImpl.cpp new file mode 100644 index 0000000..24cba64 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/LocalizationTestsImpl.cpp @@ -0,0 +1,29 @@ +#include "TestAppPch.h" +#include "LocalizationTests.h" +#include "LocalizationOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp LocalizationTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp LocalizationTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void LocalizationTests::TestGetLanguageList(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/MultiplayerServerTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/MultiplayerServerTestsImpl.cpp new file mode 100644 index 0000000..dee49cd --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/MultiplayerServerTestsImpl.cpp @@ -0,0 +1,351 @@ +#include "TestAppPch.h" +#include "MultiplayerServerTests.h" +#include "MultiplayerServerOperations.h" +#include "SdkVersion.h" +#include "HttpRequest.h" +#include "JsonUtils.h" + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kTestBuildAlias[]{ "testBuildAlias" }; +constexpr char kTestSessionId[]{ "239179e3-09dd-4a87-9263-e43abd546189" }; + +class GetEntityTokenOperation : public XAsyncOperation +{ +public: + GetEntityTokenOperation(Entity const& entity, PlayFab::RunContext runContext) noexcept : + XAsyncOperation{ std::move(runContext) }, + m_entity{ entity } + { + } + + static AsyncOp Run(Entity entity, PlayFab::RunContext rc) noexcept + { + return RunOperation(MakeUnique(std::move(entity), std::move(rc))); + } + +private: + // XAsyncOperation + HRESULT OnStarted(XAsyncBlock* async) noexcept override + { + return PFEntityGetEntityTokenAsync(m_entity.Handle(), async); + } + + Result GetResult(XAsyncBlock* async) noexcept override + { + size_t bufferSize; + Vector buffer; + PFEntityToken const* entityToken; + + RETURN_IF_FAILED(PFEntityGetEntityTokenResultSize(async, &bufferSize)); + buffer.resize(bufferSize); + RETURN_IF_FAILED(PFEntityGetEntityTokenResult(async, buffer.size(), buffer.data(), &entityToken, nullptr)); + RETURN_HR_IF(E_UNEXPECTED, !entityToken->token); + + return String{ entityToken->token }; + } + + Entity const m_entity; +}; + +#if HC_PLATFORM != HC_PLATFORM_GDK +AsyncOp CreateBuildAlias(ServiceConfig serviceConfig, Entity title, RunContext rc, TestContext& tc) +{ + JsonValue requestBody{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(requestBody, "AliasName", kTestBuildAlias); + const char* path{ "/MultiplayerServer/CreateBuildAlias" }; + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() }}; + + Stringstream fullUrl; + fullUrl << serviceConfig.APIEndpoint(); + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return GetEntityTokenOperation::Run(title, rc).Then( + [ + &, + url = fullUrl.str(), + body = JsonUtils::WriteToString(requestBody), + rc + ] + (Result result) mutable -> AsyncOp + { + RETURN_IF_FAILED(result.hr); + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + headers[kEntityTokenHeaderName] = result.ExtractPayload(); + + return RunOperation(MakeUnique(kPostMethod, url, std::move(headers), body, std::move(rc))); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + tc.AssertTrue(serviceResponse.Data.HasMember("AliasName"), "AliasName"); + tc.AssertEqual(kTestBuildAlias, serviceResponse.Data["AliasName"].GetString(), "AliasName"); + tc.AssertTrue(serviceResponse.Data.HasMember("AliasId"), "AliasId"); + + return Result(serviceResponse.Data["AliasId"].GetString()); + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp DeleteBuildAlias(ServiceConfig serviceConfig, Entity title, String aliasId, RunContext rc) +{ + JsonValue requestBody{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(requestBody, "AliasId", aliasId); + const char* path{ "/MultiplayerServer/DeleteBuildAlias" }; + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + + Stringstream fullUrl; + fullUrl << serviceConfig.APIEndpoint(); + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return GetEntityTokenOperation::Run(title, rc).Then( + [ + url = fullUrl.str(), + body = JsonUtils::WriteToString(requestBody), + rc + ] + (Result result) mutable -> AsyncOp + { + RETURN_IF_FAILED(result.hr); + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + headers[kEntityTokenHeaderName] = result.ExtractPayload(); + + return RunOperation(MakeUnique(kPostMethod, url, std::move(headers), body, std::move(rc))); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} + +AsyncOp ShutdownServerSession(ServiceConfig serviceConfig, Entity titlePlayer, RunContext rc) +{ + JsonValue requestBody{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(requestBody, "SessionId", kTestSessionId); + const char* path{ "/MultiplayerServer/ShutdownMultiplayerServer" }; + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + + Stringstream fullUrl; + fullUrl << serviceConfig.APIEndpoint(); + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return GetEntityTokenOperation::Run(titlePlayer, rc).Then( + [ + url = fullUrl.str(), + body = JsonUtils::WriteToString(requestBody), + rc + ] + (Result result) mutable -> AsyncOp + { + RETURN_IF_FAILED(result.hr); + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + headers[kEntityTokenHeaderName] = result.ExtractPayload(); + + return RunOperation(MakeUnique(kPostMethod, url, std::move(headers), body, std::move(rc))); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + + auto serviceResponse = result.ExtractPayload(); + if (serviceResponse.HttpCode >= 200 && serviceResponse.HttpCode < 300) + { + return S_OK; + } + else + { + return Result{ ServiceErrorToHR(serviceResponse.ErrorCode), std::move(serviceResponse.ErrorMessage) }; + } + }); +} +#endif + +AsyncOp MultiplayerServerTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp MultiplayerServerTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void MultiplayerServerTests::TestListBuildAliases(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_WIN32 + auto aliasId = MakeShared(); + + CreateBuildAlias(ServiceConfig(), TitleEntity(), RunContext(), tc) + .Then([&, aliasId](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + *aliasId = result.ExtractPayload(); + + ListBuildAliasesOperation::RequestType request{}; + return ListBuildAliasesOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, aliasId](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + //auto& model = result.Payload().Model(); + tc.AssertEqual(1u, result.Payload().Model().buildAliasesCount, "buildAliasesCount"); + tc.AssertEqual(kTestBuildAlias, result.Payload().Model().buildAliases[0]->aliasName, "aliasName"); + tc.AssertEqual(*aliasId, result.Payload().Model().buildAliases[0]->aliasId, "aliasId"); + + return S_OK; + }) + .Then([&, aliasId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return DeleteBuildAlias(ServiceConfig(), TitleEntity(), *aliasId, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // Test code uses TitleEntity so skipping except on Win32 + tc.Skip(); +#endif +} + +void MultiplayerServerTests::TestListBuildSummariesV2(TestContext& tc) +{ + // Already covered in TestRequestMultiplayerServer + tc.EndTest(S_OK); +} + +void MultiplayerServerTests::TestListQosServersForTitle(TestContext& tc) +{ + ListQosServersForTitleOperation::Run(DefaultTitlePlayer(), ListQosServersForTitleOperation::RequestType{}, RunContext()) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertTrue(1u <= result.Payload().Model().qosServersCount, "qosServersCount"); + tc.AssertTrue(result.Payload().Model().qosServers[0]->serverUrl, "serverUrl"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void MultiplayerServerTests::TestRequestMultiplayerServer(TestContext& tc) +{ +#if HC_PLATFORM == HC_PLATFORM_WIN32 + // Requires manual server set up in Game Manager portal + constexpr char kTestRegion[]{ "EastUs" }; + + auto buildId = MakeShared(); + + ListBuildSummariesV2Operation::Run(DefaultTitlePlayer(), ListBuildSummariesV2Operation::RequestType{}, RunContext()) + .Then([&, buildId, kTestRegion](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.buildSummariesCount, "buildSummariesCount"); + tc.AssertTrue(model.buildSummaries[0]->buildId, "buildId"); + + *buildId = model.buildSummaries[0]->buildId; + + RequestMultiplayerServerOperation::RequestType request{}; + request.SetBuildId(*buildId); + request.SetPreferredRegions({ kTestRegion }); + request.SetSessionId(kTestSessionId); + + return RequestMultiplayerServerOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, buildId, kTestRegion](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(*buildId, model.buildId, "buildId"); + tc.AssertEqual(0u, model.connectedPlayersCount, "connectedPlayersCount"); + tc.AssertEqual(kTestRegion, model.region, "region"); + tc.AssertEqual(kTestSessionId, model.sessionId, "sessionId"); + + return S_OK; + }) + .Then([&, buildId](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup + return ShutdownServerSession(ServiceConfig(), TitleEntity(), RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // Test code uses TitleEntity so skipping except on Win32 + tc.Skip(); +#endif +} + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/PlatformSpecificTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/PlatformSpecificTestsImpl.cpp new file mode 100644 index 0000000..070d70c --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/PlatformSpecificTestsImpl.cpp @@ -0,0 +1,50 @@ +#include "TestAppPch.h" +#include "PlatformSpecificTests.h" +#include "PlatformSpecificOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp PlatformSpecificTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp PlatformSpecificTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void PlatformSpecificTests::TestClientAndroidDevicePushNotificationRegistration(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void PlatformSpecificTests::TestClientRefreshPSNAuthToken(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void PlatformSpecificTests::TestClientRegisterForIOSPushNotification(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void PlatformSpecificTests::TestServerAwardSteamAchievement(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/PlayerDataManagementTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/PlayerDataManagementTestsImpl.cpp new file mode 100644 index 0000000..0440fe6 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/PlayerDataManagementTestsImpl.cpp @@ -0,0 +1,312 @@ +#include "TestAppPch.h" +#include "PlayerDataManagementTests.h" +#include "PlayerDataManagementOperations.h" +#include "SdkVersion.h" +#include "HttpRequest.h" +#include "JsonUtils.h" + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kTestKey[]{ "testKey" }; +constexpr char kTestVal[]{ "testVal" }; + +AsyncOp ServerUpdateUserReadonlyData(ServiceConfig serviceConfig, String secretKey, String playFabId, String path, bool cleanup, PlayFab::RunContext rc) noexcept +{ + JsonValue requestBody{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(requestBody, "PlayFabId", playFabId); + + if (cleanup) + { + JsonUtils::ObjectAddMemberArray(requestBody, "KeysToRemove", Vector{ kTestKey }); + } + else + { + JsonUtils::ObjectAddMemberDictionary(requestBody, "Data", Map{ {kTestKey, kTestVal} }); + } + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + headers[kSecretKeyHeaderName] = secretKey; + + Stringstream fullUrl; + fullUrl << serviceConfig.APIEndpoint(); + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return RunOperation(MakeUnique(kPostMethod, fullUrl.str(), std::move(headers), JsonUtils::WriteToString(requestBody), std::move(rc))) + .Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + return ServiceErrorToHR(result.Payload().ErrorCode); + }); +} + +AsyncOp PlayerDataManagementTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp PlayerDataManagementTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void PlayerDataManagementTests::TestClientGetUserData(TestContext& tc) +{ + // Already covered in TestClientUpdateUserData + tc.EndTest(S_OK); +} + +void PlayerDataManagementTests::TestClientGetUserPublisherData(TestContext& tc) +{ + // Already covered in TestClientUpdateUserPublisherData + tc.EndTest(S_OK); +} + +void PlayerDataManagementTests::TestClientGetUserPublisherReadOnlyData(TestContext& tc) +{ + ServerUpdateUserReadonlyData(ServiceConfig(), m_testTitleData.secretKey, DefaultTitlePlayerId(), "/Server/UpdateUserPublisherReadOnlyData", false, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + ClientGetUserPublisherReadOnlyDataOperation::RequestType request; + request.SetKeys({ kTestKey }); + + return ClientGetUserPublisherReadOnlyDataOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(1u, result.Payload().Model().dataCount, "dataCount"); + tc.AssertEqual(kTestKey, result.Payload().Model().data[0].key, "dataKey"); + tc.AssertEqual(kTestVal, result.Payload().Model().data[0].value->value, "dataValue"); + + return S_OK; + }) + .Then([&](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup: remove keys + return ServerUpdateUserReadonlyData(ServiceConfig(), m_testTitleData.secretKey, DefaultTitlePlayerId(), "/Server/UpdateUserPublisherReadOnlyData", true, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void PlayerDataManagementTests::TestClientGetUserReadOnlyData(TestContext& tc) +{ + ServerUpdateUserReadonlyData(ServiceConfig(), m_testTitleData.secretKey, DefaultTitlePlayerId(), "/Server/UpdateUserReadOnlyData", false, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + ClientGetUserReadOnlyDataOperation::RequestType request; + request.SetKeys({ kTestKey }); + + return ClientGetUserReadOnlyDataOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(1u, result.Payload().Model().dataCount, "dataCount"); + tc.AssertEqual(kTestKey, result.Payload().Model().data[0].key, "dataKey"); + tc.AssertEqual(kTestVal, result.Payload().Model().data[0].value->value, "dataValue"); + + return S_OK; + }) + .Then([&](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup: remove keys + return ServerUpdateUserReadonlyData(ServiceConfig(), m_testTitleData.secretKey, DefaultTitlePlayerId(), "/Server/UpdateUserReadOnlyData", true, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void PlayerDataManagementTests::TestClientUpdateUserData(TestContext& tc) +{ + ClientUpdateUserDataOperation::RequestType request{}; + StringDictionaryEntryVector data{}; + data.insert_or_assign(kTestKey, kTestVal); + request.SetData(data); + + ClientUpdateUserDataOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + ClientGetUserDataOperation::RequestType request; + request.SetKeys({ kTestKey }); + + return ClientGetUserDataOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(1u, result.Payload().Model().dataCount, "dataCount"); + tc.AssertEqual(kTestKey, result.Payload().Model().data[0].key, "dataKey"); + tc.AssertEqual(kTestVal, result.Payload().Model().data[0].value->value, "dataValue"); + + return S_OK; + }) + .Then([&](Result result) ->AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup: remove keys + ClientUpdateUserDataOperation::RequestType request; + request.SetKeysToRemove({ kTestKey }); + + return ClientUpdateUserDataOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void PlayerDataManagementTests::TestClientUpdateUserPublisherData(TestContext& tc) +{ + ClientUpdateUserPublisherDataOperation::RequestType request{}; + StringDictionaryEntryVector data{}; + data.insert_or_assign(kTestKey, kTestVal); + request.SetData(data); + + ClientUpdateUserPublisherDataOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + ClientGetUserPublisherDataOperation::RequestType request; + request.SetKeys({ kTestKey }); + + return ClientGetUserPublisherDataOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + tc.AssertEqual(1u, result.Payload().Model().dataCount, "dataCount"); + tc.AssertEqual(kTestKey, result.Payload().Model().data[0].key, "dataKey"); + tc.AssertEqual(kTestVal, result.Payload().Model().data[0].value->value, "dataValue"); + + return S_OK; + }) + .Then([&](Result result)->AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup: remove keys + ClientUpdateUserPublisherDataOperation::RequestType request; + request.SetKeysToRemove({ kTestKey }); + + return ClientUpdateUserPublisherDataOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerGetUserData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerGetUserInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerGetUserPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerGetUserPublisherInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerGetUserPublisherReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerGetUserReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerUpdateUserData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerUpdateUserInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerUpdateUserPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerUpdateUserPublisherInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerUpdateUserPublisherReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PlayerDataManagementTests::TestServerUpdateUserReadOnlyData(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/ProfilesTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/ProfilesTestsImpl.cpp new file mode 100644 index 0000000..66f7e44 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/ProfilesTestsImpl.cpp @@ -0,0 +1,226 @@ +#include "TestAppPch.h" +#include "ProfilesTests.h" +#include "ProfilesOperations.h" +#include "FriendsOperations.h" +#include "JsonUtils.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp ProfilesTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp ProfilesTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void ProfilesTests::TestGetProfile(TestContext& tc) +{ + GetProfileOperation::Run(DefaultTitlePlayer(), {}, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.profile->entity->id, "profile->entity->id"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); + +} + +void ProfilesTests::TestGetProfiles(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + // AddFriend -> SetProfilePolicy -> GetProfiles -> Cleanup + + static constexpr char friendCustomId[] = "ProfileCustomId"; + + struct TestState + { + std::optional friendEntity; + String friendPlayFabId; + }; + + auto testState = MakeShared(); + + GetTitlePlayer(friendCustomId).Then([&, testState](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + testState->friendEntity.emplace(result.ExtractPayload()); + + auto getFriendPlayFabIdResult = GetPlayFabIdFromCustomId(friendCustomId).Wait(); + RETURN_IF_FAILED_PLAYFAB(getFriendPlayFabIdResult); + testState->friendPlayFabId = getFriendPlayFabIdResult.ExtractPayload(); + + // AddFriend + ClientAddFriendOperation::RequestType request; + request.SetFriendPlayFabId(testState->friendPlayFabId); + return ClientAddFriendOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, testState](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(true, result.Payload().Model().created, "created"); + + // AddFriend in the other direction + ClientAddFriendOperation::RequestType request; + request.SetFriendPlayFabId(DefaultTitlePlayerId()); + return ClientAddFriendOperation::Run(*testState->friendEntity, request, RunContext()); + }) + .Then([&, testState](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + tc.AssertEqual(true, result.Payload().Model().created, "created"); + + // Set Profile Policy of friend so that friends can read profile + SetProfilePolicyOperation::RequestType request; + request.SetEntity(testState->friendEntity->EntityKey()); + ModelVector> statements; + Wrappers::PFProfilesEntityPermissionStatementWrapper statement; + statement.SetEffect(PFProfilesEffectType::Allow); + statement.SetAction("Read"); + JsonDocument principalJson{ rapidjson::kObjectType }; + principalJson.AddMember("Friend", "true", principalJson.GetAllocator()); + statement.SetPrincipal(JsonUtils::WriteToString(principalJson)); + Stringstream resource; + resource << "pfrn:data--*!*/Profile/*"; + statement.SetResource(resource.str()); + statements.push_back(std::move(statement)); + request.SetStatements(std::move(statements)); + + return SetProfilePolicyOperation::Run(*testState->friendEntity, request, RunContext()); + }) + .Then([&, testState](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + // DefaultTitlePlayer should be able to read the friends profile now + GetProfilesOperation::RequestType request; + ModelVector profilesToGet; + profilesToGet.push_back(DefaultTitlePlayer().EntityKey()); + profilesToGet.push_back(testState->friendEntity->EntityKey()); + request.SetEntities(std::move(profilesToGet)); + return GetProfilesOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, testState](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + Map expectedProfilesRetreived; + auto defaultTitlePlayer = DefaultTitlePlayer(); + expectedProfilesRetreived.emplace(defaultTitlePlayer.EntityKey().Model().id, defaultTitlePlayer); + expectedProfilesRetreived.emplace(testState->friendEntity->EntityKey().Model().id, *testState->friendEntity); + + auto& model = result.Payload().Model(); + tc.AssertEqual(expectedProfilesRetreived.size(), model.profilesCount, "profilesCount"); + tc.AssertTrue(expectedProfilesRetreived.find(model.profiles[0]->entity->id) != expectedProfilesRetreived.end(), "Unexpected profile returned"); + tc.AssertTrue(expectedProfilesRetreived.find(model.profiles[1]->entity->id) != expectedProfilesRetreived.end(), "Unexpected profile returned"); + + return S_OK; + }) + .Then([&, testState](Result result) -> AsyncOp + { + tc.RecordResult(std::move(result)); + + // Cleanup by removing friend and resetting profile policy + SetProfilePolicyOperation::RequestType request; + request.SetEntity(testState->friendEntity->EntityKey()); + ModelVector> statements; + Wrappers::PFProfilesEntityPermissionStatementWrapper statement; + statement.SetEffect(PFProfilesEffectType::Deny); + statement.SetAction("Read"); + JsonDocument principalJson{ rapidjson::kObjectType }; + principalJson.AddMember("Friend", "true", principalJson.GetAllocator()); + statement.SetPrincipal(JsonUtils::WriteToString(principalJson)); + Stringstream resource; + resource << "pfrn:data--*!*/Profile/*"; + statement.SetResource(resource.str()); + statements.push_back(std::move(statement)); + request.SetStatements(std::move(statements)); + + return SetProfilePolicyOperation::Run(*testState->friendEntity, request, RunContext()); + }) + .Then([&, testState](Result result) + { + tc.RecordResult(std::move(result)); + + ClientRemoveFriendOperation::RequestType request; + request.SetFriendPlayFabId(testState->friendPlayFabId); + return ClientRemoveFriendOperation::Run(DefaultTitlePlayer(), request, RunContext()); + }) + .Then([&, testState](Result result) + { + tc.RecordResult(std::move(result)); + + ClientRemoveFriendOperation::RequestType request; + request.SetFriendPlayFabId(DefaultTitlePlayerId()); + return ClientRemoveFriendOperation::Run(*testState->friendEntity, request, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +#else + // GDK doesn't support GetTitlePlayer + tc.Skip(); +#endif +} + +void ProfilesTests::TestGetTitlePlayersFromMasterPlayerAccountIds(TestContext& tc) +{ + GetTitlePlayersFromMasterPlayerAccountIdsOperation::RequestType request; + request.SetMasterPlayerAccountIds({ DefaultTitlePlayerId() }); + request.SetTitleId(ServiceConfig().TitleId()); + GetTitlePlayersFromMasterPlayerAccountIdsOperation::Run(DefaultTitlePlayer(), request, RunContext()) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.titlePlayerAccountsCount, "titlePlayerAccountsCount"); + tc.AssertEqual(DefaultTitlePlayerId(), model.titlePlayerAccounts[0].key, "model.titlePlayerAccounts[0].key"); + tc.AssertEqual(DefaultTitlePlayer().EntityKey().Model().id, model.titlePlayerAccounts[0].value->id, "titlePlayerAccounts[0].value->id"); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void ProfilesTests::TestSetProfileLanguage(TestContext& tc) +{ + SetProfileLanguageOperation::RequestType request; + request.SetEntity(DefaultTitlePlayer().EntityKey()); + request.SetLanguage("en"); + SetProfileLanguageOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void ProfilesTests::TestSetProfilePolicy(TestContext& tc) +{ +#if HC_PLATFORM != HC_PLATFORM_GDK + // Covered by TestGetProfiles + tc.EndTest(S_OK); +#else + // GDK doesn't support GetTitlePlayer + tc.Skip(); +#endif +} + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/PushNotificationsTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/PushNotificationsTestsImpl.cpp new file mode 100644 index 0000000..3618c71 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/PushNotificationsTestsImpl.cpp @@ -0,0 +1,36 @@ +#include "TestAppPch.h" +#include "PushNotificationsTests.h" +#include "PushNotificationsOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp PushNotificationsTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp PushNotificationsTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PushNotificationsTests::TestServerSendPushNotification(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void PushNotificationsTests::TestServerSendPushNotificationFromTemplate(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/SegmentsTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/SegmentsTestsImpl.cpp new file mode 100644 index 0000000..7ff44ca --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/SegmentsTestsImpl.cpp @@ -0,0 +1,114 @@ +#include "TestAppPch.h" +#include "SegmentsTests.h" +#include "SegmentsOperations.h" + +namespace PlayFab +{ +namespace Test +{ + +AsyncOp SegmentsTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp SegmentsTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void SegmentsTests::TestClientGetPlayerSegments(TestContext& tc) +{ + ClientGetPlayerSegmentsOperation::Run(DefaultTitlePlayer(), RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + auto model = result.Payload().Model(); + + // We expect every player to be at least part of the "All Players" segment. Depending on the player, they may be part of other segments + // as well. + tc.AssertTrue(model.segmentsCount >= 1u, "No segments returned"); + bool allPlayersFound = false; + for (uint32_t i = 0; i < model.segmentsCount; ++i) + { + if (!std::strcmp("All Players", model.segments[i]->name)) + { + allPlayersFound = true; + break; + } + } + tc.AssertTrue(allPlayersFound, "\"All Players\" segment not found"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void SegmentsTests::TestClientGetPlayerTags(TestContext& tc) +{ + ClientGetPlayerTagsOperation::RequestType request; + request.SetPlayFabId(DefaultTitlePlayerId()); + + ClientGetPlayerTagsOperation::Run(DefaultTitlePlayer(), request, RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(DefaultTitlePlayerId(), model.playFabId, "playFabId"); + tc.AssertEqual(0u, model.tagsCount, "tagsCount"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void SegmentsTests::TestServerAddPlayerTag(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void SegmentsTests::TestServerGetAllSegments(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void SegmentsTests::TestServerGetPlayerSegments(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void SegmentsTests::TestServerGetPlayersInSegment(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void SegmentsTests::TestServerGetPlayerTags(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_GDK && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_WIN32 +void SegmentsTests::TestServerRemovePlayerTag(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Tests/Services/TitleDataManagementTestsImpl.cpp b/Test/PlayFabServicesTestApp/Tests/Services/TitleDataManagementTestsImpl.cpp new file mode 100644 index 0000000..c9c183d --- /dev/null +++ b/Test/PlayFabServicesTestApp/Tests/Services/TitleDataManagementTestsImpl.cpp @@ -0,0 +1,273 @@ +#include "TestAppPch.h" +#include "TitleDataManagementTests.h" +#include "TitleDataManagementOperations.h" +#include "SdkVersion.h" +#include "HttpRequest.h" +#include "JsonUtils.h" +#include "Platform/PlatformUtils.h" + +namespace PlayFab +{ +namespace Test +{ + +constexpr char kTestKey[]{ "testKey" }; +constexpr char kTestVal[]{ "testVal" }; +constexpr time_t kTestTime{ 12345u }; + +AsyncOp ServerSetTitleData(ServiceConfig serviceConfig, String secretKey, String path, bool cleanup, PlayFab::RunContext rc) noexcept +{ + JsonValue requestBody{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(requestBody, "key", kTestKey); + + if (cleanup) + { + JsonValue nullVal{ rapidjson::kNullType }; + JsonUtils::ObjectAddMember(requestBody, "value", nullVal); + } + else + { + JsonUtils::ObjectAddMember(requestBody, "value", kTestVal); + } + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + headers[kSecretKeyHeaderName] = secretKey; + + Stringstream fullUrl; + fullUrl << serviceConfig.APIEndpoint(); + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return RunOperation(MakeUnique(kPostMethod, fullUrl.str(), std::move(headers), JsonUtils::WriteToString(requestBody), std::move(rc))) + .Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + return ServiceErrorToHR(result.Payload().ErrorCode); + }); +} + +AsyncOp InitialAdminAddNews(ServiceConfig serviceConfig, String secretKey, PlayFab::RunContext rc) noexcept +{ + const char* path{ "/Admin/AddNews" }; + + JsonValue requestBody{ rapidjson::kObjectType }; + JsonUtils::ObjectAddMember(requestBody, "title", kTestKey); + JsonUtils::ObjectAddMember(requestBody, "body", kTestVal); + JsonUtils::ObjectAddMember(requestBody, "timestamp", JsonUtils::ToJsonTime(kTestTime)); + + Stringstream headerVal; + headerVal << versionString << sdkVersion; + UnorderedMap headers{ { kSDKVersionStringHeaderName, headerVal.str() } }; + headers[kSecretKeyHeaderName] = secretKey; + + Stringstream fullUrl; + fullUrl << serviceConfig.APIEndpoint(); + + // Append path + fullUrl << path; + + // Add sdk version param (used by service for telemetry) + fullUrl << "?sdk=" << versionString << sdkVersion; + + return RunOperation(MakeUnique(kPostMethod, fullUrl.str(), std::move(headers), JsonUtils::WriteToString(requestBody), std::move(rc))) + .Then([](Result result) -> Result + { + RETURN_IF_FAILED(result.hr); + return ServiceErrorToHR(result.Payload().ErrorCode); + }); +} + +AsyncOp TitleDataManagementTests::Initialize() +{ + return ServicesTestClass::Initialize(); +} + +AsyncOp TitleDataManagementTests::Uninitialize() +{ + return ServicesTestClass::Uninitialize(); +} + +void TitleDataManagementTests::TestClientGetPublisherData(TestContext& tc) +{ + // Docs specify it may take results from SetPublisherData up to a couple of minutes to show in Get requests. + // Not adding a cleanup step here to ensure consistent results. + ServerSetTitleData(ServiceConfig(), m_testTitleData.secretKey, "/Server/SetPublisherData", false, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + return ClientGetPublisherDataOperation::Run(DefaultTitlePlayer(), {}, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.dataCount, "dataCount"); + tc.AssertEqual(kTestKey, model.data[0].key, "data[0].key"); + tc.AssertEqual(kTestVal, model.data[0].value, "data[0].value"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void TitleDataManagementTests::TestClientGetTime(TestContext& tc) +{ + ClientGetTimeOperation::Run(DefaultTitlePlayer(), RunContext()).Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + // Verify result time is within the last 10 seconds. Docs specify there may be a variance of up to 5 seconds. + const time_t now = Platform::GetSystemTime(); + const int expectedSeconds = 6; + const auto actualSeconds = abs(difftime(now, result.Payload().Model().time)); + + tc.AssertTrue(actualSeconds < expectedSeconds, "Returned time differs from system time by more than expected variance"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void TitleDataManagementTests::TestClientGetTitleData(TestContext& tc) +{ + ServerSetTitleData(ServiceConfig(), m_testTitleData.secretKey, "/Server/SetTitleData", false, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + return ClientGetTitleDataOperation::Run(DefaultTitlePlayer(), {}, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.dataCount, "dataCount"); + tc.AssertEqual(kTestKey, model.data[0].key, "data[0].key"); + tc.AssertEqual(kTestVal, model.data[0].value, "data[0].value"); + + return S_OK; + }) + .Then([&](Result result) + { + tc.RecordResult(std::move(result)); + + return ServerSetTitleData(ServiceConfig(), m_testTitleData.secretKey, "/Server/SetTitleData", true, RunContext()); + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +void TitleDataManagementTests::TestClientGetTitleNews(TestContext& tc) +{ + // Deleting news can only be done manually through the portal, and there is a very low limit (about 10) for news entries. + // The setup for this test will only create a news item if needed and afterward, the test will check against that permanent item. + ClientGetTitleNewsOperation::Run(DefaultTitlePlayer(), {}, RunContext()).Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + if (model.newsCount == 0) + { + return InitialAdminAddNews(ServiceConfig(), m_testTitleData.secretKey, RunContext()); + } + + return S_OK; + }) + .Then([&](Result result) -> AsyncOp + { + RETURN_IF_FAILED_PLAYFAB(result); + + return ClientGetTitleNewsOperation::Run(DefaultTitlePlayer(), {}, RunContext()); + }) + .Then([&](Result result) -> Result + { + RETURN_IF_FAILED_PLAYFAB(result); + + auto& model = result.Payload().Model(); + tc.AssertEqual(1u, model.newsCount, "newsCount"); + tc.AssertEqual(kTestKey, model.news[0]->title, "news[0]->title"); + tc.AssertEqual(kTestVal, model.news[0]->body, "news[0]->body"); + tc.AssertEqual(kTestTime, model.news[0]->timestamp, "news[0]->timestamp"); + + return S_OK; + }) + .Finally([&](Result result) + { + tc.EndTest(std::move(result)); + }); +} + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerGetPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerGetTime(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerGetTitleData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerGetTitleInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerGetTitleNews(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerSetPublisherData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerSetTitleData(TestContext& tc) +{ + tc.Skip(); +} +#endif + +#if HC_PLATFORM != HC_PLATFORM_WIN32 && HC_PLATFORM != HC_PLATFORM_NINTENDO_SWITCH && HC_PLATFORM != HC_PLATFORM_GDK +void TitleDataManagementTests::TestServerSetTitleInternalData(TestContext& tc) +{ + tc.Skip(); +} +#endif + + +} +} diff --git a/Test/PlayFabServicesTestApp/Win32/MainWin32.cpp b/Test/PlayFabServicesTestApp/Win32/MainWin32.cpp new file mode 100644 index 0000000..075dba1 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Win32/MainWin32.cpp @@ -0,0 +1,21 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. + +#include "TestAppPch.h" +#include "TestRunner.h" + +// Win32 Entry Point +int main() +{ + PlayFab::Test::TestRunner testRunner; + THROW_IF_FAILED(testRunner.Initialize()); + + while (!testRunner.Update()) + { + Sleep(10); + } + + bool allTestsPassed = testRunner.Cleanup(); + + // Return 0 (success) if all tests passed. Otherwise, return 1 (error). + return allTestsPassed ? 0 : 1; +} diff --git a/Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj b/Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj new file mode 100644 index 0000000..858d78d --- /dev/null +++ b/Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj @@ -0,0 +1,30 @@ + + + + {09caf325-10e5-4da3-a2c0-88d26416a4b1} + Application + + + + + + + + + + Console + + + + + + + + + + true + Document + + + + \ No newline at end of file diff --git a/Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj.filters b/Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj.filters new file mode 100644 index 0000000..7a63d07 --- /dev/null +++ b/Test/PlayFabServicesTestApp/Win32/PlayFabServicesTestApp.Win32.vcxproj.filters @@ -0,0 +1,32 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {a2cff016-caec-4aaa-835b-5749d6073f98} + + + {8533575b-65c1-49c7-9e32-8b38b8097e49} + + + {27869c1f-60d1-4453-96c7-e6081363b7a8} + + + + + Source + + + Source\Platform\Windows + + + Source\Platform\Win32 + + + + + + \ No newline at end of file